某PCショップ店員の覚書

勤務中に作成したプログラムやスクリプトのまとめ

.ps1ファイルを管理者権限で実行する

前回の記事で
「次回以降はオススメBTOパソコンを紹介する」
と言いましたが、先に書きたいことができましたので次回以降で!

.ps1ファイルを管理者権限で実行したい

.ps1ファイルを管理者権限で実行するには、大きく分けて2パターンあります。

  1. batファイルから管理者権限へ昇格させて.ps1を実行する
  2. スクリプト内に管理者権限へ昇格させるコードを記述する

1.の場合はbatファイルを別に用意しなければならないので、配布するファイル数が多くなってしまいます。
配布ファイルサイズを削減したい方にはあまり向きません。更に2.の方法と比べるとあまりメリットもありません。
なので今回は2.の方法。

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.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()」は、PowerShellを実行している権限を取得しています。
さらに後ろに「.IsInRole("Administrators")」を付けることにより、ユーザーの所属しているグループを判定しています。ちなみに、含まれている場合は「True」が返ります。
簡単に説明すると、「今.ps1を実行している権限が「Administratorsグループ」でなければ という意味です。

    Start-Process powershell.exe "-File `"$PSCommandPath`"" -Verb RunAs
    exit
}

Start-Process powershell.exe」でPowershellを新しいプロセスとして起動しています。
その後ろについているオプション「"-File `"$PSCommandPath`""」は、起動しているファイル自身を指定するコマンドです。
-Verb RunAs」は、管理者として という意味になります。
つまり、「自分自身を新しいプロセスで、管理者として実行する」という意味になり、最初のものと合わせると
「.ps1を実行したユーザーの権限が管理者権限でなければ、自分自身を管理者権限へ昇格させて新しいプロセスとして実行する」という意味になります。

たった数行で.batを用意することもなく、簡単に管理者権限へ昇格させてから実行できるようになるので、作ったスクリプトファイルの先頭へ記述することをオススメします。