PowerShellでもsuコマンド的なものが欲しかったので。
タスクバーを右クリックして「管理者として実行する」「ISE を管理者として実行する」と同じことをコマンドでもしたかったのです。
昇格したPowerShellコンソールとPowerShell ISEを起動させるファンクション
作ったファンクションはこんな感じです。
仕組み的にはsuとは完全に別物なのでエイリアスはelevate
にしています。
昇格したPowerShellコンソールおよびISEを起動させるファンクション
使い方
まずはこのファンクションをプロファイルにでも仕込んでおいてください。
そのうえでPowerShellコンソールかPowerShell ISEのコンソール上でelevate
とファンクションを実行すれば昇格ダイアログを出し新たに昇格したプロセスを起動します。
呼び出し元がPowerShellコンソールの場合はカレントパスを、PowerShell ISEの場合は開いているファイルを引き継いで新たなプロセスを起動します。
デフォルトでは呼び出し元のウィンドウは直ちに閉じますが-ExitCurrentProcess
パラメーターで呼び出し元のウィンドウを閉じない様にもできたりします。
昇格済みの場合にこのファンクションを呼ぶと以下の様に警告が出ます。
あと、-Credential
パラメーターで明示的に別ユーザーとしてプロセスを起動することも可能です。
このパラメーターの使いどころについては後述します。
やっていること
基本的にはpowershell.exe
またはpowershell_ise.exe
をStart-Process
コマンドレットで-Verb Runas
を指定して「管理者として実行」しているだけになります。
あとは呼び出し元のプロセスからパスや開いているファイルを引き継ぐ処理をちょろっと書いているくらいです。
Credentialパラメーターについて
最初にこのファンクションを作った時には-Credential
パラメーターは用意しませんでした。
ただこれだとUACが無効な環境やServer Coreな環境に対応できないので-Credential
パラメーターを追加することにしました。
たとえばServer Coreな環境でこのファンクションを単純に実行すると、
指定されたサービスはインストールされたサービスとして存在しません。
といった割と謎めいたメッセージを出して昇格に失敗します。
Server CoreではUACが使えなく、プロセスを-Verb Runas
で起動するために必要なApplication Information(AppInfo)サービス
がインストールすらされていないためこの様なメッセージが出てしまいます。
この様な環境では「管理者として実行する」ことは出来ず、資格情報を明示して「他のユーザーとして実行する」必要があります。
下図の様に資格情報を設定してやるとAdministratorとしてプロセスを起動することができ、結果的に昇格したのと同じ状態になります。
機能を追加してから気が付いたのですが、これくらいならrunas
コマンドで代用してもよかったのかもしれませんw
まあ、個人的には便利に使えているので良しとします。