none
impersonateloggedonuser can't work on 2012R2 64bit environment RRS feed

  • 一般討論

  • 這是一個VB6.0開發的程式,原本運行在32bit的環境下是正常的。

    最近移植到64bit的環境後,就在這個轉換身分的地方出現問題。

    錯誤出現在這個 Function : ImpersonateLoggedOnUser

    問題1: 運行時會出現錯誤 91: Object variable or With block variable not set ,網路上有查說64Bit在宣告Function要用..

    Decalre PtrSafe Function .....

    可是因為環境是 VB6.0 並沒有升級到 VBA7 所以沒有 PtrSafe所以我也不確定是不是因為如此,不知道要如何宣告才可以讀取到呢?

    目前宣告方法如下..

    Public Declare Function ImpersonateLoggedOnUser Lib "advapi32.dll" (ByVal hToken As Long) As Long

    問題2:

    要如何讀取到經過 impersonateloggedonuser  轉換後的身分呢?

    假設我用A身份運行..

    中途經過轉換成變成B身份..

    我使用Environ("USERNAME") 讀取道都是一樣的身份..

    2017年8月11日 上午 06:04

所有回覆

  • 呼叫完impersonateloggedonuser函式應該還要再呼叫LogonUser函式, 才會有效果
    2017年8月11日 上午 11:21
  • 這條還沒呼叫完 就出錯了
    2017年8月11日 上午 11:52
  • PtrSafe 是 Office VBA 7.x 才有的,在 VB6 不須考慮此關鍵字。

    環境變數抓的是解譯 set 命令的內容,那個內容不會因為使用者模擬帳號而改變。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2017年8月11日 下午 04:46
  • 錯誤訊息是什麼?

    2017年8月12日 上午 01:00
  • 運行時會出現錯誤 91: Object variable or With block variable not set
    2017年8月14日 上午 12:26
  • 了解,那大概有什麼原因導致這原因嗎?

    這看起來像是 DLL沒被吃到?

    要怎麼寫才可以讀取模擬過後的NT帳號呢?

    2017年8月14日 上午 12:28
  • 這是物件變數沒有設定吧?


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2017年8月14日 下午 03:13
  • 從錯誤訊息來看, 有可能還沒有執行到呼叫impersonateloggedonuser函式就出錯了
    2017年8月15日 上午 12:30
  • 應該是這條出錯

    我在每執行一條程式碼就輸出一次LOG 這行程式碼之前的LOG都有輸出

    2017年8月15日 上午 01:55
  • 應該是的,不過因為程式是在32Bit的環境下運行都是正常的。

    改到64Bit卻無法執行那段,Google後別的網友是說使用PtrSafe可是 VB6沒有這個屬性...

    2017年8月15日 上午 02:00
  • 如果是換到64bit的環境才發生錯誤, 大概就是載入錯誤的DLL了

    在C:\Windows\System32資料夾中的Advapi32.dll是64元的版本

    在C:\Windows\SysWOW64資料夾中的Advapi32.dll是32元的版本

    VB6的程式應該要載入第二個檔案而不是第一個

    2017年8月15日 上午 07:13
  • 我有試過這樣寫..

    Public Declare Function ImpersonateLoggedOnUser Lib "C:\Windows\SysWOW64\advapi32.dll" (ByVal hToken As Long) As Long

    不過還是一樣沒吃到

    2017年8月15日 上午 08:55
  • Win64 會自動映射 win32 的系統檔,不強制指定路徑才是對的。

    不確定的情況下,可以考慮先關 DEP 再看看。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2017年8月15日 上午 11:40
  • 可能沒辦法關閉DEP...

    可是不強制指定路徑 怎麼知道他吃的是哪個DLL? (或許他根本沒吃到?)

    2017年8月16日 上午 12:42
  • 不好意思 我的帳號遲遲未通過驗證,還不能發URL

    我在StackOverFlow也有發文章,裡面有提到我的程式碼..

    https://stackoverflow.com/questions/37945586/vb-code-using-advapi32-dll-cryptverifysignature-works-on-vista-sp2-not-on-window

    我的程式碼來源是...參數錯的可能性應該不大

    https://support.microsoft.com/zh-tw/help/248187/how-to-impersonate-a-user-from-active-server-pages
    2017年8月16日 上午 02:07
  • 你貼出來的程式碼包含  Err.LastDllError ,但你貼的錯誤訊息是 VB6 的,顯然沒辦法確認 dll 呼叫哪裡錯誤。

    T.L. Cheng

    2017年8月20日 上午 05:02
    版主