Windowsコマンドプロンプトで「whoami」を活用する方法とその応用

Windowsのwhoamiは、コマンドを実行している現在のセキュリティコンテキストのユーザー名、SID、グループ、特権などを確認するコマンドです。「このPCにログインしている全ユーザー」や「そのアカウントが持ち得るすべてのアクセス権」を一覧にするコマンドではありません。

まず通常のコマンドプロンプトまたはPowerShellで実行します。情報確認のために最初から管理者として起動する必要はありません。別ユーザーで実行、管理者として実行、サービスやタスクからの実行では、同じ端末でも結果が異なる場合があります。

目次

基本:whoamiで実行中のユーザーを確認

whoami

一般的には「ドメインまたはコンピューター名\アカウント名」の形で表示されます。例えばCORP\exampleuserは説明用の架空例です。実際の名前や表示形式はアカウントの種類により異なり、Microsoftアカウントのメールアドレスや画面の表示名と同じとは限りません。

ドメイン参加PCでもローカルアカウントで実行すればローカルの主体が表示されます。出力の前半だけで、PCのドメイン参加状態やネットワーク接続の成否を断定しないでください。

主なオプションと用途

/userはユーザー名とSID、/groupsはグループ、/privは特権、/logonidはログオンID、/allは現在のトークン情報のまとめを表示します。使える構文はwhoami /?でも確認できます。/upnや/fqdnなどはアカウントや環境の条件があり、すべてのローカルアカウントで同じ情報が得られるわけではありません。

/user:ユーザー名とSIDを確認する

whoami /user

ユーザーSIDはセキュリティ主体を識別する値です。同じ見た目のユーザー名でも、アカウントを削除して作り直した場合などはSIDが異なることがあります。名前だけでなくSIDを照合すると、ローカルとドメインの同名アカウントを取り違えにくくなります。

/groups:現在のトークンに含まれるグループを見る

whoami /groups

グループ名だけでなく、種類(Type)、SID、属性(Attributes)を確認します。表示言語や環境によって見出し・説明が変わるため、英語の表示文字列だけを固定的に解析するスクリプトには注意してください。

例えばAdministratorsの属性が「Group used for deny only」(拒否のみに使用するグループ)なら、そのSIDは拒否の判定に使われますが、許可の根拠には使われません。UACにより管理者アカウントの通常起動時のトークンが制限される場合があります。グループ名が見えるだけで昇格済みとは言えず、deny-onlyだけで特定のファイルが必ず拒否されるとも言えません。

/priv:特権と現在の状態を見る

whoami /priv

ここに出るSeShutdownPrivilegeなどは、Windowsが管理する特権です。Enabled/Disabledはそのトークン上の状態を表します。特権の多くは既定で無効です。「Disabledだから壊れている」「全部Enabledにすればよい」という意味ではありません。特定のファイルへの読み書き許可を、そのまま列挙したものでもありません。

アクセスできないファイルの調査では、実行ユーザー、ファイルや共有のアクセス制御、グループの有効状態、アプリの実行方法、ロック状態などを合わせて確認します。whoami /privだけで原因が特定できたと判断せず、権限を一括で拡大しないでください。

/logonid:ユーザーSIDと分けて扱う

whoami /logonid

現在のログオンIDを調べるオプションです。ユーザー自身のSID、リモートデスクトップのセッション番号、klistなどで使う16進数の識別子を同じものとして扱わないでください。MicrosoftのSID資料にあるログオンセッションSIDの形式はS-1-5-5-X-Yです。ここでは実機で取得したような固定の出力例は示さず、実際の結果と目的に合う資料を照合します。

/all:現在のトークン情報をまとめて表示する

whoami /all

まとめて確認するときに便利ですが、/allの「all」は全ログインユーザーという意味ではありません。別セッションや別プロセスの主体を調べたい場合は、その目的に合った管理ツールや実行場所を選びます。

CSVなどの出力形式を選ぶ

/user・/groups・/priv・/allなどの情報表示では、/foでtable、list、csvを選べます。/nhでヘッダーを省略できるのはtableまたはcsvのときです。/fo list /nhや、/logonidに同じ書式オプションを付ける例は使いません。

whoami /user /fo csv /nh
whoami /groups /fo list
whoami /priv /fo table

CSVはカンマだけでなく引用符も使う形式なので、単純な文字列分割ではなくCSVとして読み取ります。グループ名や属性の表示言語を前提にした判定より、必要なSIDや構造を明確にして扱います。ただしCSVにしただけで、アカウント全体の権限を判定できるわけではありません。

バッチファイルで確認結果を表示する

次の例は.cmdまたは.batファイル用です。ユーザー・グループ・特権を順番に表示し、コマンド失敗時は途中で止めます。各命令を1行ずつ記述し、出力ファイルへの上書きは行いません。

@echo off
whoami
if errorlevel 1 exit /b 1

whoami /groups
if errorlevel 1 exit /b 1

whoami /priv
if errorlevel 1 exit /b 1
exit /b 0

ユーザー名を変数へ入れたい場合の基本例は次のとおりです。for /fはコマンド出力を行単位で扱います。delims=は空白による分割を避ける指定で、%%Iはバッチファイル内の記法です。コマンドプロンプトへ直接入力する場合は%Iを使います。

@echo off
setlocal
set "currentIdentity="
for /f "delims=" %%I in ('whoami') do set "currentIdentity=%%I"
if not defined currentIdentity exit /b 1
set currentIdentity
endlocal

USERNAMEなどの環境変数は便利ですが、実行中のトークン情報を調べるwhoamiと同一の仕組みではありません。変数の表示だけで権限の確認を済ませないでください。また、この単純な取得例をセキュリティ境界の判定コードに流用するのではなく、実際のアクセス制御を使います。

PowerShellでは終了コードと表示方法を確認する

$whoamiPath = Join-Path $env:SystemRoot 'System32\whoami.exe'
$identity = & $whoamiPath
if ($LASTEXITCODE -ne 0) {
    throw 'whoami failed.'
}
$identity

$groups = & $whoamiPath /groups
if ($LASTEXITCODE -ne 0) {
    throw 'whoami /groups failed.'
}
$groups | Out-Host

複数行の結果をWrite-Hostへ配列のまま渡すと、見やすい行構造が失われる場合があります。上の例ではOut-Hostで表示します。whoami.exeはネイティブコマンドなので、その呼び出し直後の$LASTEXITCODEで失敗を確認します。

ユーザー名とSIDをCSVとして取り込む例です。/nhで見出しを省き、2列に明示的な名前を付けます。生の結果の取得が成功したことを確認してから解析します。

$whoamiPath = Join-Path $env:SystemRoot 'System32\whoami.exe'
$csv = & $whoamiPath /user /fo csv /nh
if ($LASTEXITCODE -ne 0) {
    throw 'whoami /user failed.'
}
$csv | ConvertFrom-Csv -Header UserName, SID

結果を保存するときの注意

コマンドプロンプトの>や通常のOut-Fileは、同名ファイルがあると上書きする使い方になります。保存するなら既存ファイルと区別した作業用ファイルを選び、必要な情報だけを残します。次は、PowerShellで新規ファイルへの保存を指定する例です。

$whoamiPath = Join-Path $env:SystemRoot 'System32\whoami.exe'
$result = & $whoamiPath /groups
if ($LASTEXITCODE -ne 0) {
    throw 'whoami /groups failed.'
}
$result | Out-File -LiteralPath '.\whoami-groups.txt' -Encoding utf8 -NoClobber -ErrorAction Stop

.\whoami-groups.txtはPowerShellの現在の作業場所を基準に保存されます。先にGet-Locationで保存先を確認してください。同名ファイルがあれば-NoClobberで失敗させます。Windows PowerShell 5.1とPowerShell 7ではUTF-8出力のBOMの扱いなどが異なるため、後続の読み取り処理に合わせて確認してください。この記事のコードは説明用で、個別のWindows環境で動作テストした結果ではありません。

結果が想定と違うときの確認順

まず、エラーが出るアプリと同じユーザー・同じ起動方法で調べているか確認します。管理者として開いた別のターミナルでwhoamiを実行しても、通常権限で動くアプリの状態をそのまま示すわけではありません。

グループへの追加・削除後も、既存のプロセスが古いトークンを使っている場合があります。必要なデータを保存したうえで、管理者の案内に従って再ログインや対象プロセスの再起動を検討します。コマンドを繰り返すだけで、すべてのグループ変更が既存トークンへ反映されるとは限りません。

共有フォルダーでは、接続時に使った資格情報やサーバー側の権限も確認対象です。ローカルのwhoami結果だけで、すべてのリモート接続先が同じユーザーとして認証していると決めつけないでください。

共有するログは必要最小限にする

出力にはユーザー名、端末・ドメイン名、SID、グループ構成、特権などが含まれます。通常はパスワードそのものを表示するコマンドではありませんが、組織の構成を公開してよいとは限りません。問い合わせ先が必要とする範囲だけを、安全な経路で共有してください。

演習:設定を変更せずに結果を読む

まずwhoamiとwhoami /userを実行し、同じユーザー名が表示されることとSIDの役割を確認します。次にwhoami /groupsでグループ名・種類・SID・属性の4項目を探し、グループ名だけでは判断できない理由を説明してみてください。

最後にwhoami /privのEnabledとDisabledを確認し、特権の状態と特定ファイルのアクセス許可の違いを整理します。練習のためにグループや権限を変更する必要はありません。結果は自分の端末内で確認し、実際のユーザー名やSIDを公開の場所へ貼り付けないようにします。

よくある質問

Administratorsと出れば管理者として動いていますか?

名前が含まれることだけでは判定しません。属性がdeny-onlyになっていないかなど、現在のトークンを確認します。UACのある環境では、管理者グループのメンバーでも通常起動時のトークンが制限されることがあります。

/privに必要そうな名前がない場合は追加すべきですか?

先に実際の操作と必要な権限を確認します。ファイルのアクセス許可とWindowsの特権は別であり、エラー解消のために広い特権を追加するのは適切とは限りません。

他の人や全ユーザーの情報も取得できますか?

whoamiは現在の実行コンテキストを確認するコマンドです。全ユーザー一覧やリモートユーザー検索の代わりにはなりません。目的に応じた管理ツールを、許可された範囲で使います。

まとめ

whoamiは、現在の実行ユーザーとトークンを確認する読み取り用の診断コマンドです。/user・/groups・/privを使い分け、deny-onlyやDisabledの意味を確認し、出力だけでファイル権限や全ユーザーの状態を断定しないようにしましょう。

参考:Microsoft公式資料

whoamiの構文とオプション/アクセストークン/SIDの属性/UACの動作。

Windowsの特権/SIDとログオンセッション/forの構文。

Out-File/ConvertFrom-Csv/PowerShellの文字エンコーディング。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次