低い権限で PowerShell からエクスプローラーをロードする

低い権限で PowerShell からエクスプローラーをロードする

次のように動作する Powershell メンテナンス スクリプトがあります。

kill explorer
do things
restart explorer

このスクリプトは昇格モードで実行されますが、管理者権限なしでエクスプローラーを再起動する必要があります。何かアイデアはありますか?

ありがとう

答え1

私の知る限り、昇格されたプロセスから昇格されていないプロセス (つまり、標準の低権限トークンを使用) を直接起動することはできません。これは PowerShell の制限ではなく、Windows の UAC の仕組みです。

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

よく寄せられる質問は、昇格されたプロセスから昇格されていないアプリケーションを起動する方法、またはより根本的には、昇格された状態で実行しているときに昇格されていないトークンを使用してプロセスを起動する方法です。これを直接行う方法はないため、通常は、元のアプリケーションを標準ユーザーとして起動し、管理者権限が必要なアプリケーションの部分のみを昇格することで、この状況を回避できます。この方法により、現在ログオンしているデスクトップ ユーザーとして追加のアプリケーションを起動するために使用できる、昇格されていないプロセスが常に存在します。ただし、昇格されたプロセスで、別のアプリケーションを昇格されていない状態で実行する必要がある場合があります。これは、Windows Vista® 内のタスク スケジューラを使用して実現できます。昇格されたプロセスは、現在ログオンしているデスクトップ ユーザーとして実行するタスクを登録できます。

その記事では、2 つの解決策が挙げられています。

  1. できる限り多くのスクリプトを非昇格モードで実行し、必要な部分のみ昇格モードで実行します。つまり、非昇格スクリプトでエクスプローラーを終了して再起動し、2 番目のスクリプトを昇格モードで実行して「処理」を実行します。

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

    このRunas動詞により、2 番目の PowerShell プロセスが管理者モードで開始されます。ただし、これにより UAC プロンプトがトリガーされるため、このスクリプトを完全に自動化して実行する場合、これは適切な解決策ではありません。

  2. 昇格された操作が完了したときにエクスプローラーを起動するスケジュールされたタスクを作成し、タスクを実行して削除します。schtasks.exeこれをする:

    schtasks /Create /TN "foobar" /TR explorer.exe /SC OnLogon
    schtasks /Run /TN "foobar"
    schtasks /Delete /TN "foobar" /F
    

    他のタスクと競合しないタスク名を選択するようにしてください。

また、上記の 2 つの方法を組み合わせて、2 番目の PowerShell スクリプトを昇格モードで実行し、残りを非昇格モードで実行するスケジュールされたタスクを作成することもできます。これには、UAC プロンプトが生成されないという利点がありますが、スクリプトへの書き込みアクセス権を持つすべてのユーザーがコンピューターでほぼ何でも実行できるというセキュリティ リスクが生じます。ただし、現在のスクリプトをどのように実行し、昇格しているかによって、これは意味のない問題になる可能性があります。

3 番目のオプションは、スクリプトを自分だけが実行する場合、自分の資格情報を使用して新しい 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

思いつくのは、タスク スケジューラを使用してエクスプローラーを再起動することだけです。Start-process またはその他の方法で、昇格されたステータスが維持されるようです。

関連情報