1

我正在寻找一种使用 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;
    }

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

  1. 对代码的一般解释。

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

  3. 为什么两个用户帐户(管理员或非管理员)的权限无关紧要?

先感谢您。

4

1 回答 1

2

这是对模拟的一个很好的一般解释:Windows 安全的 .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 及更早版本)

于 2010-12-09T07:25:28.820 回答