Насколько я знаю, невозможно напрямую запустить процесс без повышенных прав (т.е. со стандартным токеном с низкими привилегиями) из процесса с повышенными правами. Это не предел PowerShell, а то, как работает UAC в Windows.
С http://msdn.microsoft.com/en-us/library/windows/desktop/bb756914.aspx:
Часто задаваемый вопрос - как запустить приложение без повышенных прав из процесса с повышенными правами, или, что более важно, как запустить процесс с использованием моего маркера без повышенных прав после запуска с повышенными правами. Поскольку прямого способа сделать это не существует, ситуацию обычно можно избежать, запустив исходное приложение от имени обычного пользователя и подняв только те части приложения, которые требуют административных прав. Таким образом, всегда есть процесс без повышенных прав, который можно использовать для запуска дополнительных приложений в качестве текущего пользователя настольного компьютера. Однако иногда процессу с повышенными правами нужно, чтобы другое приложение работало без повышенных прав. Это можно сделать с помощью планировщика задач в Windows Vista®. Процесс с повышенными правами может зарегистрировать задачу для выполнения в качестве текущего пользователя рабочего стола.
В этой статье упоминаются два возможных решения:
Запустите как можно большую часть сценария в режиме без повышенных прав и поднимите его только для тех частей, которые в этом нуждаются. Другими словами, убейте и перезапустите проводник в сценарии без повышенных прав и запустите второй сценарий в режиме повышенных прав для "выполнения действий":
Stop-Process -ProcessName explorer
Start-Process PowerShell.exe -Verb Runas -ArgumentList "-File path_to_script\script.ps1"
Start-Process explorer.exe
Глагол Runas
вызовет запуск второго процесса PowerShell в режиме повышенных прав. Однако это вызовет запрос UAC, поэтому, если этот сценарий будет запускаться полностью автоматически, это не очень хорошее решение.
Создайте запланированное задание для запуска проводника после выполнения повышенных операций, запустите задание и удалите его. Вы можете использовать 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