2009-05-04 112 views
3

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

我有一些代码,做模拟ImpersonationHelper,并根据测试看来,使用Windows 2008系统的虚拟机,您可以成功使用LogonUser,并为用户获得成功的模拟会话。至少它适用于我的代码。我的代码也失败了旧版Windows系统的vms。 – 2012-04-25 23:38:08

回答

1

我以前也碰到这个,并且采用了两种不同soloution - 最简单的是使用第三方应用程序:TqcRunas:http://www.quimeras.com/Products/products.asp,让你打包需要creentials在加密文件。然而,如果密码被强制过期则会很痛苦。

,我已经使用了其他的解决办法是调用一个新的进程与其他凭据:

 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 
0

有了您的定义,我在代码通过网络进行身份验证使用

LogonUser(_username, _domainname, _password, LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_WINNT50, _tokenHandle) 

。我正在模拟远程盒子上的本地用户,就像你一样。但是,很久以前,我不记得使用这些值的理由。

+0

感谢您的回复!不幸的是,我尝试过这些值无济于事。必须有SOMETHING(可能小而愚蠢),我忽略了导致这种情况不起作用的某个地方 – Anders 2009-05-04 21:14:53

+0

我现在看到我误解了 - 它试图通过COM对象访问您遇到问题的数据。我还看到你已经提出了一个解决方法 - 并不理想,但正如你所说,因为模拟是在应用程序级别,所以要做到这一点。 – Don 2009-05-07 16:39:08

0

我做了类似的事情来映射网络驱动器在机器之间复制文件。我没有写代码,但它几乎和你的一样,除了两件事情:

  • 的模拟方法返回我关闭使用CloseHandle的例行两个标记后,在我离开我的冒领方法。

  • 在模仿者的顶部,首先发生的是对RevertToSelf的调用,可能是为了取消以前的任何模仿。

我不知道他们是否会有所作为,但值得一试。下面是相关声明:

Declare Auto Function CloseHandle Lib "kernel32.dll" (ByVal handle As IntPtr) As Long 
Declare Auto Function RevertToSelf Lib "advapi32.dll"() As Long 
相关问题