バッチファイルで Windows のローカルユーザーを削除するには net user ユーザー名 /delete を使います。退職者アカウントの一括削除・テスト環境のクリーンアップ・定期メンテナンスなど、管理者が手作業でこなしていたユーザー削除作業を自動化できます。本記事では基本構文から、存在確認・管理者権限チェック・ログイン中ユーザーの対処・一括削除まで実務パターンを体系的に解説します。
ユーザーを削除すると、そのユーザーのプロファイル・ファイル・設定は削除されませんが、アカウント自体(SID)は完全に失われ復元できません。同名のユーザーを再作成しても別の SID が割り当てられるため、以前のアクセス権は引き継がれません。本番環境での実行前にリストを必ず確認してください。
net user /deleteの基本構文とオプション- ユーザーの存在確認してから安全に削除する方法
- 管理者権限チェックと自動昇格の実装
- ログイン中のユーザーを確認してから削除する方法
- 複数ユーザーを CSV・テキストリストから一括削除する方法
- ドメインユーザーとローカルユーザーの違い
- 実践例3本(退職者一括削除・テスト環境クリーン・安全削除スクリプト)
1. net user /delete の基本構文
net user ユーザー名 /delete
| コマンド例 | 説明 |
|---|---|
net user testuser /delete |
ローカルユーザー testuser を削除 |
net user "田中 太郎" /delete |
スペースを含むユーザー名はダブルクォートで囲む |
net user testuser /delete /domain |
ドメインユーザーを削除(ドメイン管理者権限が必要) |
@echo off
:: 最もシンプルなユーザー削除
net user testuser /delete
if %errorlevel% equ 0 (
echo ユーザーを削除しました
) else (
echo 削除に失敗しました
)
Administrator・Guest などのビルトインアカウントは net user /delete で削除できません(エラーになります)。これらは削除ではなく「無効化」(net user Administrator /active:no)で対応します。2. ユーザーの存在確認してから削除する
存在しないユーザーを削除しようとするとエラーが返ります。net user ユーザー名 を実行してエラーレベルで確認してから削除するのが安全です。
@echo off
setlocal
set TARGET_USER=testuser
:: ユーザーの存在確認
net user "%TARGET_USER%" >nul 2>&1
if %errorlevel% neq 0 (
echo [INFO] ユーザーが存在しません: %TARGET_USER%
exit /b 0
)
:: 存在する場合のみ削除
echo [INFO] ユーザーを削除します: %TARGET_USER%
net user "%TARGET_USER%" /delete
if %errorlevel% equ 0 (
echo [OK] 削除完了: %TARGET_USER%
) else (
echo [ERROR] 削除失敗: %TARGET_USER%
exit /b 1
)
net user ユーザー名(情報表示)はユーザーが存在すれば 0、存在しなければ 2 を返します。net user ユーザー名 /delete は削除成功で 0、失敗(権限不足・存在しないなど)で 2 を返します。if errorlevel 1 か if %errorlevel% neq 0 でエラーを検出できます。3. 管理者権限チェック
net user /delete は管理者権限がないと「システム エラー 5 が発生しました。アクセスが拒否されました。」というエラーになります。バッチの冒頭で権限を確認し、不足していれば適切なメッセージを出すか自動で再起動します。
3-1. 権限チェックして終了するパターン
@echo off
setlocal
:: 管理者権限チェック(net session は管理者のみ成功する)
net session >nul 2>&1
if %errorlevel% neq 0 (
echo [ERROR] このスクリプトは管理者権限で実行してください。
echo バッチファイルを右クリック → 「管理者として実行」
pause
exit /b 1
)
echo [OK] 管理者権限を確認しました
:: ... 以降の処理 ...
3-2. 自動で管理者権限を要求して再起動するパターン
@echo off
:: 管理者権限がなければ UAC ダイアログを出して再起動
net session >nul 2>&1
if %errorlevel% neq 0 (
echo 管理者権限が必要です。UAC ダイアログが表示されます...
powershell -Command "Start-Process -FilePath '%~f0' -Verb RunAs"
exit /b 0
)
:: 管理者権限ありの処理
echo [OK] 管理者権限で実行中
管理者権限の自動取得については バッチファイルで管理者権限を自動取得する方法、アクセス拒否エラーの原因別対処は 「アクセスが拒否されました」エラー完全解決ガイド も参照してください。
4. ログイン中のユーザーを確認してから削除する
現在ログイン中のユーザーを削除するとセッションが強制切断されます。query user(別名 quser)コマンドでログイン状況を確認してから削除するのが安全です。
@echo off
setlocal
set TARGET_USER=testuser
:: ユーザーの存在確認
net user "%TARGET_USER%" >nul 2>&1
if %errorlevel% neq 0 (
echo [INFO] ユーザーが存在しません: %TARGET_USER%
exit /b 0
)
:: ログイン中か確認
query user "%TARGET_USER%" >nul 2>&1
if %errorlevel% equ 0 (
echo [WARN] %TARGET_USER% は現在ログイン中です。
echo 削除するとセッションが強制切断されます。
set /p CONFIRM=続行しますか? (Y/N):
if /i not "%CONFIRM%"=="Y" (
echo 処理を中止しました
exit /b 0
)
) else (
echo [INFO] %TARGET_USER% はログインしていません
)
:: 削除実行
net user "%TARGET_USER%" /delete
if %errorlevel% equ 0 (
echo [OK] 削除完了: %TARGET_USER%
) else (
echo [ERROR] 削除失敗: %TARGET_USER%
exit /b 1
)
| コマンド | 説明 |
|---|---|
query user |
すべてのログイン中ユーザーを一覧表示 |
query user ユーザー名 |
特定ユーザーのログイン状態を確認(いればexit 0、いなければexit 1) |
quser |
query user の短縮形(同じ動作) |
5. ローカルユーザー一覧を取得する方法
削除対象ユーザーを絞り込む前に、現在のローカルユーザー一覧を確認します。
@echo off :: 方法1: net user(シンプルだが整形が必要) echo === ローカルユーザー一覧 === net user :: 方法2: wmic(1行1ユーザー形式で扱いやすい) echo === wmic ユーザー一覧 === wmic useraccount where "localaccount=True" get name,disabled,lockout /format:list :: 方法3: PowerShell(最も詳細な情報) echo === PowerShell ユーザー一覧 === powershell -Command "Get-LocalUser | Select-Object Name,Enabled,LastLogon | Format-Table -AutoSize"
@echo off
setlocal enabledelayedexpansion
:: for /f で net user の出力からユーザー名を抽出
:: (先頭のコメント行と末尾の統計行をスキップ)
for /f "skip=4 tokens=*" %%L in ('net user') do (
:: 「コマンドは正常に終了しました。」行をスキップ
echo %%L | findstr /i "正常" >nul 2>&1
if !errorlevel! neq 0 (
echo ユーザー行: %%L
)
)
6. 複数ユーザーを一括削除する方法
6-1. バッチ内のリストから一括削除
@echo off
setlocal enabledelayedexpansion
:: 管理者権限チェック
net session >nul 2>&1
if %errorlevel% neq 0 (
echo [ERROR] 管理者権限が必要です
exit /b 1
)
:: 削除対象ユーザーのリスト
set DELETE_USERS=testuser1 testuser2 testuser3
set SUCCESS=0
set FAILED=0
for %%U in (%DELETE_USERS%) do (
net user "%%U" >nul 2>&1
if !errorlevel! equ 0 (
net user "%%U" /delete
if !errorlevel! equ 0 (
echo [OK] 削除: %%U
set /a SUCCESS+=1
) else (
echo [ERROR] 削除失敗: %%U
set /a FAILED+=1
)
) else (
echo [SKIP] 存在しないためスキップ: %%U
)
)
echo ===========================
echo 成功: !SUCCESS! 件 失敗: !FAILED! 件
6-2. テキストファイルのリストから一括削除
@echo off
setlocal enabledelayedexpansion
:: users_to_delete.txt の形式:
:: 1行1ユーザー名(# で始まる行はコメント)
set LIST_FILE=%~dp0users_to_delete.txt
:: 管理者権限チェック
net session >nul 2>&1
if %errorlevel% neq 0 (
echo [ERROR] 管理者権限が必要です
exit /b 1
)
if not exist "%LIST_FILE%" (
echo [ERROR] リストファイルが見つかりません: %LIST_FILE%
exit /b 1
)
set SUCCESS=0
set FAILED=0
set SKIP=0
for /f "usebackq tokens=* eol=#" %%U in ("%LIST_FILE%") do (
if not "%%U"=="" (
net user "%%U" >nul 2>&1
if !errorlevel! equ 0 (
net user "%%U" /delete
if !errorlevel! equ 0 (
echo [OK] 削除: %%U
set /a SUCCESS+=1
) else (
echo [ERROR] 削除失敗: %%U
set /a FAILED+=1
)
) else (
echo [SKIP] 存在しません: %%U
set /a SKIP+=1
)
)
)
echo ===========================
echo 成功: !SUCCESS! 件 失敗: !FAILED! 件 スキップ: !SKIP! 件
for ループ内では %errorlevel% は実行前に展開されてしまうため、直前のコマンドの結果を取得できません。setlocal enabledelayedexpansion を宣言したうえで !errorlevel! を使うか、if errorlevel 1(Nバージョン)形式を使ってください。7. ドメインユーザーの削除(/domain オプション)
ドメインに参加している環境では、/domain オプションを付けることでドメインコントローラー上のユーザーを削除できます。ただしドメイン管理者権限が必要です。
@echo off :: ドメインユーザーの削除(ドメイン管理者として実行が必要) net user domainuser01 /delete /domain :: ローカルユーザーの削除(管理者として実行が必要) net user localuser01 /delete
| 種別 | コマンド形式 | 必要権限 | 削除先 |
|---|---|---|---|
| ローカルユーザー | net user ユーザー名 /delete |
ローカル管理者 | このPCのSAMデータベース |
| ドメインユーザー | net user ユーザー名 /delete /domain |
ドメイン管理者 | ADのドメインコントローラー |
8. ユーザーをグループから削除する(アカウント自体は残す)
アカウント自体は残しつつ、特定のグループからのみ除外したい場合は net localgroup を使います。ユーザー削除との使い分けを明確にしておきましょう。
@echo off :: グループからユーザーを削除(アカウントは残る) net localgroup Administrators testuser /delete net localgroup "Remote Desktop Users" testuser /delete :: アカウント自体を削除(グループからも自動的に除外) net user testuser /delete
| 操作 | コマンド | 結果 |
|---|---|---|
| グループからのみ除外 | net localgroup グループ名 ユーザー名 /delete |
アカウントは残る・指定グループからのみ削除 |
| アカウント完全削除 | net user ユーザー名 /delete |
アカウントが消える・所属グループからも自動除外 |
9. 実践例3本
実践例1:退職者アカウントを CSV リストから一括削除する
人事担当から受け取った退職者リスト(CSV)を読み込み、削除前に確認を行ってから一括処理します。
@echo off
setlocal enabledelayedexpansion
:: ── 退職者一括削除スクリプト ──
:: CSV形式: ユーザー名,氏名,部署 (1行目はヘッダー)
set CSV_FILE=%~dp0retired_users.csv
set LOG_FILE=%~dp0logs\delete_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%.log
:: フォルダ準備
if not exist "%~dp0logs\" mkdir "%~dp0logs"
:: 管理者権限チェック
net session >nul 2>&1
if %errorlevel% neq 0 (
echo [ERROR] 管理者権限が必要です >> "%LOG_FILE%"
echo [ERROR] 管理者権限が必要です
exit /b 1
)
if not exist "%CSV_FILE%" (
echo [ERROR] CSV が見つかりません: %CSV_FILE%
exit /b 1
)
:: ドライラン: 削除対象を表示
echo === 削除対象ユーザー(確認) ===
set COUNT=0
for /f "usebackq skip=1 tokens=1,2,3 delims=," %%A in ("%CSV_FILE%") do (
net user "%%A" >nul 2>&1
if !errorlevel! equ 0 (
echo [対象] %%A ^(%%B / %%C^)
set /a COUNT+=1
) else (
echo [SKIP] %%A は存在しません
)
)
echo 合計 !COUNT! 件を削除します
echo.
:: 確認プロンプト
set /p CONFIRM=実行しますか? (Y/N):
if /i not "!CONFIRM!"=="Y" (
echo 処理を中止しました
exit /b 0
)
:: 実際に削除
set SUCCESS=0
set FAILED=0
for /f "usebackq skip=1 tokens=1,2,3 delims=," %%A in ("%CSV_FILE%") do (
net user "%%A" >nul 2>&1
if !errorlevel! equ 0 (
net user "%%A" /delete
if !errorlevel! equ 0 (
echo [%DATE% %TIME%] [OK] 削除: %%A ^(%%B^) >> "%LOG_FILE%"
echo [OK] %%A
set /a SUCCESS+=1
) else (
echo [%DATE% %TIME%] [ERROR] 削除失敗: %%A >> "%LOG_FILE%"
echo [ERROR] %%A
set /a FAILED+=1
)
)
)
echo === 結果: 成功 !SUCCESS! 件 / 失敗 !FAILED! 件 ===
echo ログ: %LOG_FILE%
実践例2:テスト環境のユーザーを名前パターンで一括削除する
テスト環境で「test_」や「tmp_」などのプレフィックスが付いたテスト用アカウントを一括削除するスクリプトです。
@echo off
setlocal enabledelayedexpansion
:: 削除対象のプレフィックス
set PREFIX=test_
:: 管理者権限チェック
net session >nul 2>&1
if %errorlevel% neq 0 (
echo [ERROR] 管理者権限が必要です
exit /b 1
)
:: wmic でローカルユーザーを取得し、プレフィックスが一致するものを削除
set COUNT=0
for /f "skip=1 tokens=1 delims= " %%U in ('wmic useraccount where "localaccount=True" get name') do (
if not "%%U"=="" (
echo %%U | findstr /b /i "%PREFIX%" >nul 2>&1
if !errorlevel! equ 0 (
echo [DELETE] %%U
net user "%%U" /delete
if !errorlevel! equ 0 set /a COUNT+=1
)
)
)
echo %PREFIX%* のユーザーを !COUNT! 件削除しました
実践例3:安全削除スクリプト(管理者権限確認・ログイン中チェック・ログ記録・ロールバック情報出力)
本番環境で使える、安全性を最重視した削除スクリプトです。削除前にユーザー情報をバックアップし、ログを残します。
@echo off
setlocal enabledelayedexpansion
:: ── 安全ユーザー削除スクリプト ──
if "%~1"=="" (
echo 使い方: %~nx0 ユーザー名 [/force]
echo /force: ログイン中でも強制削除
exit /b 1
)
set TARGET=%~1
set FORCE=0
if /i "%~2"=="/force" set FORCE=1
set LOG_DIR=%~dp0logs
set LOG=%LOG_DIR%\delete_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%.log
if not exist "%LOG_DIR%\" mkdir "%LOG_DIR%"
:: ① 管理者権限チェック
net session >nul 2>&1
if !errorlevel! neq 0 (
echo [ERROR] 管理者権限が必要です
exit /b 1
)
:: ② ユーザー存在確認
net user "%TARGET%" >nul 2>&1
if !errorlevel! neq 0 (
echo [INFO] ユーザーが存在しません: %TARGET%
exit /b 0
)
:: ③ 削除前のユーザー情報をログに保存(ロールバック参考情報)
echo [%DATE% %TIME%] 削除前情報: %TARGET% >> "%LOG%"
net user "%TARGET%" >> "%LOG%" 2>&1
:: ④ ログイン中チェック
query user "%TARGET%" >nul 2>&1
if !errorlevel! equ 0 (
if "%FORCE%"=="0" (
echo [WARN] %TARGET% は現在ログイン中です。
echo /force オプションを付けて再実行すると強制削除します。
exit /b 1
) else (
echo [WARN] ログイン中ですが /force が指定されたため続行します
)
)
:: ⑤ 削除実行
net user "%TARGET%" /delete
if !errorlevel! equ 0 (
echo [%DATE% %TIME%] [OK] 削除完了: %TARGET% >> "%LOG%"
echo [OK] 削除完了: %TARGET%
echo ログ: %LOG%
) else (
echo [%DATE% %TIME%] [ERROR] 削除失敗: %TARGET% >> "%LOG%"
echo [ERROR] 削除に失敗しました: %TARGET%
exit /b 1
)
10. まとめ:ユーザー削除コマンドチートシート
| やりたいこと | コマンド・方法 | ポイント |
|---|---|---|
| ユーザーを削除する | net user ユーザー名 /delete |
管理者権限必須 |
| 存在確認してから削除 | net user ユーザー名 >nul 2>&1 → errorlevel 確認 |
存在すれば 0、しなければ 2 |
| 管理者権限チェック | net session >nul 2>&1 |
管理者なら 0、非管理者なら 5 |
| ログイン中確認 | query user ユーザー名 >nul 2>&1 |
ログイン中なら 0、していなければ 1 |
| ドメインユーザー削除 | net user ユーザー名 /delete /domain |
ドメイン管理者権限が必要 |
| グループからのみ除外 | net localgroup グループ名 ユーザー名 /delete |
アカウント自体は残る |
| ユーザー一覧取得 | net user または wmic useraccount ... get name |
wmic は1行1ユーザーで扱いやすい |
| 一括削除 | for /f + テキスト/CSV リスト |
usebackq でファイル読み込み |
ユーザーの作成方法については バッチファイルでWindowsユーザーを作成・設定する方法完全ガイド、ログインユーザー名の取得については バッチファイルでログインユーザー名を取得する方法 も参照してください。
FAQ
Qnet user /delete で「システム エラー 5 が発生しました」が出ます。
Aエラー 5 はアクセス拒否です。管理者権限なしで実行しています。バッチファイルを右クリック → 「管理者として実行」で起動してください。タスクスケジューラから実行する場合は「最上位の特権で実行する」にチェックを入れてください。
Q削除したユーザーのファイルやデータはどうなりますか?
Anet user /delete でアカウントを削除しても、C:\Users\ユーザー名\ フォルダ(プロファイル)は自動的には削除されません。プロファイルは残ります。完全に削除したい場合は「システムのプロパティ」→「詳細設定」→「ユーザープロファイル」から削除するか、バッチで rmdir /S /Q "C:\Users\ユーザー名" を実行してください。
QAdministrator や Guest は削除できますか?
Aこれらのビルトインアカウントは net user /delete では削除できません。「このユーザー アカウントは削除できません。」というエラーになります。代わりに net user Guest /active:no や net user Administrator /active:no で無効化してください。
Qログイン中のユーザーを強制的に削除できますか?
A削除自体は実行できますが、そのユーザーのセッションは強制切断されます。保存していない作業データが失われる可能性があります。本番環境では query user でログイン確認 → ログオフ後に削除するのが安全です。logoff セッションID コマンドで強制ログオフもできます。
Qfor ループ内で errorlevel が正しく取れません。
Afor ループ内で %errorlevel% を使うと、ループ開始時の値が固定されてしまいます。setlocal enabledelayedexpansion を宣言して !errorlevel! を使うか、if errorlevel 1(「1以上かどうか」を判定する形式)を使ってください。
QPowerShell でユーザー削除する方法は?
Aバッチから PowerShell を呼び出す場合は powershell -Command "Remove-LocalUser -Name 'testuser'" が使えます。PowerShell 5.1 以上(Windows 10/Server 2016 以降)で利用可能です。ドメインユーザーの場合は Remove-ADUser(ActiveDirectory モジュールが必要)を使います。

