増殖するOperatingSystemSKU(その1)――WMIクエリの謎解きその知識、ホントに正しい? Windowsにまつわる都市伝説(87)(1/2 ページ)

Windowsのエディションは「SKU」という番号で識別できることをご存じでしょうか。Windows Serverの場合は、インストールオプションでSKUが区別されることもあります。このSKUに関連して、今回はDirectAccessのセットアップで登場するWMIクエリの謎を解きます。

» 2017年07月18日 05時00分 公開
[山市良テクニカルライター]
「Windowsにまつわる都市伝説」のインデックス

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))
リスト1 「DirectAccess - Laptop only WMI filter」のWMIクエリ
画面1 画面1 Windows Server 2016のDirectAccessのセットアップで作成されるWMIフィルター「DirectAccess - Laptop only WMI filter」に含まれる2つのWMIクエリ

 この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
コマンドプロンプトの場合は「WMIC」コマンドで値を確認

PS C:\> (gwmi win32_computersystem).PCSystemType
PS C:\> (gwmi win32_operatingsystem).ProductType
PS C:\> (gwmi win32_operatingsystem).Version
PS C:\>  (gwmi win32_operatingsystem).OperatingSystemSKU
Windows PowerShellの場合は「gwmi」コマンドレット(Get-WmiObjectのエイリアス)で値を確認
画面2 画面2 WMIクエリに含まれる値は、ローカルコンピュータでは「WMIC」コマンドで簡単に取得できる

 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
リスト2 ローカルコンピュータがクエリに対してどう判断されるのかを確認するWSHスクリプト:testquery.vbs
画面3 画面3 「testquery.vbs」をさまざまな環境で実行してみたところ。2つのクエリが[o]となっている場合に、このWMIフィルターが設定されたGPOが適用されることになる
       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

スポンサーからのお知らせPR

注目のテーマ

Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。