解決方法(kinda):
原來,這種模擬與.NET的安全性只允許應用程序級訪問。由於COM對象處於系統級別,因此模擬的用戶仍然無法實例化它。我想通過右鍵單擊可執行文件並選擇「運行爲...」,程序運行正常。我發現啓動了系統訪問程序(假設你正在運行它的用戶擁有這些憑據)。現在我正在創建一個外部程序,它將使用此方法啓動此應用程序。是否有可能在VB.NET中複製以下憑據進程?
感謝您的提示:d
我有一個虛擬機上的Windows XP安裝。它是我的域的一部分,但登錄的用戶只是本地用戶。顯然,如果我嘗試訪問網絡共享它會提示輸入用戶名/密碼:
alt text http://i40.tinypic.com/wchl5l.jpg
我在虛擬機上測試了該程序使用的COM對象從另一個程序數據的接口。如果我不模仿,我會得到錯誤,因爲我沒有正確的憑據。
我對這件事做了一些研究,發現一些網站上有一個體面的VB.NET信息。我使用我編寫的代碼的問題是我可以訪問網絡資源,但我無法實例化COM對象。
如果我在嘗試實例化它之前填寫並提交證書提示(上面),它工作正常。這導致我相信WinXP證書提示所做的一定是我不知道的。下面是我用於模擬的代碼:
Public Sub BeginImpersonation()
Const LOGON32_PROVIDER_DEFAULT As Integer = 0
Const LOGON32_LOGON_INTERACTIVE As Integer = 2
Const SecurityImpersonation As Integer = 2
Dim win32ErrorNumber As Integer
_tokenHandle = IntPtr.Zero
_dupeTokenHandle = IntPtr.Zero
If Not LogonUser(_username, _domainname, _password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, _tokenHandle) Then
win32ErrorNumber = System.Runtime.InteropServices.Marshal.GetLastWin32Error()
Throw New ImpersonationException(win32ErrorNumber, GetErrorMessage(win32ErrorNumber), _username, _domainname)
End If
If Not DuplicateToken(_tokenHandle, SecurityImpersonation, _dupeTokenHandle) Then
win32ErrorNumber = System.Runtime.InteropServices.Marshal.GetLastWin32Error()
CloseHandle(_tokenHandle)
Throw New ImpersonationException(win32ErrorNumber, "Unable to duplicate token!", _username, _domainname)
End If
Dim newId As New System.Security.Principal.WindowsIdentity(_dupeTokenHandle)
_impersonatedUser = newId.Impersonate()
_impersonating = True
End Sub
我也嘗試向模擬方法發送不同的標誌,但似乎沒有任何工作。這裏有不同的標誌,我發現:
Enum LOGON32_LOGON
INTERACTIVE = 2
NETWORK = 3
BATCH = 4
SERVICE = 5
UNLOCK = 7
NETWORK_CLEARTEXT = 8
NEW_CREDENTIALS = 9
End Enum
Enum LOGON32_PROVIDER
[DEFAULT] = 0
WINNT35 = 1
WINNT40 = 2
WINNT50 = 3
End Enum
Enum SECURITY_LEVEL
Anonymous = 0
Identification = 1
Impersonation = 2
Delegation = 3
End Enum
我有一些代碼,做模擬ImpersonationHelper,並根據測試看來,使用Windows 2008系統的虛擬機,您可以成功使用LogonUser,併爲用戶獲得成功的模擬會話。至少它適用於我的代碼。我的代碼也失敗了舊版Windows系統的vms。 – 2012-04-25 23:38:08