Загрузите explorer из PowerShell с низкими привилегиями

Загрузите explorer из PowerShell с низкими привилегиями

У меня есть скрипт обслуживания 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®. Процесс с повышенными правами может зарегистрировать задачу для запуска как текущий вошедший в систему пользователь рабочего стола.

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

  1. Запустите как можно больше скриптов в неповышенном режиме и повышайте только те части, которым это нужно. Другими словами, завершите и перезапустите 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, поэтому если этот скрипт должен запускаться полностью автоматически, это не лучшее решение.

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

Связанный контент