Недавно мой коллега Дмитрий с канала @winitpro_ru обновил свою классику блога про запуск проводника от имени администратора. В статье он объясняет, что это может пригодиться, например, для входа в пользовательские или системные папки без перманентного изменения списков контроля доступа (ACL).
Этот трюк в первую очередь ценен для корпоративных серверов. Дома-то можно и сторонний файловый менеджер с правами администратора запустить. Но любопытно же покопаться в вопросе!
[+] Сегодня в программе
История вопроса
Я интересуюсь этой темой ещё с завещания мистера Гейтса, написанного в 2011 году. Сейчас Дмитрий добавил в свою статью альтернативный метод, который появился уже во времена Windows 10.
Если завершить процесс
explorer
и сразу же запустить его с ключом/NoUACCheck
, проводник получит полные права.
Этот недокументированный ключ проводника означает «запускать без проверки контроля учетных записей». Впервые он всплыл в рамках запланированного задания CreateExplorerShellUnelevatedTask, которое автоматически создается (а также воссоздается и включается) при первой попытке запустить проводник с полными правами. Это с заметным опозданием разъяснил Рэймонд Чен.
Действительно, если в PowerShell от имени администратора выполнить kill -name explorer; explorer
, полноправного процесса не получится. Вместо него из планировщика запустится explorer /nouaccheck
. Экспортировав задание в XML, вы увидите, что в него заложен запуск с наименьшими доступными пользователю правами.
<Principal id="Author"> <UserId>S-1-5-21-1234567890-3333304218-166522979-1000</UserId> <LogonType>InteractiveToken</LogonType> <RunLevel>LeastPrivilege</RunLevel> </Principal>
Поскольку администратору выдается два токена (обычный и административный), запуск происходит с обычными правами. Однако, как выяснилось, этот ключ можно приспособить и для запуска с полными правами!
Запуск проводника с полными правами в Windows 10
В Windows 10 22H2 запустите PowerShell от имени администратора и выполните:
kill -name explorer; explorer /nouaccheck
Здесь kill — псевдоним командлета Stop-Process. Но учтите, что эта команда убивает процессы у всех пользователей. Чтобы прибить проводник только у себя, в PowerShell можно так:
Get-Process explorer -IncludeUserName | where UserName -match $ENV:USERNAME | Stop-Process explorer /nouaccheck
С утилитой taskkill команда будет покороче, но результат тот же — проводник запустится с правами администратора. Чтобы вернуть ему обычные права, завершите процесс и запустите explorer
без ключей. Это можно сделать в диспетчере задач и даже в той же консоли.
Отличия в Windows 11
В Windows 11 я этот метод не проверял. Увидев обновление в статье Дмитрия, я решил попробовать, и… способ не сработал у меня в боевой Windows 11 23H2. И в чистой виртуальной машине тоже!
Мы списались с Дмитрием, и в рамках мозгового штурма я отслеживал запуск процессов посредством аудита, а также их завершение с помощью gflags. Выяснились любопытные нюансы.
Последовательность "убил explorer — выполнил от админа с ключом /nouaccheck
" запускает цепочку действий под капотом. В игру вступают процессы wermgr
(Windows Error Reporting) и winlogon
. По ходу дела прибивается запущенный с полными правами процесс, а вместо него стартует новый — с обычными правами.
Детальный разбор ниже, но сразу скажу, что задание планировщика CreateExplorerShellUnelevatedTask здесь не участвует (возможно, потому что проводник уже запускается без проверки UAC).
В итоге различие между поведением Windows 10 и 11 свелось к значению параметра
AutoRestartShell
из раздела реестраHKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
.
По умолчанию оно равно 1
. В Windows 11 23H2 трюк работает, только если установить его равным 0
. То есть не перезапускать оболочку автоматически в случае ее закрытия. Иначе winlogon
всех побеждает и форсирует перезапуск с обычными правами.
Но даже с отключенным рестартом оболочки первый запуск
explorer /nouaccheck
не достигает цели. Его прибивают, поэтому приходится повторять команду. Второй процесс уже выживает.
Возможно, различие в поведении разных поколений ОС является следствием изменений оболочки в Windows 11 — там ведь другой Пуск и панель задач. Кстати, иногда наблюдается побочный эффект — не работает Пуск и поиск (Win + S), некоторые сочетания клавиш (Win + D).
Запуск проводника с полными правами в Windows 11
В сравнении с Windows 10 скрипт для Windows 11 труднее запомнить наизусть:
# https://www.outsidethebox.ms/22306/ # отключение перезапуска оболочки $path = 'HKLM:SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon' New-ItemProperty -Path $path -Name AutoRestartShell -Type Dword -Value 0 -Force | Out-Null # завершение процесса только у текущего пользователя # Stop-Process -Name explorer #на терминальных серверах убьет процесс у всех Get-Process explorer -IncludeUserName | where UserName -match $ENV:USERNAME | Stop-Process explorer /nouaccheck #будет убит Start-Sleep -Seconds 1 explorer /nouaccheck #останется с полными правами # включение перезапуска оболочки New-ItemProperty -Path $path -Name AutoRestartShell -Type Dword -Value 1 -Force | Out-Null # завершение процесса, и теперь сам перезапустится с обычными правами # Get-Process explorer -IncludeUserName | where UserName -match $ENV:USERNAME | Stop-Process
При таком раскладе для разовой задачи может быть проще обойтись блокнотом с правами админа.
Демо и разбор поведения в Windows 11
На видео этот же скрипт обставлен дополнительными проверками и выводом вспомогательных сообщений. Я также задействовал
- Сторонний скрипт для определения уровня целостности выполняющегося процесса. Фактически он дублирует столбцы Elevated в диспетчере задач и Integrity Level в Process Monitor.
- Мой скрипт для обработки событий аудита процессов. В событии 4688 тоже содержится информация о токене процесса (Token Elevation Type) и его уровне целостности (Mandatory Label).
Для начала я отключаю перезапуск оболочки, убиваю explorer и запускаю новый с ключом /nouaccheck
.
Setting AutoRestartShell = 0 AutoRestartShell : 0 Starting explorer elevated... Sunday, February 25, 2024 12:48:11 AM
Это порождает запуск двух процессов. Консольный вывод списка процессов во время этой операции не слишком точный, поэтому я опираюсь на видео и аудит.
EventTime : 2024-02-25T08:48:12.3249754Z NewProcessID : 8464 NewProcessName : C:\Windows\explorer.exe ParentProcessID : 7700 ParentProcessName : C:\Windows\explorer.exe EventTime : 2024-02-25T08:48:11.2992578Z NewProcessID : 7700 NewProcessName : C:\Windows\explorer.exe ParentProcessID : 3360 ParentProcessName : C:\Program Files\PowerShell\7\pwsh.exe
Из PowerShell выполняется ИД 7700, в свою очередь из под него запускается ИД 8464. На картинке запуск процесса с ИД 7700 в графическом интерфейсе журнале событий. Идентификаторы процессов выглядят недружелюбно, но в скрипте это легко обрабатывается — [int]$id
.
Тут же в дело вступает Windows Error Reporting, чей процесс wermgr.exe
запускается с помощью запланированного задания.
ProviderName: Microsoft-Windows-TaskScheduler TimeCreated Id LevelDisplayName Message ----------- -- ---------------- ------- 2/25/2024 12:48:13 AM 100 Information Task Scheduler started "{58c1e3bc- 9637-4830-b106-72d9 99259bc6}" instance of the "\M icrosoft\Windows\Wi ndows Error Reporti ng\QueueReporting" task for user "NT AUTHORITY\СИСТЕМА". 2/25/2024 12:48:13 AM 129 Information Task Scheduler launch task "\Micro soft\Windows\Window s Error Reporting\Q ueueReporting" , instance "%windir%\ system32\wermgr.exe " with process ID 1600.
В результате оба процесса explorer
завершаются. В скрипте я убеждаюсь в их отсутствии и снова запускаю проводник с полными правами, после чего проверяю его уровень целостности. Он высокий!
Title : Displaying Process/Primary Information ProcessName : explorer SessionId : 1 PID : 9132 TokenIntegrityLevel : HIGH_MANDATORY_LEVEL
Этому процессу соответствует запись аудита.
EventTime : 2024-02-25T08:48:16.3657996Z NewProcessID : 9132 NewProcessName : C:\Windows\explorer.exe ParentProcessID : 3360 ParentProcessName : C:\Program Files\PowerShell\7\pwsh.exe
Наконец, я возвращаю все на исходные позиции – восстанавливаю перезапуск оболочки и убиваю ее. В результате автоматически запускается процесс explorer
с обычными правами (средним уровнем целостности).
Setting AutoRestartShell = 1, killing explorer. Should auto-start non-elevated... Sunday, February 25, 2024 12:48:26 AM AutoRestartShell : 1 Title : Displaying Process/Primary Information ProcessName : explorer SessionId : 1 PID : 8580 TokenIntegrityLevel : MEDIUM_MANDATORY_LEVEL
В журнале аудита видно, что родительским процессом был winlogon
.
EventTime : 2024-02-25T08:48:26.4698992Z NewProcessID : 8580 NewProcessName : C:\Windows\explorer.exe ParentProcessID : 820 ParentProcessName : C:\Windows\System32\winlogon.exe
Конец!
Я благодарю за помощь в подготовке материала участников чата @winsiders — Nirai Charged Pulse и Андрея Шубина.
Lecron
Давно не было нужды, не знаю, работает ли сейчас, но раньше запускал с правами администратора консоль, а из нее проводник, который наследовал привилегии. Возможно доступ был не полный, но в папке Windows мог копаться без UAC.
Vadim Sterkin
Это было очень давно. Когда я писал завещание мистера Гейтса* 11 лет назад, это уже не работало. Тогда работало убийство проводника и запуск от админа с ключом /separate.
*Я думаю этот метод до сих пор работает, и он как раз без перезапуска проводника.