Windowsライセンス認証結果をコマンドの標準出力から取得する方法


結論

cscriptにslmgrのパスを渡します。
状態確認だけであれば「/dli」オプション、もっと詳細な情報が知りたい場合は「/dlv」オプションを使用します。

C:\>cscript "C:\Windows\System32\slmgr.vbs" /dli

Microsoft (R) Windows Script Host Version 5.812
Copyright (C) Microsoft Corporation. All rights reserved.

名前: Windows(R), Core edition
説明: Windows(R) Operating System, RETAIL channel
プロダクト キーの一部: XXXXX
ライセンスの状態: ライセンスされています

経緯

きっかけは検証の自動化

皆さん、IaC(Infrastructure as Code)やってますか?
昨今ではアプリケーションだけでなく、インフラ界隈でも構築・検証を自動化するために(簡単な)コードを書くことが求められております。

ただ時代の潮流に乗るわけではありませんが、構築したWindowsServerのOS設定値が正しく設定されているかを確認するために「コンピュータの管理」やら「コントロールパネル」やら「サーバの役割・機能」やらをGUIで徘徊して確認してキャプチャを取って…という行為を毎回するのはバカバカしいな、というのは以前から感じておりました。
なので、汎用的なOS設定値を取得するようなコードをコマンドベースで書いて結果を取得して検証を自動化していく、という流れには大賛成なわけですが、WindowsServerの設定値をコマンドで確認していくにあたって、厄介なのがWindowsライセンス認証確認です。

slmgrはvbsである

Windowsライセンス認証をGUIで確認する場合、「システム」から確認するのが一般的かと思います。

この確認をCUIで行いたい場合に出てくるコマンドがslmgrですが…
slmgrによる確認結果は、メッセージボックスで表示されてしまいます。

C:\>slmgr /dli

忌々しいですよね、これ。
なんでコマンドで入力してるのにメッセージボックスで返してくるんや…
まぁそれは、slmgrがvbsであることに起因しているものと思われます。

C:\>where slmgr
C:\Windows\System32\slmgr.vbs

slmgr.vbsの2770行目くらいに、こんな記述があります。

slmgr.vbs
Private Sub LineFlush(str)
    WScript.Echo g_EchoString & str
    g_EchoString = ""
End Sub

WScript.Echoをvbs内に記述した場合、通常は対話向けであるWScriptにより処理されるため、メッセージボックスとして出力されているようです。

vbsのメッセージボックスを標準出力させる

Wscriptにより処理されているvbsを明示的にCscriptで処理させるには、Cscriptの引数としてvbsを渡してやればよいです。

C:\>cscript "C:\Windows\System32\slmgr.vbs" /dli

Microsoft (R) Windows Script Host Version 5.812
Copyright (C) Microsoft Corporation. All rights reserved.

名前: Windows(R), Core edition
説明: Windows(R) Operating System, RETAIL channel
プロダクト キーの一部: XXXXX
ライセンスの状態: ライセンスされています

これで、無事にWindowsライセンス認証結果を標準出力で返してもらうことができました。

なお、補足しておくと、WscriptとCscriptはいずれもWSH(Windows Script Host)というWindowsスクリプト実行環境で稼働する実行エンジンです。WscriptはGUIでの対話向け、Cscriptはコンソール操作向けの利用が想定されている点で異なります。

Wscript Cscript
本体のパス "C:\Windows\System32\wscript.exe" "C:\Windows\System32\cscript.exe"
用途 GUI(対話向け) CUI(コンソール操作)
WScript.Echo メッセージボックス コンソール標準出力

おわりに

ライセンス認証をコマンドベースで確認するのになんでこんな面倒なことをしなければいけないのかと思いますが、きっと今後はPowershellとかで簡単に認証結果を返してくるようになることでしょう。知らんけど。願望です。

記載の誤り等あればぜひご指摘をお願いします。

参考サイト

WscriptとCscriptの違い-WSH@Workshop
cscript と wscript の違い | 文字の出力方式