Возможно ли, чтобы служба Windows выдавала себя за пользователя без пароля? - PullRequest
6 голосов
/ 29 ноября 2011

Может ли служба Windows C #, работающая как локальная система или локальная служба, выдавать себя за другого пользователя без необходимости ввода пароля для этого пользователя ?

Как это будет сделано?

Примечание: Моя мотивация для этого заключается в том, чтобы иметь возможность запускать специфичные для пользователя запросы WMI в службе.Звонки WMI, которые я делаю (в API-интерфейс WMI OfflineFiles), чувствительны к пользователю, и они работают, только когда я запускаю свой сервис как пользователь, данные которого я хочу запросить.Я не хочу, чтобы пользователи вводили свои имена пользователей и пароли при установке службы, поэтому я хотел бы просто запустить службу как локальная система или что-то в этом роде и выдать себя за пользователя, о котором я забочусь.

Ответы [ 2 ]

7 голосов
/ 29 ноября 2011

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

  1. Найдите соответствующий сеанс пользователя с помощью EnumProcesses (например, http://msdn.microsoft.com/en-us/library/windows/desktop/ms682623(v=vs.85).aspx) [winapi]
  2. OpenProcessToken () для соответствующего пользовательского процесса [winapi]
  3. DuplicateToken () с привилегиями олицетворения [winapi]
  4. Создание нового WindowsIdentity () с использованием результата DuplicateToken
  5. Позвоните. Подражайте своей новой личности с шага 4

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

Очевидно, что API недокументированная функция Winapi ZwCreateToken может достичь этого, хотя и я, но я никогда не использовал его и может сломаться в любое время в будущем.

0 голосов
/ 29 ноября 2011

Насколько мне известно, это не может быть сделано по очевидным причинам безопасности. Вы должны иметь пароль для вызова LogonUser, а затем WindowsIdentity.Impersonate.

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

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