2

У меня есть сценарий управления Powershell, который работает следующим образом:

kill explorer
do things
restart explorer

Этот скрипт выполняется в режиме с повышенными правами, но мне нужно будет перезапустить проводник без прав администратора. Любая идея?

Спасибо

2 ответа2

6

Насколько я знаю, невозможно напрямую запустить процесс без повышенных прав (т.е. со стандартным токеном с низкими привилегиями) из процесса с повышенными правами. Это не предел PowerShell, а то, как работает UAC в Windows.

С http://msdn.microsoft.com/en-us/library/windows/desktop/bb756914.aspx:

Часто задаваемый вопрос - как запустить приложение без повышенных прав из процесса с повышенными правами, или, что более важно, как запустить процесс с использованием моего маркера без повышенных прав после запуска с повышенными правами. Поскольку прямого способа сделать это не существует, ситуацию обычно можно избежать, запустив исходное приложение от имени обычного пользователя и подняв только те части приложения, которые требуют административных прав. Таким образом, всегда есть процесс без повышенных прав, который можно использовать для запуска дополнительных приложений в качестве текущего пользователя настольного компьютера. Однако иногда процессу с повышенными правами нужно, чтобы другое приложение работало без повышенных прав. Это можно сделать с помощью планировщика задач в Windows Vista®. Процесс с повышенными правами может зарегистрировать задачу для выполнения в качестве текущего пользователя рабочего стола.

В этой статье упоминаются два возможных решения:

  1. Запустите как можно большую часть сценария в режиме без повышенных прав и поднимите его только для тех частей, которые в этом нуждаются. Другими словами, убейте и перезапустите проводник в сценарии без повышенных прав и запустите второй сценарий в режиме повышенных прав для "выполнения действий":

    Stop-Process -ProcessName explorer
    Start-Process PowerShell.exe -Verb Runas -ArgumentList "-File path_to_script\script.ps1"
    Start-Process explorer.exe
    

    Глагол Runas вызовет запуск второго процесса PowerShell в режиме повышенных прав. Однако это вызовет запрос UAC, поэтому, если этот сценарий будет запускаться полностью автоматически, это не очень хорошее решение.

  2. Создайте запланированное задание для запуска проводника после выполнения повышенных операций, запустите задание и удалите его. Вы можете использовать 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
1

Единственное, что приходит на ум, - это использовать планировщик задач для перезапуска проводника. Запуск-процесс или любой другой метод, кажется, поддерживает повышенный статус.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .