ここから本文です

増殖するOperatingSystemSKU(その1)――WMIクエリの謎解き

7/19(水) 7:55配信

@IT

●DirectAccessクライアントの難解なWMIフィルター、解読できますか?

 Windows Vista/Windows Server 2008以降のWindows OSは、「SKU(Stock Keeping Unit」と呼ばれる製品番号でエディションを識別することができます。筆者がこのSKUに注目するようになったのは、Windows Server 2012の「DirectAccess」サーバを構築したときでした。

WMIクエリに含まれる値は、ローカルコンピュータでは「WMIC」コマンドで簡単に取得できる

 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)。あらためて解読してみましょう。DirectAccessをセットアップする、しないに関係なく、コンピュータのシステムタイプやバージョン、エディションを識別するよい教科書になると思います。

・リスト1 「DirectAccess - Laptop only WMI filter」のWMIクエリ
□□
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で、次のコマンドラインを実行することで確認できます。

・コマンドプロンプトの場合は「WMIC」コマンドで値を確認
□□
C:\> WMIC COMPUTERSYSTEM GET PCSystemType
C:\> WMIC OS GET ProductType, Version, OperatingSystemSKU
C:\> WMIC OS GET Version
C:\> WMIC OS GET OperatingSystemSKU
□□


・Windows PowerShellの場合は「gwmi」コマンドレット(Get-WmiObjectのエイリアス)で値を確認
□□
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)。

・リスト2 ローカルコンピュータがクエリに対してどう判断されるのかを確認するWSHスクリプト:testquery.vbs
□□
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
□□

●謎を解く鍵は、クライアントOSのOperatingSystemSKU値の一覧

 2つ目のクエリを複雑にしているのは、条件に含まれるOperatingSystemSKUの値が多いことです。SKU番号はWindowsに新しいエディションが追加されると増えるため、エディションを正しく判断するには、Windowsのバージョン番号とSKU番号を組み合わせる必要があるのです。

 先ほど紹介した「Win32_OperatingSystem class」のドキュメントは、Windowsの全エディションをカバーしていません。より幅広いエディションをカバーしているドキュメントが以下にあります。ただし、SKU番号が16進数になっていることも含め、分かりにくい一覧ですし、Windows 8/8.1以前のSKU番号が一部含まれていません(以前はありましたが、Windows 10追加時に削除されました)。

 Windows 7以降のSKU番号を分かりやすく一覧にすると、以下の表のようになります。存在する全てのエディションをカバーしているわけではありませんが、DirectAccessのWMIクエリの謎解きには十分だと思います。なお、Enterprise Nは「Windows Media Player」が削除されているエディションで、日本市場では提供されません。Enterprise EおよびUltimate Eエディションの詳細は不明です。このエディションは、実際には提供されなかったようです。

○Windows 7(内部バージョン6.1.*)
SKU番号/エディション
1/Ultimate
3/Home Premium
4/Enterprise(90日評価版も同じSKU番号)            
27/Enterprise N
28/Ultimate N
48/Professional
65/Embedded Standard(Windows Thin PCを含む)
70/Enterprise E
71/Ultimate E

○Windows 8(内部バージョン6.2.*)/8.1(内部バージョン6.3.*)
SKU番号/エディション
4/Enterprise
27/Enterprise N
48/Pro
72/Enterprise Evaluation(90日評価版)                
84/Enterprise N Evaluation(90日評価版)               
103/Pro with Media Center

○Windows 10(内部バージョン10.0.x)
SKU番号/エディション
4/Enterprise
27/Enterprise N
48/Pro
72/Enterprise Evaluation(90日評価版)
84/Enterprise N Evaluation(90日評価版)
104/Mobile
121/Education(バージョン1607以降のPro Educationについては未確認)
123 IoT Core

 この一覧を使ってクエリを解読すると、次のようになります。2つのクエリの結果が「真」の場合に、このWMIフィルターが設定されたGPOがコンピュータに適用されるということになります。

□□□□
●1つ目のクエリ

システムタイプがモバイルである

かつ

●2つ目のクエリ

「サーバである」または「Windows 8/8.1またはWindows 10のEnterpriseまたはEnterprise NまたはEnterprise評価版またはEnterprise N評価版である」または「Windows 7のEnterpriseまたはEnterprise NまたはEnterprise EまたはUltimateまたはUltimate NまたはUltimate Eである」
□□□□

●Windows Server 2012 R2のWMIフィルターには問題があった

 ちなみに、Windows Server 2012のDirectAccessのWMIフィルターは、以下のようになっています(リスト3)。ぜひ解読してみてください。Windows Server 2012 R2のDirectAccessのWMIフィルターも同じです。

・リスト3 Windows Server 2012/2012 R2のDirectAccessのWMIフィルター
□□
Select * from Win32_ComputerSystem WHERE PCSystemType = 2
Select * from Win32_OperatingSystem WHERE (ProductType = 3) OR (Version LIKE '6.2%' 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フィルターではWindows Server 2012 R2と同世代のWindows 8.1(バージョン6.3)が除外されてしまいます。つまり、Windows Server 2012 R2とWindows 8.1 Enterpriseの環境でDirectAccessをセットアップした場合、「モバイルコンピューターに対してのみDirectAccessを有効にする」オプションを使うと、“DirectAccessクライアントとしてセットアップされない”というトラブルに巻き込まれることになります。

 これは、Windows Server 2012 R2の製品のバグ(クエリの修正し忘れ)だと思います。問題を回避するには、クエリを修正してもよいのですが、「モバイルコンピューターに対してのみDirectAccessを有効にする」オプションを使わずに、ドメインのセキュリティグループを使用してGPOの適用先を割り当てる方が簡単です。

●Windows Server 2016で問題は解消されたように見えるけど、実は……

 Windows Server 2016のDirectAccessでは、Windows 8.1 Enterpriseが除外されてしまう問題はクエリの「Version LIKE '6.[2-3]%'」の部分で修正されました。また、Windows 10 Enterpriseへの対応もクエリの「Version LIKE '[1-9][0-9].%'」で修正されました。これで万全のように見えますが、実はそうではありません。

 Windows 10 Enterprise LTSB(SKU番号125)とWindows 10 Education(SKU番号121)は、Windows 10 Enterpriseがベースなので、DirectAccessをサポートしているはずです。しかし、Windows Server 2016のDirectAccessの既定のWMIフィルターでは、これらのエディションは除外されてしまうのです。DirectAccessでこれらのエディションをサポートする必要がある場合は、この点に留意する必要があります。

 次回は、Windows ServerのOperatingSystemSKUの謎解きをする予定です。

●筆者紹介
山市 良(やまいち りょう)
岩手県花巻市在住。Microsoft MVP:Cloud and Datacenter Management(Oct 2008 - Sep 2016)。SIer、IT出版社、中堅企業のシステム管理者を経て、フリーのテクニカルライターに。マイクロソフト製品、テクノロジーを中心に、IT雑誌、Webサイトへの記事の寄稿、ドキュメント作成、事例取材などを手掛ける。個人ブログは『山市良のえぬなんとかわーるど』。近著は『Windows Server 2016テクノロジ入門-完全版』(日経BP社)。

最終更新:7/19(水) 7:55
@IT