【PowerShell】PowerShellを管理者権限で実行したい!ソースの先頭に埋め込むだけで自動で管理者権限に昇格するスクリプト!

Windows

こんにちは!今回はPowerShellのソースの先頭にコピーしたコードを埋め込むだけで、「管理者権限として実行」できるパワーシェルのスクリプトを作成する方法を紹介します!

普通に右クリックして「PowerShellを実行」してもパワーシェルスクリプト(.ps1)は管理者権限では実行されません。ですが、今回の方法を取り込むことでどんな起動方法でも必ず「管理者権限として実行」できるようになります。

管理者権限が必要になるような操作をするPowerShellプログラムを作りたいときや、他人へ「.ps1」ファイルを配布して実行してもらうときなど、PowerShellを「管理者権限に昇格」させるという「ひと手間」、いや、知らない人にとっては案外大変な「PowerShellを管理者権限として実行する」操作を減らせる手法です!

やりたいこと

●PowerShellスクリプトファイル(.ps1ファイル)を右クリックで「PowerShellで実行」したときに、自動的に管理者権限として実行する。

※もちろん、バッチファイル(.bat形式)のファイルなどからその.ps1ファイルを呼び出して実行する場合でも管理者権限になります。

●上記を、「.ps1ファイル」のソースの先頭に1行追加するだけで実現する。

スクリプト例

if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole("Administrators")) { Start-Process powershell.exe "-File `"$PSCommandPath`"" -Verb RunAs; exit }

解説

使い方は簡単。自身の書いたPowerShellプログラムの一番最初の行にコピーしたコマンドを貼り付けるだけでOKです!

一行にすると案外複雑に見えてしまうかもしれませんので、以下のように意味のあるパーツごとに分解して解説していきましょう。

①if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole("Administrators")) {
②Start-Process powershell.exe "-File "$PSCommandPath"" -Verb RunAs
exit
}

①現在の権限を確認して、処理を分岐する

①if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole("Administrators")) 

ここの一番のポイントは権限の取得です。「[Security.Princial.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()」は、PowerShellを実行している権限を取得しています。

また、文頭の「if」の()は条件を表します。「!」がついていますので、否定文になります。
通常であれば「if」は「もし~~ならば」を表しますが、その逆を表す記号になります。つまり、「もし~~でなければ」ですね。

それに続いて、「.IsInRole("Administrators")」を後ろにつけています。
これは、「IsInRole(〇〇)」はユーザーの所属しているグループを判定するメソッドです。これによって「〇〇のユーザーグループ」に含まれるかを判定できます。(含まれている場合は"TRUE"、つまり"YES"という答えが返ってきます。)
※「Administrators」は、権利者権限を持っているユーザーのグループになります。

つまり、①のコードを読みかえると、「その時PowerShellを実行している権限が、Administratorsグループ(=管理者権限)に含まれなければ、」となります。

②自分自身(その.ps1ファイル自体)を、管理者権限をつけて別のプロセスとして起動する

②Start-Process powershell.exe " -File "$PSCommandPath"" -Verb RunAs

Start-Process powershell.exe」で、PowerShellを新しいプロセスとして起動しています。

その際、後ろについているオプション(-File ~~と-Verb RunAs)で特別な機能を与えています。

-File "$PSCommandPath"」は、プロセスを起動する際に、起動するファイルを自分自身(その.ps1ファイル自体)に指定しています。つまり、「その.ps1ファイル自体=$PSCommandPath」を、「PowerShellとして実行」していることになります。

-Verb RunAs」は、「管理者として」という意味です。これをつけることで、管理者として実行することができます。


上記の①と②をまとめると、「もし現在の権限が管理者権限でなければ、自分自身(その.ps1ファイル自体)を管理者権限をつけて新しいプロセスとして起動する」処理ということになり、つまり、「普通に"PowerShellとして実行"するだけで、自動的に管理者権限で再実行してくれる」ことになります!

あとがき

今回は、自動で管理者権限として実行してくれるパワーシェルスクリプトの作り方を紹介させていただきました。

PowerShellのコンソールを管理者権限で実行する方法は、「Winキー+Xキー」を同時押しした後に「Aキー」を押して「管理者権限のPowerShell」を直接起動する方法や、「PowerShell.exe」自体のプロパティで「常に管理者として実行する」ように設定しておくなど、種類はいくつかありますが、いずれも少し手間がかかってしまいます。

それができたとしても、さらに.ps1ファイルをコマンドで指定して実行しなくてはなりません。
これが案外手間になってしまいます。

おまじないのように、あらかじめ.ps1ファイルの先頭に1行追加しておくだけで、その手間から解放されるのでとてもオススメです。

また、定期的に実行されるPowerShellスクリプトなどを作成される際も、このおまじないの1行を入れておくと失敗が少なくて済むかもしれませんね。

何かのお役に立てれば幸いです。

コメント

Translate »
タイトルとURLをコピーしました