帮助理解模仿

我正在寻找一种方法来使用C#代码启动/停止驻留在远程计算机上的Windows服务,并find以下代码示例。 这对我来说可以。 它使用模拟技术进行编码,这显然需要两台机器(比如说A和B)都有一个具有相同用户名+密码组合的用户帐户。

int LOGON32_LOGON_INTERACTIVE = 2; int LOGON32_PROVIDER_DEFAULT = 0; private bool impersonateValidUser(String userName, String machineName, String passWord) { WindowsIdentity tempWindowsIdentity; IntPtr token = IntPtr.Zero; IntPtr tokenDuplicate = IntPtr.Zero; if (RevertToSelf()) { if (LogonUserA(userName, machineName, passWord, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref token) != 0) { if (DuplicateToken(token, 2, ref tokenDuplicate) != 0) { tempWindowsIdentity = new WindowsIdentity(tokenDuplicate); impersonationContext = tempWindowsIdentity.Impersonate(); if (impersonationContext != null) { CloseHandle(token); CloseHandle(tokenDuplicate); return true; } } } } if (token != IntPtr.Zero) { CloseHandle(token); } if (tokenDuplicate != IntPtr.Zero) { CloseHandle(tokenDuplicate); } return false; } 

现在我需要知道以下问题的答案,所以如果有人能帮助我,我将非常感激。

  1. 一般的代码解释。

  2. 为什么两台机器都必须拥有相同的用户名+密码组合的用户帐户?

  3. 为什么这两个用户帐户(pipe理员或非pipe理员)的权限是不相关的?

先谢谢你。

下面是对模拟的一个很好的一般性解释: .NET安全性开发人员指南:了解模拟

1)代码所做的是“以用户身份登录”。 这里的中央API是LogonUser(本机调用)和Impersonate()(.NET),这些文档记录在这里: http : //msdn.microsoft.com/en-us/library/aa378184 (VS.85) .aspx这里: http : //msdn.microsoft.com/en-us/library/w070t6ka.aspx

其余的或多或少需要管道。

2)这是没有必要的,但我想这就是你的基础设施选择什么,因为机器可能不在同一个帐户域,或根本没有帐户域。 在这种情况下,相同的帐户名+密码是一个古老的技巧。 如果机器在同一个Windows域(AD)中,则不需要。

3)模仿不需要管理员权限(只有在Windows 2000和以前,如果我没有记错的话)