[WMI] 浮気な君のポートを FIX したいのに出来ない (WMI、RPC、DCOM と Dynamic Port の酸っぱい関係)
皆さんごきげんよう。ういこです。過日 90 年代にかな~りはやって今は大御所な某グループのライブに行ってきたのですが、若人から 40 代の皆様と幅広い層の参加者でした。2 時間激しく踊ってまいりました。そういえば、Yellow とか大学時代色々行ってたのに、もうすっかり…。しかし、明らかにガラスの十代の娘っ子たちがすれ違い様に
「ねえ、今日のライブ年齢層マジ高くない…? 」
…はい、わたしが年齢引き上げてますが何か?
さて、そんなやさぐれモードの心を癒すのは旅…。旅ですよ。飛鳥路行きたい!妊娠 8 ヶ月でエジプトに行ったわたしには怖いものないですよ。おなか抱えてピラミッド内部に入ったくらいですもの。旅といえばポート!世界一周行きたいですね!!というわけで、無理やりですが今回の御題は以下!
★今日の御題★ WMI を使用して他のコンピュータ上に接続していろいろやるアプリケーションを開発してるんだけど、ほかのコンピュータに接続する際に使用されるポート番号を指定して接続したいんだけどどうすればいいのドラ●もん!?
フフフ…。ポートねたですよ…。そう、WMI つかってると、どーも他のコンピュータに激しく接続しに行ってるなしめしめとポートをみるとどうも、一定ではないな、と思ったことありませんか。(netstat などで見てみると…。) どこのポートが使われるかわからないのが困っちゃうようなケースの場合、ポート番号を指定したいというときありますよね。
…でも、残念ながらそれは出来ないんです…。
では、それはなぜか。
1. そもそもなんで WMI で使われるポートが一定ではないの?
実は、WMI をつかって別のコンピュータに対して接続を行う処理は、分散コンポーネント オブジェクト モデル (Distributed Component Object Model = DCOM)を使用して行われております。.NET Framework のクラスとか、VBScript などを使って WMI のプログラムを組んでると、こうした「中の人がどうやって動いているか」という部分は普段意識しないと思いますが、こことっても大事です。WMI を考える際、DCOM の動きを想像できるかでトラブルシュートに大きく差がつきますのよ奥様。
さて、この DCOM とやらは、リモート プロシージャ コール (Remote Procedure Call = RPC) という仕組みを基盤にしております。では RPC とは何か。ぶっちゃけていうと、他のコンピュータ上のプログラムを呼び出し (文字通り “Call”) 、実行させる仕組みです。 ネットワークを通じて他のコンピュータ上で何か出来るって、なかなか魅力的ですよね。でもって、この RPC がクセモノなのです。RPC は、動的ポート割り当てを使用するんですよ。だから、WMI に限らず、DCOM を使うアプリや、RPC をつかうアプリで使用されるポートは、一定ではないのです。
2. RPC の動的ポート割り当てのポート割り当て処理になんか規則はないの?
残念ながら、規則性はありません。
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\TcpipParameters 配下の MaxUserPort というキーが存在ない場合は 1025 - 5000 の範囲でランダムで選択され、割り当てられてしまうのです。(※)
(※) Windows XP、Windows Server 2003 でも、グループ ポリシーやMicrosoft Exchange のインストールなどで一時ポートの割り当て数が変更になっている場合があります。MaxUserPort が 1024 以上になっていたら、範囲が変わります。また、Vista / 2008 では、割り当て番号が変更になりました。詳細はこちら。
3. なんとかポート番号を指定できないの?
残念ながら、使用されるポート番号の範囲を変更させることはできても、特定の番号を指定はできません。
WMI を使って他のコンピュータへの接続をする機能に関してはDCOMにすべてまるっとお任せしてしまっているため、使用されるポート番号も自動的に DCOM さんが使う、RPC の動的ポート割り当て機能に利用することになります。そのため一時割り当てに使用されるポート番号の範囲を制限することはできても特定の WMI 機能に限って使用するポート番号を指定することはできないのです…。
4. まとめ
・WMI は別のコンピュータに接続するのに DCOM を使う
・DCOM さんは RPC 機能を使って別のコンピュータにリモートで繋げに行く
・RPC は動的割り当てポートで使っていいよといわれている範囲のポートのうち、適当に選んだポートで繋げに行く
⇒ 使われるポートは一定にならないし、しかもプログラム側でポート番号を指定できない
5. 参考ドキュメント
[HOWTO] Windows 2000 および Windows XP で TCP/IP ポートを制限する方法
https://support.microsoft.com/default.aspx?scid=300083
[MTS]INF:DCOMCNFG で DCOM のポートを制限する方法
https://support.microsoft.com/kb/413714/ja
Connecting to WMI Remotely Starting with Windows Vista
https://msdn.microsoft.com/en-us/library/aa822854.aspx#dcom_settings
Securing a Remote WMI Connection
https://msdn.microsoft.com/en-us/library/aa822854.aspx
ういこう@18 年前の曲だっていいものはいいんですよお嬢さん!!