こんにちは!今回は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行を入れておくと失敗が少なくて済むかもしれませんね。
何かのお役に立てれば幸いです。
コメント
[…] […]