Олицетворение Windows с С#
Как программа С#, работающая под управлением LocalSystem, временно олицетворяет идентификатор входа другого пользователя? Грубо говоря, у меня есть служба Windows, которую я бы хотел запустить как LocalSystem, но время от времени выдавал себя за пользователя XYZ (при подключении к db с использованием встроенной безопасности Windows).
Самое главное: есть ли способ сделать это, не зная пароля другого пользователя?
Примечание: если пароль является обязательным, существует рекомендуемая стратегия безопасного хранения пароля (С# и/или vbscript).
Ответы
Ответ 1
Возможно, хотя для этого требуется много кода. См. NtCreateToken и CreateToken. Вам нужно SeCreateTokenPrivilege, хотя это не будет проблемой, так как вы работаете под NT AUTHORITY\SYSTEM. Затем вы можете использовать созданный токен для олицетворения внутри потока.
Ответ 2
Короткий ответ: вы не можете без пароля пользователя или пользователя, вызывающего вашу службу через COM.
Чтобы олицетворять другого пользователя в вашем процессе, вы должны вызвать ImpersonateLoggedOnUser
. ImpersonateLoggedOnUser
требуется маркер маркера. Существует несколько способов получения маркера маркера:
Ответ 3
Для части сохранения паролей вы можете сначала просмотреть этот вопрос.
Это был мой ответ:
Вы можете/должны использовать DPAPI, Защита данных API, который обеспечивает шифрование хранилища.
Это там только для этого типа проблемы.
Шифрование хранилища основано на:
- учетная запись пользователя, поэтому доступ к данным может получить только пользователь, зарегистрированный в системе. Это позволяет передавать данные на другой компьютер с одинаковыми учетными данными пользователя.
- машина, делая данные доступными только на этой конкретной машине и не переносятся на другой компьютер.
Существует шоу dnrTV с Карлом Франклин, показывающее, что именно нужно для реализации этого и других функций шифрования.
Исходный код из шоу также доступен на странице.
Есть, конечно, много другие статьи по этому вопросу.