Помогите понять олицетворение - PullRequest
1 голос
/ 09 декабря 2010

Я искал способ запуска / остановки служб Windows, находящихся на удаленной машине, с использованием кода C #, и нашел следующий пример кода. Он отлично работает для меня. Он закодирован с использованием техники олицетворения, которая, очевидно, требует, чтобы обе машины (скажем, 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. Почему привилегии двух учетных записей пользователей (администратора или не администратора) не имеют значения?

Заранее спасибо.

1 Ответ

2 голосов
/ 09 декабря 2010

Вот хорошее общее объяснение олицетворения: Руководство разработчика .NET по безопасности Windows: понимание олицетворения

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 и ранее, если я правильно помню)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...