必ず管理者権限でPowerShellのスクリプトファイルを実行する

Command

以前作成したバッチファイルを管理者権限で実行する件と同様で、PowerShellのスクリプトファイルでも管理者権限で実行するスクリプトを作成しました。

概要

実行したスクリプトが一般権限で実行された場合、管理者権限で再実行するためのスクリプトです。
管理者権限で再実行する際、実行ポリシーにRemoteSignedを指定していますが、それぞれの実行環境に合わせてください。

サンプルコード

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

#管理者権限で実行したい処理を以下に記述する

詳細

現在の権限を取得し、管理者権限かどうかを確認しています。
[Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent())で現在の権限を取得し、IsInRole("Administrators")で管理者権限であるか確認しています。
if (!( )){ }としていますので、管理者権限でなければ、if 文内の処理を行います。

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

}

Start-Process powershell.exe -Verb RunAsでPowerShellを新たに管理者権限でプロセスを開始しまし、一般権限で実行されたスクリプトを終了します。
"-ExecutionPolicy RemoteSigned -File `"$PSCommandPath`""でPowerShellのオプションを指定しています。社内ポリシーの都合により、再実行する際に実行ポリシーに RemoteSigned を指定しています。$PSCommandPath は実行中の ps1 ファイルのパスを返します。

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

社内ポリシー的にも問題がなく、常にスクリプトを実行できる状態になっているのであれば、以下のスクリプトで問題ありません。

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

あとは最後に管理者権限で実行したい処理を記述するだけです。

おすすめ書籍

どこでもインターネットで調べることができますが、社内のセキュリティーポリシーでインターネットを利用できない場所で作業することもありますし、ネットワークトラブルで使用できないこともありますので、買って損はしない一冊です。

Windowsコマンドプロンプトポケットリファレンス
Windows PowerShell ポケットリファレンス

おわりに

かならず管理者権限でPowerShellのスクリプトファイルを実行するための方法でした。
PowerShell は自分で使用する分については便利なのですが、いざスクリプトを配布して実行してもらおうと思うと、意図した操作をしてもらえなかったり、PCの設定でメモ帳が起動したりと結構面倒なことがおきたりしています。ps1 ファイルを右クリックして[PowerShellで実行」をクリックしてもらうだけで問題ないはずなのですが、ps1 ファイルをダブルクリックする人も多いです。そして鬼電がきます。なので、何が何でもPowerShellだけで完結させようとせずに、以前作成した管理者権限で実行するバッチで ps1 ファイルを起動する方がスムーズに実行してもらえるかもしれません。

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