Windowsのエディションは「SKU」という番号で識別できることをご存じでしょうか。Windows Serverの場合は、インストールオプションでSKUが区別されることもあります。このSKUに関連して、今回は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フィルターを解読しました。
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))
このWMIフィルターには2つのWMIクエリがあり、両方の結果が「真」の場合にGPOが適用されて、DirectAccessクライアントとして構成されます。1つ目のクエリは、「PCSystemType」が「2」(Mobile)である場合に「真」になります。PCSystemTypeの値については、以下のドキュメントで説明されています。
2つ目のクエリは複雑です。このクエリが何をしているのかを先に明かすと、DirectAccessクライアント機能をサポートするかどうかを判断しています。クエリに含まれる「ProductType」「Version」「OperatingSystemSKU」の値は、それぞれ製品の種類(3はServer)、Windowsのバージョン(6.1、6.2、6.3x、10.xなど内部バージョン)、そしてエディションのSKU番号です。これらの値については、以下のドキュメントで説明されています。
全ての値は、ローカルコンピュータのコマンドプロンプトや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.