我正在寻找一种使用C#代码启动/停止驻留在远程计算机中的Windows服务的方法,并找到了以下代码示例。这对我来说可以。它使用模拟技术编码,显然需要两台机器(假设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;
}
现在我需要知道以下问题的答案,如果有人能帮助我,我们将非常感激。
一般代码的解释。
为什么两台机器都必须拥有相同用户名+ passoword组合的用户帐户?
为什么两个用户帐户(管理员或非管理员)的权限无关?
提前谢谢。
答案 0 :(得分:2)
以下是对模仿的一般性解释:A .NET Developer's Guide to Windows Security: Understanding Impersonation
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及之前,如果我没记错的话)