Я хочу получить дескриптор текущего сеанса входа в систему процессов, чьим родителем является explorer.exe.
Если мы запустим процесс в качестве администратора или службы, у него не будет сеанса входа в систему. Причина, по которой я хочу получить сеанс входа в систему, заключается в том, что у меня есть программа (.exe), которую я хочу ограничить открытием, когда пользователь пытается открыть ее через (щелчок правой кнопкой мыши на .exe -> запуск от имени администратора) и когда пользователь открывает его через администратора, у нас нет ассоциированного с ним сеанса входа в систему, тогда как когда пользователь открывает его двойным щелчком по нему, с ним связан сеанс входа в систему.
Я искал довольно много мест, но я просто получил процесс для получения SID входа в систему. Если кто-то хочет больше информации, вы можете скачать http://technet.microsoft.com/en-us/sysinternals/bb896653 и под проводником -> щелкните правой кнопкой мыши по любой выполняющейся программе -> безопасность. Здесь вы найдете сеанс входа в систему.
Вы можете получить сеанс входа в систему, связанный с процессом, используя OpenProcessToken
с последующим GetTokenInformation
с TokenStatistics
вариант. Однако это не разумный способ выяснить, был ли запущен процесс с использованием «запуска от имени администратора», потому что не существует простого способа определить, повышен ли уровень конкретного сеанса входа в систему или нет. Это неправда, что процесс, запущенный с «Запуск от имени администратора» не будет иметь сеанс входа в систему.
Чтобы узнать, был ли процесс «запущен от имени администратора», используйте TokenElevationType
вариант. Это должно вернуться TokenElevationTypeFull
если и только если был использован «запуск от имени администратора».
(Одно предостережение: я не уверен, что TokenElevationType
будет возвращаться, если пользователь без прав администратора использует «запуск от имени администратора», а затем вводит имя пользователя и пароль администратора. Вы должны проверить этот сценарий. Вы можете использовать TokenElevation
скорее, чем TokenElevationType
.)
Если вы действительно хотите знать, есть ли у процесса административные привилегии, вам следует использовать CheckTokenMembership
вместо. Ищите группу администраторов. Документация MSDN есть пример кода, который делает именно это.
Различие здесь в том, что вы хотите сделать, если UAC отключен (а пользователь является администратором) или если пользователь является локальным администратором. В этих случаях нет опции «запуск от имени администратора», все процессы запускаются с правами администратора автоматически. Если вы хотите обнаружить эти случаи, используйте CheckTokenMembership
, Если вы хотите обнаружить только те случаи, когда пользователь явно сказал «запускать как администратор», используйте TokenElevationType
,
Ты можешь позвонить GetCurrentProcess чтобы получить дескриптор текущего процесса, а затем использовать его для вызова OpenProcessToken иметь токен доступа для текущего процесса. Если у вас есть это, вы можете позвонить GetTokenInformation просить TokenSessionId.
Редактировать:
Я просто подумал о чем-то еще, что вы можете попробовать: вместо идентификатора сеанса вы можете запросить TokenOwner, и когда у вас есть это, у вас есть дескриптор безопасности. Вы можете позвонить LookupAccountSid чтобы получить имя учетной записи, связанной с дескриптором. Затем вы можете проверить это по «Администратор» или что-то подобное.