1. PS1ファイルを管理者として実行するには?
PS1ファイルを実行する最もオーソドックスな方法は、右クリックメニューから「PowerShellで実行」をクリックする方法です。

しかしこの方法ではたとえ実行ユーザが管理者権限を有していても、PS1ファイルは標準ユーザの権限で実行されます。
つまりPS1ファイルに管理者権限が必要なコードが書かれていると、失敗してしまいます。
では管理者権限でPS1ファイルを実行する方法はと言うと、以下のような方法があります。
- PowerShell ISEを管理者として起動し、PS1ファイルを開いて実行する
- タスクマネージャでPS1ファイルを実行するタスクを登録(「最上位の特権で実行する」にチェック)
- ドメイン環境の場合、スタートアップスクリプトでPS1ファイルを実行する
- 【PowerShell】Start-ProcessコマンドレットでPS1ファイルを管理者として実行する
- 【コマンドプロンプト】RunAsコマンドでPS1ファイルを管理者として実行する(管理者権限ユーザのパスワード入力が必要)
意外と面倒ですね。一般ユーザに管理者権限が必要なPS1ファイルを配布する場合、上記の方法を案内するのはユーザーフレンドリーとは言えません。
もっと簡単にPS1ファイルを管理者権限で実行する方法があります。
PS1ファイルのコード内に、管理者権限で実行されていなければ、管理者権限でPS1ファイルを実行し直すというコードを記述してしまえば良いのです。
2. 管理者権限でPS1ファイルを実行し直すコード
1 2 3 4 5 |
#管理者権限で実行されていなければ、スクリプトを管理者権限で実行し直す If (-not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] 'Administrator')){ Start-Process -FilePath PowerShell.exe -ArgumentList "-NoLogo -ExecutionPolicy Bypass -File $($MyInvocation.MyCommand.Path)" -Verb RunAs Exit } |
PS1ファイルの最初にコードを記述します。
↓実行ユーザが管理者権限を有していない場合は、Administratorのパスワード入力画面が表示されます。

↓UACが既定値の場合、実行確認が画面が表示されます。(はいをクリック)

3. コードを解説
1 |
([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] 'Administrator') |
↑管理者として実行されている場合にTrueを返します。
1 2 3 |
If (-not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] 'Administrator')){ } |
↑Ifステートメント。管理者として実行されていない場合の処理をスクリプトブロックに記述します。
1 2 |
Start-Process -FilePath PowerShell.exe -ArgumentList "-NoLogo -ExecutionPolicy Bypass -File $($MyInvocation.MyCommand.Path)" -Verb RunAs Exit |
↑Start-Processコマンドレットで、実行中のスクリプトファイルを管理者として実行し、Exitステートメントで実行中のスクリプトファイルを中止します。
4. まとめ
PS1ファイルに管理者権限が必要なコードを記述する場合、今回紹介したコードを冒頭に記述しておくことで、以下の手順でPS1ファイルを実行することが可能になります。
- 右クリックメニューから「PowerShellで実行」 でPS1ファイルを実行する
- UACの設定によって、実行確認画面が表示されるので、「はい」をクリック
他にも、ログオンスクリプトやスタートアップにPS1ファイルを保存してWindowsサインイン時に自動実行する場合にも応用可能です。
コメント