はじめに:なぜスクリプトが途中で止まるのか
PowerShellでスクリプトを作っていると、こんな経験はありませんか。
「テストでは動いたのに、本番でエラーになる」
その原因の多くは、管理者権限が必要な処理を一般ユーザーで実行していることです。
たとえば、レジストリ変更、サービス操作、C:\Windows配下の書き込みなどは、管理者権限が必要です。
そこで重要なのが、スクリプトの最初で管理者かどうかをチェックすることです。
管理者権限とは何か?
Windowsにはユーザーごとに「できることの範囲」が決まっています。
- 一般ユーザー:通常の操作のみ可能
- 管理者ユーザー:システム変更が可能
さらに注意が必要なのは、管理者アカウントでログインしていても、PowerShellを「管理者として実行」していなければ、管理者権限ではありません。
ここが初心者が混乱するポイントです。
管理者権限かどうかを判定する基本コード
まずは一番シンプルな判定方法です。
$isAdmin = ([Security.Principal.WindowsPrincipal]
[Security.Principal.WindowsIdentity]::GetCurrent()
).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
if ($isAdmin) {
Write-Output "管理者として実行されています。"
} else {
Write-Output "管理者権限ではありません。"
}
このコードは、現在のユーザーが「Administratorsグループ」に属しているかを確認しています。
ポイントは、.NETのクラスを使っているところです。
PowerShellは内部で.NETを利用しているため、このような判定が可能です。
実務でよく使う書き方(スクリプトを止める)
実務では、管理者でなければ処理を止めるのが安全です。
$isAdmin = ([Security.Principal.WindowsPrincipal]
[Security.Principal.WindowsIdentity]::GetCurrent()
).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
if (-not $isAdmin) {
Write-Error "このスクリプトは管理者として実行してください。"
exit 1
}
これをスクリプトの一番上に書いておくと、事故を防げます。
管理者として自動で再起動する方法
少し応用です。
管理者でなければ、自分自身を管理者として再実行する方法があります。
$isAdmin = ([Security.Principal.WindowsPrincipal]
[Security.Principal.WindowsIdentity]::GetCurrent()
).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
if (-not $isAdmin) {
Start-Process powershell -Verb RunAs -ArgumentList "-File `"$PSCommandPath`""
exit
}
このコードは、現在のスクリプトを管理者権限で再実行します。
ただし、ユーザー確認(UACダイアログ)が表示されます。
よくあるハマりどころ
1. 管理者アカウントなのにfalseになる
これは「管理者として実行」していない可能性があります。
2. バッチから呼び出すと動かない
呼び出し元が管理者でなければ意味がありません。
3. スケジュールタスクで動かない
「最上位の特権で実行する」にチェックが必要です。
まとめ
PowerShellで管理者権限を扱うときは、最初に判定する習慣をつけることが重要です。
管理者かどうかを確認してから処理を始めるだけで、トラブルを大きく減らせます。
運用スクリプトでは、必須のテクニックです。


コメント