Когда процесс повышен, как я могу получить идентификатор проверки подлинности Windows для сеанса без повышенных прав? - PullRequest
1 голос
/ 26 марта 2012

Мне нужно получить AuthenticationID, возвращаемый GetTokenInformation с классом TokenStatistics для пользователя, который вошел на станцию ​​независимо от того, поднялся я или нет.

Позвольте мне дать вам больше информации. Предположим, я делаю:

var Result = GetTokenInformation(WindowsIdentity.GetCurrent().Token, TOKEN_INFORMATION_CLASS.TokenStatistics, TokenInformation, TokenInfLength, out TokenInfLength);

Это позволит мне без проблем получить AuthenticationID из структуры TokenInformation. Допустим, полученный идентификатор аутентификации равен «00000000-00001234»

Теперь, если я щелкните правой кнопкой мыши Visual Studio и выберите «Запуск от имени администратора», запустите мой код еще раз, в результате получится что-то другое, например, «00000000-00001289». Но мне нужно "00000000-00001234"

Как я могу получить "00000000-00001234" независимо от того, повышен ли текущий процесс или нет?

Полагаю, дело только в том, чтобы найти правильный токен, который нужно передать GetTokenInformation, но я бегу кругами ...

Примечание: я основал свой код на Как получить SID для входа в C # для реализации GetTokenInformation, а затем адаптировал его для возможности получения TokenStatistics.

1 Ответ

3 голосов
/ 02 апреля 2012

ОК, я наконец-то получил его на работу. Вот шаги (не публикуя полный код, он довольно длинный):

  1. Используйте WMI (ManagementObject) для класса win32_process + класс управляемого процесса рекурсивно для создания текущего процесса 'родословная *
  2. В моем конкретном случае я останавливаю алгоритм, когда нахожу процесс "проводник" или когда я получаю исключение, так как весьма вероятно, что проводник не повышен.
  3. P / Вызывает функцию OpenProcessToken из advapi32.dll в ProcessId, возвращаемом на шаге 2. Это дает вам userToken, который можно использовать для создания нового идентификатора Windows, который вы можете использовать на шаге 4
  4. Затем вы можете передать это свойство токена WindowsIdentity GetTokenInformation для получения вашего AuthenticationID.

Это проверено и работает.

Ссылка:

Если вы видите какие-либо проблемы с этой процедурой, не стесняйтесь комментировать или опубликовать свой собственный ответ!


Примечание: существует проблема, если один из родительских процессов был уничтожен: WMI даст вам идентификатор процесса, который больше не существует. Характер продукта, над которым я работаю, время от времени перезагружал проводник (только во время разработки), вот как я увидел проблему. Для меня это не проблема, но приятно знать.

Спасибо

...