Олицетворение Windows от C # - PullRequest
       35

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

29 голосов
/ 18 февраля 2009

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

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

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

Ответы [ 3 ]

18 голосов
/ 22 февраля 2009

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

11 голосов
/ 18 февраля 2009

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

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

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

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

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

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

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

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

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

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

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