PowerShellで管理者権限かどうかを判定する方法【初心者向け完全解説】

Windows
記事内に広告が含まれています。

はじめに:なぜスクリプトが途中で止まるのか

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で管理者権限を扱うときは、最初に判定する習慣をつけることが重要です。
管理者かどうかを確認してから処理を始めるだけで、トラブルを大きく減らせます。
運用スクリプトでは、必須のテクニックです。

コメント

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