Как олицетворение пользователя с NEW_CREDENTIALS работает в C#?

Я работаю над системой, в которой различные службы Windows работают на разных компьютерах в частной сети. На любом из компьютеров в сети могут быть запущены клиентские приложения, взаимодействующие с этими службами удаленно. В рамках нашего пакета у нас есть функциональные возможности, которые позволяют пользователям видеть, возникают ли проблемы с какими-либо службами в сети, и перезапускать любые из них, которые отключены.

Чтобы заставить это работать, мы использовали имперсонацию пользователя и класс Service Controller: мы просим пользователей предоставить имя пользователя и пароль учетной записи администратора на компьютере, на котором размещена отключенная служба, выдайте себя за этого администратора, а затем перезапустите службу с помощью ServiceController. Это работает в большинстве ситуаций, но мы не можем выдавать себя за администраторов на некоторых наших серверах. Насколько я понимаю, для работы олицетворения пользователя олицетворяемые учетные записи должны находиться на локальном компьютере или входить в группу Active Directory, но рассматриваемые серверы имеют только локальные учетные записи для себя.

Я заметил, что у метода LogonUser, который запускает олицетворение, есть много параметров, и начал играть с ними, чтобы посмотреть, решит ли какой-нибудь из них мою проблему. Когда я попытался установить для параметра LogonType значение «Новые учетные данные» (9), я увидел странное (но потенциально полезное) поведение:

  • Я могу перезапустить службы на серверах, с которыми раньше не мог работать
  • Если я попытаюсь перезапустить отключенную службу и укажу неверный пароль, служба все равно будет перезапущена.

Почему я вижу такое поведение? Если причины для этого веские, я мог бы использовать эту настройку, чтобы полностью избавиться от запроса пользователей на вход в систему.


person Kevin    schedule 31.07.2012    source источник


Ответы (1)


Я понял, что происходит:

Согласно Получение текущего имени пользователя при олицетворении, при использовании олицетворения с типом входа новых учетных данных олицетворяемый поток продолжает действовать как первоначальный пользователь для всех команд, отправляемых на локальный компьютер. Он действует как олицетворенный пользователь только тогда, когда отправляет команды на другие компьютеры.

Вот почему я заметил, что мне не нужно вводить правильный пароль: если у меня есть отключенный пользователь на сервере, а затем я запускаю клиентское приложение от имени администратора на этом сервере и пытаюсь его перезапустить, то он не работает. Неважно, какие учетные данные я предоставляю. Олицетворенный поток продолжит использовать учетную запись администратора, поскольку перезапуск службы предполагает взаимодействие только с локальным компьютером. Новые учетные данные, которые я ввел, фактически игнорируются.

Кстати, это означает, что я смогу ввести неправильное имя пользователя и пароль только при попытке перезапустить службу на локальном компьютере. Когда я проверил это еще немного, это то, что я заметил.

Вот почему казалось, что мне не нужно беспокоиться о том, какой пароль я ввожу. Как насчет того, как я получил доступ к компьютерам, у которых не было учетных записей в группе Active Directory? Согласно этой статье, "NewCredentials LogonType [...] выполняет междоменную аутентификацию". Я не совсем уверен, что происходит, но похоже, что новые учетные данные вообще не пытаются аутентифицироваться в Active Directory. Я предполагаю, что он отправляет олицетворенные учетные данные прямо на компьютер, к которому осуществляется доступ, что позволяет олицетворять локальные учетные записи.

Для проекта, над которым я работал, это означает, что мне по-прежнему приходится запрашивать у пользователей учетные данные, когда они пытаются перезапустить службы, но теперь они могут перезапускать службы на любом сервере, даже если он не настроен для учетной записи Active Directory.

person Kevin    schedule 31.07.2012
comment
Может ли кто-нибудь перепроверить для меня, что это то, что на самом деле происходит? Я знаю, что могут быть некоторые проблемы с безопасностью, поскольку я использую олицетворение, поэтому, если я действительно не понимаю ситуацию, я не хочу навлекать на себя проблемы: P - person Kevin; 31.07.2012
comment
Очень сложно найти какую-либо достойную информацию об использовании NewCredentials, но один из вариантов использования, по-видимому, похож на runas /netonly /user:REMOTE\user "C:\Program Files (x86)\Microsoft SQL Server\140\Tools\Binn\ManagementStudio\Ssms.exe", который позволяет вам войти в систему с проверкой подлинности Windows в удаленном домене из вашего локального домена. Причудливый... - person Grimace of Despair; 03.10.2018