バッチファイルでログインユーザー名を取得したい場面は多くあります。ユーザーごとに処理を分ける、ログに実行者を記録する、管理者のみ特定処理を許可するといった制御が代表例です。本記事では %USERNAME% 環境変数を中心に、whoami コマンドやドメイン名付きの取得方法、管理者権限の確認方法、そして実践的な応用パターンまでを完全解説します。
%USERNAME%でログインユーザー名を即座に取得する方法whoamiコマンドでドメイン名込みのユーザー情報を取得する方法whoami /groupsで管理者権限の有無を確認する方法- ユーザー名で処理を分岐・ホームフォルダを活用する応用例
- 実践例3本(ユーザー別設定切り替え・管理者専用処理・マルチユーザー対応ログ)
1. ログインユーザー名取得の3手法比較
バッチファイルでログインユーザー名を取得する方法は主に3つあります。それぞれの特徴を把握して、用途に合った手法を選びましょう。
| 手法 | 取得できる値 | 取得速度 | 主な用途 |
|---|---|---|---|
%USERNAME% |
ユーザー名のみ(例: yamada) |
最速(展開済み変数) | 基本的なユーザー名取得・条件分岐 |
whoami |
ドメイン+ユーザー名(例: domain\yamada) |
速い(外部コマンド) | ドメイン環境・グループ・権限確認 |
wmic |
ユーザー名(例: yamada) |
遅め(WMI経由) | 他のシステム情報と同時取得 |
速度・可読性ともに
%USERNAME% が優れています。ドメイン名込みの情報や管理者グループの確認が必要な場合のみ whoami を使いましょう。環境変数の基本も合わせて参照してください。2. %USERNAME% でログインユーザー名を取得する(基本)
%USERNAME% はWindowsが自動設定するシステム環境変数です。追加コマンドなしにユーザー名を即座に取得できます。
2-1. 基本の表示
@echo off echo ログインユーザー名: %USERNAME% pause
実行結果の例(ユーザー名が yamada の場合):
ログインユーザー名: yamada
2-2. 変数に格納して使い回す
@echo off set "USER=%USERNAME%" echo ユーザー名 : %USER% echo ログファイル: %USER%_log.txt echo ホームフォルダ: C:\Users\%USER% pause
set に引用符をつける理由set "変数名=値" の形式で引用符を付けると、行末の余計な空白や特殊文字が変数に混入するのを防げます。set USER=%USERNAME% でも動きますが、set "USER=%USERNAME%" の書き方が安全です。2-3. ユーザーのホームフォルダを参照する
%USERPROFILE% 環境変数を使うと、ログインユーザーのホームフォルダ(C:\Users\ユーザー名)を直接取得できます。%USERNAME% でパスを組み立てるよりも確実です。
@echo off :: ユーザー名と関連パスを一覧表示 echo ユーザー名 : %USERNAME% echo ホームフォルダ : %USERPROFILE% echo デスクトップ : %USERPROFILE%\Desktop echo ドキュメント : %USERPROFILE%\Documents echo AppData\Local : %LOCALAPPDATA% echo AppData\Roaming : %APPDATA% pause
| 環境変数 | 展開される値(例) | 用途 |
|---|---|---|
%USERNAME% |
yamada |
ユーザー名の取得・条件分岐 |
%USERPROFILE% |
C:\Users\yamada |
ホームフォルダのパス取得 |
%HOMEPATH% |
\Users\yamada |
ドライブなしのホームパス |
%HOMEDRIVE% |
C: |
ホームドライブ文字のみ |
%APPDATA% |
C:\Users\yamada\AppData\Roaming |
アプリ設定フォルダ |
%LOCALAPPDATA% |
C:\Users\yamada\AppData\Local |
ローカルアプリ設定フォルダ |
3. whoami コマンドでドメイン名込みのユーザー情報を取得する
whoami コマンドはユーザー名だけでなく、ドメイン名・所属グループ・権限情報も取得できます。外部コマンドの結果を変数に格納する方法の代表的な活用例です。
3-1. whoami の基本出力
@echo off :: whoami: DOMAIN\username 形式で出力される whoami :: 結果例(ドメイン参加PCの場合): :: CORP\yamada :: 結果例(ローカルアカウントの場合): :: MYPC\yamada pause
3-2. whoami の結果を変数に格納する
@echo off
:: whoami の出力を変数に格納
for /f "delims=" %%i in ('whoami') do set "FULL_USER=%%i"
echo フル名: %FULL_USER%
:: ドメイン名とユーザー名を分離する
for /f "tokens=1,2 delims=\" %%a in ('whoami') do (
set "DOMAIN=%%a"
set "USER_ONLY=%%b"
)
echo ドメイン : %DOMAIN%
echo ユーザー名: %USER_ONLY%
pause
3-3. whoami /groups で所属グループを確認する
whoami /groups は現在のユーザーが所属するグループ一覧を表示します。管理者権限(Administrators グループ)の確認に使えます。
@echo off
:: 管理者グループに所属しているか確認
whoami /groups | findstr /i "Administrators" >nul 2>&1
if %errorlevel%==0 (
echo [管理者権限あり] %USERNAME%
) else (
echo [一般ユーザー] %USERNAME%
)
pause
4. 管理者権限の有無をチェックする
バッチファイルで管理者権限が必要な処理を実行する前に権限確認をしておくと、「アクセスが拒否されました」エラーを防げます。権限確認には複数の方法があります。
4-1. net session を使う方法(シンプル)
@echo off
:: net session: 管理者権限があれば成功、なければエラー(exit code 1)
net session >nul 2>&1
if %errorlevel%==0 (
echo [OK] 管理者権限で実行しています
goto :main
) else (
echo [ERROR] このスクリプトは管理者権限が必要です
echo 右クリック → 「管理者として実行」で再度実行してください
pause
exit /b 1
)
:main
echo 管理者専用処理を実行中...
pause
4-2. whoami /groups を使う方法(より確実)
@echo off
setlocal enabledelayedexpansion
:: Administrators グループに SID S-1-5-32-544 で確認(言語依存を回避)
whoami /groups | findstr /i "S-1-5-32-544" >nul 2>&1
if %errorlevel%==0 (
set "IS_ADMIN=1"
) else (
set "IS_ADMIN=0"
)
echo ユーザー名: %USERNAME%
echo 管理者権限: !IS_ADMIN!
if "!IS_ADMIN!"=="1" (
echo 管理者として実行中です
) else (
echo 一般ユーザーとして実行中です
)
pause
findstr /i "Administrators" は日本語版Windowsでは"Administrators" の表記が変わることがあります。SID(S-1-5-32-544)は言語に依存しないため、多言語環境や配布スクリプトでは SID 方式が安全です。4-3. 管理者権限がなければ自動で昇格プロンプトを表示する
@echo off
:: 管理者権限確認。なければUAC昇格を要求して再起動
net session >nul 2>&1
if %errorlevel% neq 0 (
echo 管理者権限が必要です。昇格を要求します...
powershell -Command "Start-Process -FilePath '%~f0' -Verb RunAs"
exit /b
)
echo 管理者権限で実行中: %USERNAME%
echo メイン処理を開始します...
pause
5. ユーザー名で処理を分岐する
ユーザー名による条件分岐は、同じバッチを複数ユーザーが使いながら、役割に応じた処理を自動切り替えする場面で活躍します。
5-1. 特定ユーザーにのみ処理を実行する
@echo off
set "USER=%USERNAME%"
if "%USER%"=="administrator" (
echo 管理者メニューを表示します
call :admin_menu
) else if "%USER%"=="yamada" (
echo 山田さん専用の処理を実行します
call :user_yamada
) else (
echo %USER% さん、こんにちは
call :default_menu
)
goto :eof
:admin_menu
echo [管理者] システム設定メニュー
exit /b
:user_yamada
echo [yamada] 専用レポート生成中...
exit /b
:default_menu
echo [一般] 通常メニューを表示中...
exit /b
5-2. 許可ユーザーリストで実行制限する
実行を許可するユーザーをテキストファイルで管理すると、バッチを修正せずに権限管理できます。
@echo off
:: allowed_users.txt の内容例:
:: yamada
:: tanaka
:: suzuki
set "ALLOWED_LIST=%~dp0allowed_users.txt"
if not exist "%ALLOWED_LIST%" (
echo エラー: 許可ユーザーリストが見つかりません
exit /b 1
)
findstr /i /x "%USERNAME%" "%ALLOWED_LIST%" >nul 2>&1
if %errorlevel%==0 (
echo [許可] %USERNAME% さん、ようこそ
call :main_process
) else (
echo [拒否] %USERNAME% はこのスクリプトの実行権限がありません
exit /b 1
)
exit /b
:main_process
echo メイン処理を実行中...
exit /b
5-3. 特定パターンのユーザーを除外する(findstr 部分一致)
@echo off
:: テスト用アカウント(test_ や tmp_ で始まる)を除外
:: findstr は正規表現OR(\|)未対応のため、パターンごとに個別にチェックする
set "SKIP=0"
echo %USERNAME% | findstr /i "^test_" >nul 2>&1
if %errorlevel%==0 set "SKIP=1"
echo %USERNAME% | findstr /i "^tmp_" >nul 2>&1
if %errorlevel%==0 set "SKIP=1"
if "%SKIP%"=="1" (
echo [スキップ] テスト/一時アカウントのため処理を行いません: %USERNAME%
exit /b 0
)
echo 通常ユーザーとして処理を開始: %USERNAME%
pause
6. ユーザー名をログに記録する
バッチ処理のログにユーザー名を含めると、誰がいつ実行したかを追跡できます。コンピューター名やIPアドレスと組み合わせると、より詳細な実行記録を残せます。
6-1. ユーザー名・PC名・日時を一括記録する
@echo off
set "USER=%USERNAME%"
set "PC=%COMPUTERNAME%"
set "LOG=%~dp0run_log.txt"
:: 日時を取得
for /f "tokens=1-3 delims=/ " %%a in ("%DATE%") do set "TODAY=%%a%%b%%c"
for /f "tokens=1-3 delims=: " %%a in ("%TIME: =0%") do set "NOW=%%a:%%b:%%c"
echo [%TODAY% %NOW%] USER=%USER% PC=%PC% >> "%LOG%"
echo 実行ログを記録しました: %LOG%
pause
6-2. ユーザー別ログファイルに分けて記録する
@echo off
set "USER=%USERNAME%"
set "LOG_DIR=%~dp0logs"
:: 日付を取得
for /f "tokens=1-3 delims=/ " %%a in ("%DATE%") do set "TODAY=%%a%%b%%c"
:: ユーザー名別ログフォルダを作成
if not exist "%LOG_DIR%\%USER%" mkdir "%LOG_DIR%\%USER%"
:: ユーザー名 + 日付でログファイルを命名
set "LOG=%LOG_DIR%\%USER%\%TODAY%.txt"
echo %TIME% - 処理開始 >> "%LOG%"
echo ログ出力先: %LOG%
pause
ログフォルダ構造の例:
logs\
yamada\
20241015.txt
20241016.txt
tanaka\
20241015.txt
7. ユーザーごとのホームフォルダを活用する
%USERPROFILE% を使うと、ログインユーザーのホームフォルダに動的にアクセスできます。ユーザー固有の設定ファイルや作業フォルダの操作に便利です。
@echo off set "USER=%USERNAME%" :: ユーザーのデスクトップにショートカットを作成する例 set "DESKTOP=%USERPROFILE%\Desktop" set "SHORTCUT=%DESKTOP%\作業用フォルダ.lnk" echo デスクトップ: %DESKTOP% :: ユーザーの Documents に処理結果を保存 set "DOC_DIR=%USERPROFILE%\Documents\MyBatchOutput" if not exist "%DOC_DIR%" mkdir "%DOC_DIR%" echo 処理結果 > "%DOC_DIR%\result_%DATE:~0,10%.txt" echo 保存先: %DOC_DIR% pause
日本語ユーザー名など特殊文字を含む場合、
C:\Users\%USERNAME% でパスを組み立てると文字化けや動作不良が起きることがあります。%USERPROFILE% はOSが直接設定した完全パスなので、ホームフォルダ参照には %USERPROFILE% を優先しましょう。8. 実践例3本
実践例1:ユーザー別に設定ファイルを自動切り替えする
複数ユーザーが使う共有PCで、ユーザーごとに異なる設定(作業フォルダ・サーバー接続先など)を自動的に読み込むスクリプトです。設定ファイルを別途用意することで、バッチ本体を変更せずに設定を管理できます。
@echo off
setlocal enabledelayedexpansion
set "USER=%USERNAME%"
set "CONFIG_DIR=%~dp0users"
set "CONFIG=%CONFIG_DIR%\%USER%.cfg"
:: ユーザー固有の設定ファイルがなければデフォルトを使用
if not exist "%CONFIG%" (
echo [INFO] %USER% の設定ファイルが見つかりません。デフォルトを使用します
set "CONFIG=%CONFIG_DIR%\default.cfg"
)
if not exist "%CONFIG%" (
echo [ERROR] デフォルト設定ファイルも見つかりません: %CONFIG%
exit /b 1
)
:: 設定ファイルを読み込む(KEY=VALUE 形式)
for /f "usebackq tokens=1,* delims==" %%a in ("%CONFIG%") do (
if not "%%a"=="" set "%%a=%%b"
)
echo ─────────────────────────────
echo ユーザー : %USER%
echo 設定ファイル: %CONFIG%
echo 作業フォルダ: %WORK_DIR%
echo 接続先 : %SERVER%
echo ─────────────────────────────
pause
users\yamada.cfg の内容例:
WORK_DIR=D:\work\yamada SERVER=192.168.1.10 BACKUP_DEST=E:\backup\yamada
実践例2:管理者権限確認 + ユーザー名チェックで二重認証する
「管理者グループに所属している」かつ「特定ユーザー名である」という二重の条件を満たした場合のみ処理を実行するスクリプトです。重要な操作(システム設定変更・一括削除など)の誤実行防止に役立ちます。
@echo off
setlocal enabledelayedexpansion
:: ─── Step1: 管理者権限確認 ──────────────────────────
net session >nul 2>&1
if %errorlevel% neq 0 (
echo [拒否] 管理者権限がありません
echo 右クリック → 「管理者として実行」で再実行してください
pause
exit /b 1
)
:: ─── Step2: 許可ユーザー確認 ──────────────────────────
set "ALLOWED=admin sysadmin maintainer"
set "IS_ALLOWED=0"
for %%u in (%ALLOWED%) do (
if /i "%%u"=="%USERNAME%" set "IS_ALLOWED=1"
)
if "!IS_ALLOWED!"=="0" (
echo [拒否] %USERNAME% はこの操作の許可ユーザーではありません
exit /b 1
)
:: ─── Step3: 最終確認 ───────────────────────────────
echo [確認] 以下の条件を満たしています:
echo - 管理者権限: あり
echo - 実行ユーザー: %USERNAME%
echo.
set /p "CONFIRM=本当に実行しますか? [Y/N]: "
if /i not "%CONFIRM%"=="Y" (
echo キャンセルしました
exit /b 0
)
echo [実行] 管理者専用処理を開始します...
pause
実践例3:複数ユーザー対応のログ集計スクリプト(共有PC向け)
共有PCで複数のユーザーが実行したバッチのログを、ユーザー別・日付別に整理して集計するスクリプトです。稼働時間をログに記録する方法と組み合わせると、PC使用状況の把握にも活用できます。
@echo off
setlocal enabledelayedexpansion
set "USER=%USERNAME%"
set "PC=%COMPUTERNAME%"
set "LOG_ROOT=%~dp0logs"
:: 日時を取得
for /f "tokens=1-3 delims=/ " %%a in ("%DATE%") do set "TODAY=%%a%%b%%c"
for /f "tokens=1-3 delims=: " %%a in ("%TIME: =0%") do set "NOW=%%a:%%b:%%c"
:: ─── ユーザー別・日付別フォルダ構造でログを出力 ─────
set "LOG_DIR=%LOG_ROOT%\%TODAY%\%USER%"
if not exist "%LOG_DIR%" mkdir "%LOG_DIR%"
set "LOG_FILE=%LOG_DIR%\%PC%_%NOW::=%.txt"
echo [%TODAY% %NOW%] START >> "%LOG_FILE%"
echo USER=%USER%, PC=%PC% >> "%LOG_FILE%"
:: ─── メイン処理(例: ファイルバックアップ) ─────────
echo バックアップ処理中...
robocopy "%USERPROFILE%\Documents" "%LOG_ROOT%\backup\%USER%" /mir /xo /r:1 /w:1 /log+:"%LOG_FILE%"
echo [%TODAY% %NOW%] END >> "%LOG_FILE%"
echo ログ保存完了: %LOG_FILE%
pause
ログフォルダ構造の例:
logs\
20241015\
yamada\
MYPC-001_143052.txt
tanaka\
MYPC-001_150123.txt
20241016\
yamada\
MYPC-001_090000.txt
9. まとめ:ログインユーザー名活用チートシート
| やりたいこと | コード | 備考 |
|---|---|---|
| ユーザー名を表示 | echo %USERNAME% |
最もシンプル |
| ユーザー名を変数に格納 | set "U=%USERNAME%" |
引用符ありが安全 |
| ホームフォルダを取得 | echo %USERPROFILE% |
パス組み立てより確実 |
| ドメイン名込みで取得 | for /f %%i in ('whoami') do set "U=%%i" |
DOMAIN\user 形式 |
| ドメイン名とユーザー名を分離 | for /f "tokens=1,2 delims=\\" %%a in ('whoami') do ... |
%%a=ドメイン %%b=ユーザー名 |
| 管理者権限を確認 | net session >nul 2>&1 |
exit code 0 = 管理者 |
| SIDで管理者確認(言語非依存) | whoami /groups | findstr "S-1-5-32-544" |
多言語環境で安全 |
| ユーザー名で条件分岐 | if "%USERNAME%"=="名前" ... |
完全一致 |
| 許可ユーザーリストと照合 | findstr /i /x "%USERNAME%" list.txt >nul |
ファイルで一元管理 |
| ユーザー名をログに記録 | echo USER=%USERNAME%, PC=%COMPUTERNAME% >> log.txt |
実行者の追跡に |
FAQ
Q%USERNAME% と whoami の値が違います。
A%USERNAME% はセッション開始時に設定されたNetBIOSユーザー名(例: yamada)を返します。whoami はドメイン名込みの完全名(例: corp\yamada)を返します。ドメイン環境ではこの差が生じます。ユーザー名の比較には %USERNAME% のほうが扱いやすいです。
Qタスクスケジューラで実行すると %USERNAME% が SYSTEM になります。
Aタスクスケジューラで「SYSTEM アカウントで実行」に設定すると、%USERNAME% は SYSTEM になります。ログインユーザーのコンテキストで実行したい場合は、スケジューラの設定を「ログオン時のみ実行」または特定のユーザーアカウントで実行するように変更してください。
Q管理者として実行しても %USERNAME% は変わりませんか?
A「管理者として実行」(UAC昇格)しても %USERNAME% はログインユーザーの名前のままです。Administrator に変わるわけではありません。管理者権限の有無を確認したい場合は net session や whoami /groups を使ってください。
Qユーザー名の比較で大文字・小文字を区別しないようにするには?
Aif /i の /i オプションを付けると大文字・小文字を区別しません。if /i "%USERNAME%"=="Yamada" とすれば、yamada・YAMADA・Yamada のいずれも一致します。findstr /i も同様に大文字・小文字を無視します。
Qユーザー名に日本語やスペースが含まれる場合の注意点は?
Aスペースを含むユーザー名は if "%USERNAME%"=="John Smith" のように必ず引用符で囲んでください。引用符なしだと Smith の部分が別の引数として解釈されます。日本語ユーザー名はコードページ(chcp)の設定によって文字化けが起きることがあります。パスの組み立てには %USERPROFILE% を優先しましょう。
Qネットワーク越しに別PCのログインユーザーを取得するには?
Aquser /server:リモートPC名(Query User)コマンドでリモートPCの現在のログインユーザーを確認できます。ただし、管理者権限が必要で、ネットワークアクセスが許可されている必要があります。wmic /node:"PC名" computersystem get username でも同様の情報が取得できます。リモートPC管理については Windowsユーザー管理のバッチも参照してください。

