Windows 是否可以在VB.NET中复制以下凭证过程? 解决方案(有点):
事实证明,这种具有.NET安全性的模拟只允许应用程序级访问。由于COM对象处于系统级别,模拟用户仍然无法实例化它。我通过右键单击可执行文件并选择“运行方式…”解决了这个问题,程序运行良好。我发现它是通过系统访问启动程序的(假设运行它的用户具有这些凭据)。现在我正在创建一个外部程序,该程序将使用此方法启动此应用程序 谢谢你的提示:DWindows 是否可以在VB.NET中复制以下凭证过程? 解决方案(有点):,windows,vb.net,impersonation,comobject,Windows,Vb.net,Impersonation,Comobject,事实证明,这种具有.NET安全性的模拟只允许应用程序级访问。由于COM对象处于系统级别,模拟用户仍然无法实例化它。我通过右键单击可执行文件并选择“运行方式…”解决了这个问题,程序运行良好。我发现它是通过系统访问启动程序的(假设运行它的用户具有这些凭据)。现在我正在创建一个外部程序,该程序将使用此方法启动此应用程序 谢谢你的提示:D 我在虚拟机上安装了windows XP。它是我的域的一部分,但登录用户仅为本地用户。显然,如果我尝试访问网络共享,它将提示输入用户/密码: 我在虚拟机上测试的程
我在虚拟机上安装了windows XP。它是我的域的一部分,但登录用户仅为本地用户。显然,如果我尝试访问网络共享,它将提示输入用户/密码: 我在虚拟机上测试的程序使用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
我也尝试过向impersonator方法发送不同的标志,但似乎没有任何效果。以下是我发现的不同标志:
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
根据你的定义,我使用
LogonUser(_username, _domainname, _password, LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_WINNT50, _tokenHandle)
在我的代码中,通过网络进行身份验证。我正在远程框上模拟本地用户,就像您一样。但是,那是很久以前的事了,我不记得使用这些值的理由。我做了类似的事情来映射用于在机器之间复制文件的网络驱动器。我没有编写代码,但它与您的代码几乎相同,除了两件事:
- 在模拟方法返回后,我使用CloseHandle例程关闭两个令牌,然后退出模拟方法
- 在模拟程序的顶部,发生的第一件事是调用RevertToSelf,可能是为了取消以前的任何模拟
Declare Auto Function CloseHandle Lib "kernel32.dll" (ByVal handle As IntPtr) As Long
Declare Auto Function RevertToSelf Lib "advapi32.dll" () As Long
我以前遇到过这种情况,并使用了两种不同的解决方案-最简单的是使用第三方应用程序:TqcRunas:它允许您将所需的信条打包到加密文件中。但是,如果密码被迫过期,这是一种痛苦 我使用的另一种解决方案是使用替代凭据调用新流程:
Dim myProcessStartInfo As ProcessStartInfo = New ProcessStartInfo
With myProcessStartInfo
.FileName = "file path and name"
.Domain = "domainname"
.UserName = "username"
'password needs to be a SerureString
Using NewPassword As New Security.SecureString
With NewPassword
For Each c As Char In "password".ToCharArray
.AppendChar(c)
Next c
.MakeReadOnly()
End With
.Password = NewPassword.Copy
End Using
'UseShellExecute must be false for impersonated process
.UseShellExecute = False
End With
Using Process As New System.Diagnostics.Process
With Process
.StartInfo = myProcessStartInfo
.Start()
End With
End Using
谢谢你的回复!不幸的是,我尝试过这些值,但都没有用。一定有什么东西(可能是小而愚蠢的)是我忽略了的,这导致了它无法工作,我现在明白了,我误解了-正是在试图通过COM对象访问数据时,你遇到了问题。我还看到您提出了一个解决方案-不理想,但正如您所说,因为模拟是在应用程序级别进行的,所以有一种方法可以实现。这就是我最终使用的方法,尽管在您提出之前我已经实现了它。感谢您提供了准确的解决方案:)不适用于重定向IO和运行方式:我有进行模拟的代码,根据测试,使用Windows 2008系统的VM,您似乎可以成功使用LogonUser,并为用户获得成功的模拟会话。至少它适用于我的代码。对于旧windows系统的VM,我的代码也会失败。