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

Мне нужно получить 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 ответ

Решение

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

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

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

Ссылка:

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


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

Спасибо

Другие вопросы по тегам