この記事はPowerShell Advent Calendar 2020 の 2 日目です。
PowerShellスクリプトを管理者で実行させようとした際、右クリックからは直接出来ず、
一度PowerShellのターミナルを管理者で実行させてフォルダを移動して…としないといけなくて少し(結構)面倒だと思います。
右クリック→PowerShellで実行をした際に、非管理者の場合に管理者として立ち上げなおすことが出来れば楽なのでは?
ということで書いてみました。
経緯
定期的にPowerShellスクリプトを実行する必要があるけど、そのスクリプトは管理者権限じゃないと動かないのであった。
ターミナルを管理者で起動させてフォルダを移動してスクリプトを実行…は面倒なのでスクリプト自体に仕込んでしまうことにした。
やりたいこと
- PowerShellスクリプト(.ps1)を右クリック→PowerShellで実行だけで管理者として実行させたい
- UACは出てもよい
- ファイルを複数に分けない
- 別途バッチ(.bat)を用意し、これを右クリック→管理者として実行すればOK…みたいなのはナシ
- ある程度汎用性とか使い回しが出来るとなお良い
環境
PSVersion 5.1 での動作を確認しています。
コードの内容から、PSVersion 3.0 以降であれば動作します。1
コードの実装
スクリプトファイルの先頭付近に以下のコードを記載します。
if(!(([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]"Administrator"))){
Start-Process -FilePath "powershell.exe" -ArgumentList "-File $PSCommandPath" -verb runas;
### 非管理者で実行させたい内容があればこのあたりに記述 ###
exit;
}
### 以降、管理者で実行させたい内容を記述 ###
コードの説明
if(!(([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]"Administrator")))
自分自身が管理者(Administrator)権限を保有しているか確認します。
__!__で反転させているので、保有していない場合がTrueとなり、以下のコマンドに続きます。
Start-Process -FilePath "powershell.exe" -ArgumentList "-File $PSCommandPath" -verb runas;
管理者権限を保有していない場合、上記のコマンドを実行して管理者として自分自身を実行させます。
1つ目の引数-ArgumentList "-File $PSCommandPath"
で自分自身のスクリプト名(フルパス)を引数として渡し、
2つ目の引数-verb runas
で管理者として実行となります。
exit;
非管理者権限で実行したスクリプトは不要なので、そのまま終了させます。
(非管理者権限で実行させたい内容がある場合、何か書いてもいいと思います。)
終わりに
感想1
もっと楽な方法がありそうな気がする…。
感想2
そもそも定期的に管理者として実行させないといけないスクリプトがあるならさっさとタスクスケジューラーに放り込みましょう(戒め)
-
$PSCommandPathがPSVersion 3.0以降を要求するため…ではあるのですが、MSサポート範囲内に含まれるOSであれば既に3.0以降な気がします。 ↩