回答:
私の知る限りでは、昇格されたプロセスから昇格されていないプロセス(つまり、標準的な低特権のトークンを使用)を直接起動することは不可能です。これはPowerShellの制限ではありません。WindowsのUACはどのように機能しますか。
から http://msdn.microsoft.com/en-us/library/windows/desktop/bb756914.aspx :
よくある質問は、昇格したプロセスから昇格していないアプリケーションを起動する方法、より基本的には、昇格した後に昇格していないトークンを使用してプロセスを起動する方法です。これを行う直接的な方法はないため、通常は元のアプリケーションを標準ユーザーとして起動し、アプリケーションの管理権限を必要とする部分のみを昇格させることで回避できます。この方法では、現在ログオンしているデスクトップユーザーとして追加のアプリケーションを起動するために使用できる昇格されていないプロセスが常に存在します。ただし、時々、昇格したプロセスで別のアプリケーションを昇格しないように実行する必要があります。これは、WindowsVista®内のタスクスケジューラを使用して実現できます。昇格したプロセスは、現在ログオンしているデスクトップユーザーとして実行するタスクを登録できます。
その記事は2つの可能な解決策を述べます:
できるだけ多くのスクリプトを非昇格モードで実行し、必要な部分だけを昇格させます。つまり、昇格されていないスクリプトでエクスプローラを強制終了して再起動し、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プロンプトが表示されるため、このスクリプトを完全に自動化して実行する場合、これは適切な解決策ではありません。
昇格操作が完了したらエクスプローラを起動するスケジュールタスクを作成し、タスクを実行して削除します。あなたが使用することができます 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
頭に浮かぶのはタスクスケジューラを使ってエクスプローラを再起動することだけです。開始プロセスまたはその他の方法で昇格状態が維持されているようです。