У меня есть скрипт обслуживания Powershell, который работает следующим образом:
kill explorer
do things
restart explorer
Этот скрипт выполняется в повышенном режиме, но мне нужно будет перезапустить explorer без прав администратора. Есть идеи?
Спасибо
решение1
Насколько мне известно, невозможно напрямую запустить не-повышенный процесс (т. е. со стандартным токеном с низкими привилегиями) из повышенного процесса. Это не ограничение PowerShell, это то, как работает UAC в Windows.
Отhttp://msdn.microsoft.com/en-us/library/windows/desktop/bb756914.aspx:
Часто задаваемый вопрос — как запустить не-повышенное приложение из процесса с повышенными правами или, что более фундаментально, как запустить процесс с использованием моего не-повышенного токена, когда я работаю с повышенными правами. Поскольку прямого способа сделать это нет, ситуации обычно можно избежать, запустив исходное приложение как обычный пользователь и повысив только те части приложения, которые требуют административных прав. Таким образом, всегда есть не-повышенный процесс, который можно использовать для запуска дополнительных приложений как текущий вошедший в систему пользователь рабочего стола. Однако иногда процессу с повышенными правами необходимо запустить другое приложение с пониженными правами. Это можно сделать с помощью планировщика задач в Windows Vista®. Процесс с повышенными правами может зарегистрировать задачу для запуска как текущий вошедший в систему пользователь рабочего стола.
В этой статье упоминаются два возможных решения:
Запустите как можно больше скриптов в неповышенном режиме и повышайте только те части, которым это нужно. Другими словами, завершите и перезапустите explorer в неповышенном сценарии и запустите второй скрипт в повышенном режиме, чтобы «сделать что-то»:
Stop-Process -ProcessName explorer Start-Process PowerShell.exe -Verb Runas -ArgumentList "-File path_to_script\script.ps1" Start-Process explorer.exe
Этот
Runas
глагол запустит второй процесс PowerShell в повышенном режиме. Однако это вызовет запрос UAC, поэтому если этот скрипт должен запускаться полностью автоматически, это не лучшее решение.Создайте запланированную задачу для запуска explorer после завершения повышенных операций, запустите задачу и удалите ее. Вы можете использовать
schtasks.exe
сделать это:schtasks /Create /TN "foobar" /TR explorer.exe /SC OnLogon schtasks /Run /TN "foobar" schtasks /Delete /TN "foobar" /F
Просто убедитесь, что вы выбрали такое название для задачи, которое не будет конфликтовать с другими.
Вы также можете объединить два вышеприведенных метода, чтобы создать запланированную задачу для запуска второго скрипта PowerShell в повышенном режиме, а остальных — без повышенных. Это имеет преимущество в том, что не создает запрос UAC, но вносит риск безопасности, так как любой, у кого есть доступ на запись в скрипт, может сделать на вашем компьютере практически все, что угодно. Однако в зависимости от того, как именно вы запускаете и повышаете свой текущий скрипт, это может быть спорным вопросом.
Третий вариант, если ваш скрипт запускаете только вы, — настроить его на запуск нового процесса explorer.exe с вашими учетными данными:
$Cred = New-Object System.Management.Automation.PSCredential -ArgumentList @("username", (ConvertTo-SecureString -String "password" -AsPlainText -Force))
Start-Process explorer.exe -Credential $Cred
Недостатком здесь является то, что ваш пароль хранится в скрипте в виде обычного текста. Вы также можете сохранить его в отдельном файле в зашифрованном виде, введя следующее в командную строку PowerShell:
Read-Host -AsSecureString | ConvertFrom-SecureString | Out-File C:\pw_encrypted.txt
Затем введите свой пароль (он будет показан в виде звездочек в приглашении PS) и нажмите Enter. Теперь вы можете использовать его в своем скрипте следующим образом:
$Cred = New-Object System.Management.Automation.PSCredential -ArgumentList @("username", (Get-Content C:\pw_encrypted.txt | ConvertTo-SecureString))
Start-Process explorer.exe -Credential $Cred
решение2
Единственное, что приходит на ум, это использовать планировщик задач для перезапуска explorer. Start-process или любой другой метод, похоже, сохраняет повышенный статус.