しばたテックブログ

PowerShellを中心に気分で書いている技術ブログです。

昇格したPowerShellコンソールおよびPowerShell ISEを起動させるファンクションを書きました

PowerShellでもsuコマンド的なものが欲しかったので。

f:id:stknohg:20160121211308p:plain

タスクバーを右クリックして「管理者として実行する」「ISE を管理者として実行する」と同じことをコマンドでもしたかったのです。

昇格したPowerShellコンソールとPowerShell ISEを起動させるファンクション

作ったファンクションはこんな感じです。
仕組み的にはsuとは完全に別物なのでエイリアスelevateにしています。

昇格したPowerShellコンソールおよびISEを起動させるファンクション

使い方

まずはこのファンクションをプロファイルにでも仕込んでおいてください。

そのうえでPowerShellコンソールかPowerShell ISEのコンソール上でelevateとファンクションを実行すれば昇格ダイアログを出し新たに昇格したプロセスを起動します。

f:id:stknohg:20160121210314p:plain

f:id:stknohg:20160121210342p:plain

f:id:stknohg:20160121210401p:plain

呼び出し元がPowerShellコンソールの場合はカレントパスを、PowerShell ISEの場合は開いているファイルを引き継いで新たなプロセスを起動します。

デフォルトでは呼び出し元のウィンドウは直ちに閉じますが-ExitCurrentProcessパラメーターで呼び出し元のウィンドウを閉じない様にもできたりします。

昇格済みの場合にこのファンクションを呼ぶと以下の様に警告が出ます。

f:id:stknohg:20160121211155p:plain

あと、-Credentialパラメーターで明示的に別ユーザーとしてプロセスを起動することも可能です。
このパラメーターの使いどころについては後述します。

やっていること

基本的にはpowershell.exeまたはpowershell_ise.exeStart-Processコマンドレットで-Verb Runasを指定して「管理者として実行」しているだけになります。
あとは呼び出し元のプロセスからパスや開いているファイルを引き継ぐ処理をちょろっと書いているくらいです。

Credentialパラメーターについて

最初にこのファンクションを作った時には-Credentialパラメーターは用意しませんでした。
ただこれだとUACが無効な環境やServer Coreな環境に対応できないので-Credentialパラメーターを追加することにしました。

たとえばServer Coreな環境でこのファンクションを単純に実行すると、

f:id:stknohg:20160121211915p:plain

指定されたサービスはインストールされたサービスとして存在しません。

といった割と謎めいたメッセージを出して昇格に失敗します。
Server CoreではUACが使えなく、プロセスを-Verb Runasで起動するために必要なApplication Information(AppInfo)サービスがインストールすらされていないためこの様なメッセージが出てしまいます。

この様な環境では「管理者として実行する」ことは出来ず、資格情報を明示して「他のユーザーとして実行する」必要があります。

下図の様に資格情報を設定してやるとAdministratorとしてプロセスを起動することができ、結果的に昇格したのと同じ状態になります。

f:id:stknohg:20160121213143p:plain

f:id:stknohg:20160121213153p:plain

機能を追加してから気が付いたのですが、これくらいならrunasコマンドで代用してもよかったのかもしれませんw
まあ、個人的には便利に使えているので良しとします。