解决方法(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