VBScriptでWindows11のシステム仕様要件を取得するサンプルコード

VBScript

Windows 10 22H2のサポート期間の終了が2025年10月14日までで、まだまだ先だから大丈夫とはいえない状況になってきています。

皆さんもWindows 10からWindows 11へアップグレードしようと考えてるのではないでしょうか?

大企業になってくるとパソコンの数は、とても多く1台1台のパソコンがWindows 11のシステム仕様要件を満たしているか確認するのは大変です。

そんなWindows 11のシステム仕様要件をVBScriptで取得する記事を今回ご紹介します。

サンプルコードは、私自身が作成したオリジナルのプログラムです。

分かりやすくするために必要最低限のプログラムのみ書いています。

また、定数は大文字じゃないといった皆さん自身のルールがあるかもしれませんがご理解ください。

当記事は、実践編としてVBScriptの基本的な文法がわかる中級者の方にご紹介しています。

基本的な文法がわからない方は、初級編の記事も紹介しているのでそちらを参考にしてください。

Windows11のシステム仕様要件を取得する

サンプルコード

Const WINMGMTS = "winmgmts:{impersonationLevel=impersonate,authenticationLevel=pktPrivacy}!\\"
Const ROOT_CIMV2 = "\root\cimv2"
Const ROOT_STORAGE = "\root\microsoft\windows\storage"
Const ROOT_TPM = "\root\cimv2\security\microsofttpm"
Const vbHide = 0
Const vbEndWait = True

'管理者権限で実行
If WScript.Arguments.Count = 0 Then
	CreateObject("Shell.Application").ShellExecute "wscript.exe",WScript.ScriptFullName & " runas","","runas",1
	WScript.Quit
Else
End If

'ファイルシステムオブジェクトを作成
Dim objFso : Set objFso = CreateObject("Scripting.FileSystemObject")
'ログファイルパス
Dim strLogFile : strLogFile = objFso.GetParentFolderName(WScript.ScriptFullName) & "\Windows11のシステム仕様用件.csv"
'ファイルが存在しない場合に作成
If Not objFso.FileExists(strLogFile) Then objFso.CreateTextFile(strLogFile) : isCreate = True Else isCreate = False
'追記で開く
Dim objLogFile : Set objLogFile = objFso.OpenTextFile(strLogFile,8)
'項目名を書き込む
If isCreate Then objLogFile.WriteLine "マシン名,プロセッサ名,コア数,OSアーキテクチャ,メモリ,ストレージ,システムファームウェア,TPM,DirectX,WDDM,追加日時"

'マシン名を書き込む
Dim strComputerName : strComputerName = CreateObject("WScript.Network").ComputerName
objLogFile.Write strComputerName

'ルートの設定
Dim objRoot : Set objRoot = GetObject(WINMGMTS & strComputerName & ROOT_CIMV2)

'プロセッサ情報を取得するクエリ
Dim objQuery : Set objQuery = objRoot.ExecQuery("Select * From Win32_Processor")
'プロセッサ名とコア数を取得
For Each index In objQuery
	objLogFile.Write "," & index.Name & "," & index.NumberOfCores
	Exit For
Next

'OS情報を取得するクエリ
Set objQuery = objRoot.ExecQuery("Select * From Win32_OperatingSystem")
'OSアーキテクチャを取得
For Each index In objQuery
	objLogFile.Write "," & index.OSArchitecture
	Exit For
Next

'メモリ情報を取得するクエリ
Set objQuery = objRoot.ExecQuery("Select * From Win32_PhysicalMemory")
'メモリを取得
Dim intMemory : intMemory = 0
For Each index In objQuery
	intMemory = intMemory + (index.Capacity / 1024 / 1024 / 1024)
Next
objLogFile.Write "," & intMemory & "GB"

'ルートの設定
Set objRoot = GetObject(WINMGMTS & strComputerName & ROOT_STORAGE)

'ストレージ情報を取得するクエリ
Set objQuery = objRoot.ExecQuery("Select * From MSFT_PhysicalDisk")
'ストレージを取得
Dim intStorage : intStorage = 0
For Each index In objQuery
	intStorage = intStorage + (index.Size / 1024 / 1024 / 1024)
Next
objLogFile.Write "," & CInt(intStorage) & "GB"

'Shellオブジェクトを作成
Dim objShell : Set objShell = CreateObject("WScript.Shell")
'コンピュータ情報を取得
Set objQuery = objShell.Exec("PowerShell -WindowStyle Hidden -ExecutionPolicy RemoteSigned ""Get-ComputerInfo""")
'システムファームウェアを取得
Do While objQuery.StdOut.AtEndOfStream <> True
	'1行取得
	Dim strLine : strLine = objQuery.StdOut.ReadLine
	'Biosモードのみ取得する
	If Instr(strLine,"BiosFirmwareType") > 0 Then
		objLogFile.Write "," & Trim(Mid(strLine,Instr(strLine,":") + 1))
		Exit Do
	Else
	End If
Loop

'ルートの設定
Set objRoot = GetObject(WINMGMTS & strComputerName & ROOT_TPM)

'TPMを取得するクエリ
Set objQuery = objRoot.ExecQuery("Select * From Win32_Tpm")
'TPMを取得
For Each index In objQuery
	objLogFile.Write ",""" & index.SpecVersion & """"
Next

'一時ファイルパス
Dim strDxdiagFile : strDxdiagFile = objShell.ExpandEnvironmentStrings("%TEMP%") & "\workVbs_dxdiag.txt"
'dxdiag情報をファイルへ書き込む
objShell.Run "cmd /c dxdiag /t " & strDxdiagFile ,vbHide,vbEndWait
'読み取り専用として開く
Dim objWorkFile : Set objWorkFile = objFso.OpenTextFile(strDxdiagFile,1)
'1行ずつファイルを読み込む
Do While Not objWorkFile.AtEndOfStream
	'1行取得
	strLine = objWorkFile.ReadLine
	'DirectXとWDDMを取得する
	If Instr(strLine,"DirectX Version") > 0 Then
		objLogFile.Write "," & Trim(Mid(strLine,Instr(strLine,":") + 1))
	ElseIf Instr(strLine,"Driver Model") > 0 Then
		objLogFile.Write "," & Trim(Mid(strLine,Instr(strLine,":") + 1))
		Exit Do
	Else
	End If
Loop

'最後に改行
objLogFile.WriteLine "," & Now()

'後始末
objWorkFile.Close : Set objWorkFile = Nothing : objFso.DeleteFile(strDxdiagFile)
objLogFile.Close : Set objLogFile = Nothing
Set objQuery = Nothing
Set objShell = Nothing
Set objRoot = Nothing
Set objFso = Nothing

'処理完了確認
Msgbox "処理完了"

解説①:定数の宣言

TPMが2.0以上か?メモリが4GB以上?など最低限必要な仕様要件を取得するためのルートの値を定義しています。

解説②:管理者権限で実行

TPMの情報を取得するためには、管理者権限で実行する必要があります。

そのため、管理者権限でVBScriptを実行し直しています。

管理者権限で実行することで「このアプリがデバイスに変更を加えることを許可しますか?」と確認の通知が表示されますが、はいをクリックします。

解説③:ログファイルの作成

ログファイルは、vbsファイルと同階層に「Windows11のシステム仕様用件.csv」というファイル名で作成しています。

すでに存在する場合は、追記モードで開き、ヘッダー部分を書き込みません。

解説④:仕様要件の情報を取得

マシン名>プロセッサ名>コア数>OSアーキテクチャ>メモリ>ストレージ>システムファームウェア>TPM>DirectX>WDDM>追加日時の順で値を取得しています。

マシン名と追加日時について、取得した後に管理がしやすいように取得しているだけですのでプログラムから削除していただいても問題ありません。

そもそもWindows 11の仕様要件がわからない方は、「Win11 仕様要件」でググると一番上にMicrosoftの公式サイトの記事で説明しているのでそちらを確認しましょう!

システムファームウェアとDirectXとWDDMの情報は、Win_32クラスから取得する方法が見つからなかったため、PowerShellとdxdiagコマンドで値を取得しています。

PowerShellは、バージョン5.1から取得することを想定しています。

他のバージョンによっては、取得できない可能性がありますのでご注意ください。