はじめに:Windowsエージェントレス管理は「落とし穴」だらけ
常駐ソフトを入れずに、Windows標準機能である WinRM(Windows Remote Management) を使ってLAN内PC端末のスペックやOSバージョン、インストール済みソフトを収集する――。
構想としては最高ですが、実際に現場のPCで動かそうとすると、Microsoftの歴史的な仕様やセキュリティ制限による「地獄の罠」 が次々と襲いかかってきます。
- 「Windows 11の最新PCを買ってきたのに、OS名が『Windows 10』と取得される」
- 「管理者パスワードは合っているのに、なぜかAccess is denied(アクセス拒否)される」
- 「セットアップ用PowerShellを実行しようとしたらセキュリティで弾かれる」
本記事では、筆者がLAN内のサーバー、PC、十数台をエージェントレス管理化する中で踏み抜いた 「5つの巨大な罠」 と、それらを一撃で解決する 「全自動セットアップバッチ(要点抜粋)」 を解説します。
罠 1:Windows 11 なのに WMI が「Windows 10」と嘘をつく問題
Windows 11端末に対して PowerShell や WMI でOS名を取得しようとすると、信じられない怪奇現象に遭遇します。
これはバグではなく、Microsoftが古いソフトウェアとの後方互換性を保つために意図的に行っている仕様です。
Caption 文字列だけを信用していると、「Windows 11へ移行したはずのLAN内PC端末が、資産台帳上ですべて『EoL間近のWindows 10』として検知され続ける」という大混乱に陥ります。
解決策:ビルド番号(BuildNumber)で判定する
Windows 11の初版ビルド番号は 22000 です。したがって、OS判定ロジックは必ずビルド番号を見て判定する必要があります。
罠 2:管理者パスワードが合っているのに「Access is denied」される(UAC制限)
Active Directory配下のドメイン管理者ではなく、ワークグループ環境やローカル管理者アカウントを使ってWinRM接続しようとすると、正しいID/PWを入力しても接続が拒否されます。
これはWindows Vista以降に導入された 「リモートUAC制限(UAC Remote Restrictions)」 が原因です。
リモートからネットワーク経由でローカル管理者がログインしてきた場合、Windowsは自動的にその権限を「一般ユーザー(制限トークン)」に格下げしてしまいます。
解決策:レジストリでリモートトークンフィルターを解除する
管理者の昇格権限をそのままリモートセッションに通すため、以下のレジストリキーを登録します。
REM (Source: https://github.com/ojisantech/)
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f
罠 3:PowerShellスクリプト(.ps1)がポリシーで実行できない
設定用スクリプトを .ps1 で作って現場のユーザーに配布しても、ダブルクリックでは動きませんし、右クリック実行しても以下のエラーで停止します。
このシステムではスクリプトの実行が無効になっているため、ファイル ...ps1 を読み込むことができません。
+ CategoryInfo : SecurityError: (:) [], PSSecurityException
LAN内の全員(家の中だと奥さん、こどもなど)に「PowerShellを開いて Set-ExecutionPolicy RemoteSigned と打ってください」と指示するのは、非エンジニアにはハードルが高すぎます。
解決策:ワンクリック .bat から -ExecutionPolicy Bypass で呼び出す
ユーザーには「バッチファイルを右クリックして『管理者として実行』を押すだけ」にしてもらいます。
罠 4:ネットワークプロファイルが「パブリック」だとFWが通らない
WinRMの標準ポートは 5985/tcp (HTTP) です。
LAN内に接続しているにもかかわらず、Windowsがネットワークを誤って「パブリックネットワーク」と認識している場合、Windows Defender ファイアウォールによって通信が完全に遮断されます。
解決策:ファイアウォールルールを全プロファイルに明示開放する
REM (Source: https://github.com/ojisantech/)
netsh advfirewall firewall add rule name="WinRM-HTTP-Inbound" dir=in action=allow protocol=TCP localport=5985 profile=any
特定のLAN内サブネット(例: 192.168.1.0/24)からのみ許可するよう制限をかければ、セキュリティ的にも万全です。
罠 5:突然WinRMが切れる(パスワード有効期限切れの時限爆弾)
初期セットアップから42日(Windowsの既定パスワード有効期間)が経過したある日、全端末から一斉に情報が取れなくなるという時限爆弾が爆発します。
ローカルアカウントのパスワード有効期限が切れてロックされるためです。
解決策:作成した診断アカウントのパスワードを無期限化する
REM (Source: https://github.com/ojisantech/)
net user AssetAdmin MyStrongPass123! /add
wmic useraccount where "name='AssetAdmin'" set PasswordExpires=FALSE
決定版:全LAN内に配る「一撃解消バッチ(要点抜粋)」
以上の5つの罠をすべて対策し、現場のPCで右クリック実行するだけでWinRMエージェントレス環境が完成するバッチファイルです。
💻 コア実装・設定スニペット(抜粋)
# PowerShell / WMI での怪奇現象再現例
Get-CimInstance Win32_OperatingSystem | Select-Object Caption, BuildNumber
# 実行結果例:
# Caption BuildNumber
# ------- -----------
# Microsoft Windows 10 Pro 22631 <-- ビルドは Win11 (23H2) なのに Caption が Windows 10 になるケース
まとめ:現場の泥臭い仕様を制する者がWindowsを制する
ドキュメント通りにコマンドを1行打つだけでは、現実のWindowsフリートは動いてくれません。
- WMIのCaptionではなくBuildNumberを見ること
- UACリモート制限という歴史的仕様をレジストリで解除すること
- ファイアウォールとパスワード有効期限の時限爆弾をあらかじめ解除しておくこと
この泥臭いノウハウを押さえておけば、高価な常駐エージェントソフトを何台もインストールすることなく、軽快で安全なエージェントレスWindows管理を実現できます!
📚 さらに詳しいアーキテクチャ設計・パラメータ表・トラブルシューティング
最後までお読みいただきありがとうございます!
本記事が少しでも「役に立った」「あとで試したい」と感じていただけましたら、ぜひQiitaの 「いいね(♡)」 と 「ストック」、および アカウントのフォロー をいただけると今後の検証・執筆の大きな励みになります!
また、本記事のさらに踏み込んだ 「深層アーキテクチャ解説」「主要パラメータの技術的根拠」「現場アンチパターン・トラブルシューティング対応表」 は、以下のGitHub技術リファレンスにて公開しています。
👉 【第9弾 詳細技術リファレンス (QIITA_ARTICLE_DETAIL_9.md)】
⭐ 全14層・200パターンの自立型インフラ&オンプレAIリファレンス集(おじさんの武器庫)を順次公開中です。ぜひGitHubリポジトリへの Star (★) と X (@OjisanTechnical) のフォローもお願いいたします!
👉 GitHub リポジトリ: ojisantech/ojisan-arsenal
💡 【検証環境・個人研究(PoC)に関する注記】
本記事は、筆者個人の自宅検証環境(ホームラボ/仮想環境)において、公開情報およびOSS(オープンソースソフトウェア)を用いて独自に構築・検証した個人研究(PoC)の記録です。特定の企業・団体の実環境や業務上の非公開情報とは一切関係ありません。