Подтвердить что ты не робот

Олицетворение Windows с С#

Как программа С#, работающая под управлением LocalSystem, временно олицетворяет идентификатор входа другого пользователя? Грубо говоря, у меня есть служба Windows, которую я бы хотел запустить как LocalSystem, но время от времени выдавал себя за пользователя XYZ (при подключении к db с использованием встроенной безопасности Windows).

Самое главное: есть ли способ сделать это, не зная пароля другого пользователя?

Примечание: если пароль является обязательным, существует рекомендуемая стратегия безопасного хранения пароля (С# и/или vbscript).

4b9b3361

Ответ 1

Возможно, хотя для этого требуется много кода. См. NtCreateToken и CreateToken. Вам нужно SeCreateTokenPrivilege, хотя это не будет проблемой, так как вы работаете под NT AUTHORITY\SYSTEM. Затем вы можете использовать созданный токен для олицетворения внутри потока.

Ответ 2

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

Чтобы олицетворять другого пользователя в вашем процессе, вы должны вызвать ImpersonateLoggedOnUser. ImpersonateLoggedOnUser требуется маркер маркера. Существует несколько способов получения маркера маркера:

  • войдя в систему как пользователь с LogonUser. Однако это требует от вас знать пароль пользователя.
  • путем дублирования существующего токена с CreateRestrictedToken, DuplicateToken или DuplicateTokenEx.
  • открыв токен из другого процесса или потока, который уже зарегистрирован как пользователь, с OpenProcessToken или OpenThreadToken

Ответ 3

Для части сохранения паролей вы можете сначала просмотреть этот вопрос.

Это был мой ответ:

Вы можете/должны использовать DPAPI, Защита данных API, который обеспечивает шифрование хранилища.
Это там только для этого типа проблемы.

Шифрование хранилища основано на:

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

Существует шоу dnrTV с Карлом Франклин, показывающее, что именно нужно для реализации этого и других функций шифрования.
Исходный код из шоу также доступен на странице.

Есть, конечно, много другие статьи по этому вопросу.