増殖するOperatingSystemSKU(その1)――WMIクエリの謎解き:その知識、ホントに正しい? Windowsにまつわる都市伝説(87)(1/2 ページ)
Windowsのエディションは「SKU」という番号で識別できることをご存じでしょうか。Windows Serverの場合は、インストールオプションでSKUが区別されることもあります。このSKUに関連して、今回はDirectAccessのセットアップで登場するWMIクエリの謎を解きます。
DirectAccessクライアントの難解なWMIフィルター、解読できますか?
Windows Vista/Windows Server 2008以降のWindows OSは、「SKU(Stock Keeping Unit」と呼ばれる製品番号でエディションを識別することができます。筆者がこのSKUに注目するようになったのは、Windows Server 2012の「DirectAccess」サーバを構築したときでした。
DirectAccessは、Windows Server 2008 R2で初めて実装されたVPN(Virtual Private Network)に代わるセキュアなリモートアクセス技術であり、当初はWindows Server 2008 R2、Windows 7 Enterprise、Windows 7 Ultimateをクライアントとしてサポートしていました。
最新のWindows Server 2016のDirectAccessは、上記OSに加え、Windows Server 2012以降のWindows Server、Windows 8以降のEnterpriseエディション、Windows 10 Educationエディションで利用可能です。「Windowsソフトウェアアシュアランス」(Windows 10からはWindows 10 Enterprise E3/E5に名前が変わりました)で提供されるEnterpriseエディション限定の機能であるため、一般のユーザーにはなじみがないかもしれません。
Windows Server 2012以降でDirectAccessサーバをセットアップすると、DirectAccessクライアントの設定に関係するグループポリシーの難解な「WMI(Windows Management Instrumentation)フィルター」を目にすることになります。このWMIフィルターは「モバイルコンピューターに対してのみDirectAccessを有効にする」というオプションを有効にした際、クライアントを構成するためのグループポリシーオブジェクト(GPO)に設定される「DirectAccess - Laptop only WMI filter」です。筆者は、Windows Server 2012の書籍を執筆した際(4年以上前)、この難解なWMIフィルターを解読しました。
- DirectAccessのWMIクエリの謎解きとSKU番号全リスト(筆者の個人ブログ:山市良のえぬなんとかわーるど)
Windows Server 2016のDirectAccessでは、WMIフィルター「DirectAccess - Laptop only WMI filter」のWMIクエリが、以下のようにさらに複雑になっています(リスト1、画面1)。あらためて解読してみましょう。DirectAccessをセットアップする、しないに関係なく、コンピュータのシステムタイプやバージョン、エディションを識別するよい教科書になると思います。
select * from Win32_ComputerSystem where PCSystemType = 2 select * from Win32_OperatingSystem WHERE (ProductType = 3) OR (((Version LIKE '6.[2-3]%') OR (Version LIKE '[1-9][0-9].%')) AND (OperatingSystemSKU = 4 OR OperatingSystemSKU = 27 OR OperatingSystemSKU = 72 OR OperatingSystemSKU = 84)) OR (Version LIKE '6.1%' AND (OperatingSystemSKU = 4 OR OperatingSystemSKU = 27 OR OperatingSystemSKU = 70 OR OperatingSystemSKU = 1 OR OperatingSystemSKU = 28 OR OperatingSystemSKU = 71))
画面1 Windows Server 2016のDirectAccessのセットアップで作成されるWMIフィルター「DirectAccess - Laptop only WMI filter」に含まれる2つのWMIクエリ
このWMIフィルターには2つのWMIクエリがあり、両方の結果が「真」の場合にGPOが適用されて、DirectAccessクライアントとして構成されます。1つ目のクエリは、「PCSystemType」が「2」(Mobile)である場合に「真」になります。PCSystemTypeの値については、以下のドキュメントで説明されています。
- Win32_ComputerSystem class[英語](Windows Dev Center)
2つ目のクエリは複雑です。このクエリが何をしているのかを先に明かすと、DirectAccessクライアント機能をサポートするかどうかを判断しています。クエリに含まれる「ProductType」「Version」「OperatingSystemSKU」の値は、それぞれ製品の種類(3はServer)、Windowsのバージョン(6.1、6.2、6.3x、10.xなど内部バージョン)、そしてエディションのSKU番号です。これらの値については、以下のドキュメントで説明されています。
- Win32_OperatingSystem class[英語](Windows Dev Center)
全ての値は、ローカルコンピュータのコマンドプロンプトやWindows PowerShellで、次のコマンドラインを実行することで確認できます(画面2)。
C:\> WMIC COMPUTERSYSTEM GET PCSystemType C:\> WMIC OS GET ProductType, Version, OperatingSystemSKU C:\> WMIC OS GET Version C:\> WMIC OS GET OperatingSystemSKU
PS C:\> (gwmi win32_computersystem).PCSystemType PS C:\> (gwmi win32_operatingsystem).ProductType PS C:\> (gwmi win32_operatingsystem).Version PS C:\> (gwmi win32_operatingsystem).OperatingSystemSKU
2つ目のクエリは、1行に複数の条件がANDやORでつながっているため、パッと見ただけでは理解するのが難しいでしょう。次のようなWSH(Windows Script Host)スクリプトを使えば、ローカルコンピュータがこのクエリに対してどう判断されるのかを実際に確かめることができます(リスト2、画面3)。
strComputer = "." wmiquery1 = "select * from Win32_ComputerSystem where PCSystemType = 2" wmiquery2 = "select * from Win32_OperatingSystem WHERE (ProductType = 3) OR (((Version LIKE '6.[2-3]%') OR (Version LIKE '[1-9][0-9].%')) AND (OperatingSystemSKU = 4 OR OperatingSystemSKU = 27 OR OperatingSystemSKU = 72 OR OperatingSystemSKU = 84)) OR (Version LIKE '6.1%' AND (OperatingSystemSKU = 4 OR OperatingSystemSKU = 27 OR OperatingSystemSKU = 70 OR OperatingSystemSKU = 1 OR OperatingSystemSKU = 28 OR OperatingSystemSKU = 71))" Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set colItems = objWMIService.ExecQuery(wmiquery1) If colItems.Count = 0 then WScript.Echo "[x] 1st query: This client type is not mobile." Else WScript.Echo "[o] 1st query: This client type is mobile." End If Set colItems = objWMIService.ExecQuery(wmiquery2) If colItems.Count = 0 then WScript.Echo "[x] 2nd query: DirectAccess client feature is not supported." Else WScript.Echo "[o] 2nd query: DirectAccess client feature is supported." End If
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- Windowsで起動時に自動実行される不要なプログラムを「見つける」方法
アプリケーションのインストールなどを繰り返していると、いつのまにかWindowsの起動時に自動実行されるプログラムが増殖する。これらを確認するには、Windows 2000なら[コンピュータの管理]を、Windows XPなら[システム情報]を使う。またWindows XPでは[システム構成ユーティリティ]で削除指定ができる。 - Windowsのsvchost.exeプロセスとは? ―sc.exeでサービスをコマンドラインから制御する―
リッスンしているネットワーク・ポートを調べていると、svchost.exeというプロセスが所有者となっていることがよくある。svchost.exeは、ネットワーク関連の基本的なサービスを起動するための親となるプロセスであり、いくつかのグループに分けてサービスを起動している。scコマンドを使うと、サービスをコマンド・プロンプトから制御することができる。 - Windows 10のWindows Updateサービスを停止しようと考えている方へ
Windows 10のWindows Updateは、以前のWindowsから大きく変わりました。Windows 10になってからも変更は続いています。半ば強制的なWindows Updateに対抗する最終手段は「Windows Updateサービス」の無効化ですが、どうしてもというなら、影響を知った上で一時的に無効化するのがよいでしょう。 - Windows 10初期リリース(1507)のサービス終了のお知らせ
マイクロソフトは2017年4月12日(日本時間、以下同)、当初の予定通り、Windows Vista(Service Pack 2)に対する全ての製品サポートを終了しました。次にサポートが終了するのはWindows 7ですが、まだ3年もあると思っていませんか。それよりも前に、セキュリティ更新提供が終了するWindows 10があります。