Когда процесс повышен, как я могу получить идентификатор проверки подлинности 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 ответ
ОК, я наконец-то получил его на работу. Это шаги (не публикуя полный код, это довольно долго):
- Используйте WMI (ManagementObject) для класса win32_process + класс управляемого процесса рекурсивно для создания предка текущего процесса
- В моем конкретном случае я останавливаю алгоритм, когда нахожу процесс "проводник" или когда я получаю исключение, так как весьма вероятно, что проводник не повышен.
- P / Вызывает функцию OpenProcessToken из advapi32.dll в ProcessId, возвращаемом на шаге 2. Это дает вам userToken, который можно использовать для создания нового идентификатора Windows, который вы можете использовать на шаге 4
- Затем вы можете передать это свойство токена WindowsIdentity в GetTokenInformation, чтобы получить ваш AuthenticationID.
Это проверено и работает.
Ссылка:
- GetTokenInformation: Как получить SID входа в систему в C# (измените функцию на вызов TokenStatistics)
- Получить родительский процесс: http://bytes.com/topic/c-sharp/answers/255642-enumerataing-processes-c
- Получить WindowsIdentity процесса: http://dotbay.blogspot.fr/2009/06/finding-owner-of-process-in-c.html
Если вы видите какие-либо проблемы с этой процедурой, не стесняйтесь комментировать или опубликовать свой собственный ответ!
Примечание: существует проблема, если один из родительских процессов был убит: WMI даст вам идентификатор процесса, который больше не существует. Характер продукта, над которым я работаю, время от времени перезагружает проводник (только во время разработки), вот как я увидел проблему. Это не проблема для меня, но приятно знать.
Спасибо