WMIクラスによって取得されたデータに依存できますか?

いくつかのWin32_xxxx WMIクラスの例を使用すると、指定されたクラスによって返されるオブジェクトプロパティの少なくとも一部が、これらのプロパティの実際の値にまったく対応しないことが示されています。



以下は、Win32_CDROMDrive、Win32_DiskDrive、Win32_DiskPartition、Win32_LogicalDisk、Win32_Volumeを発行するWMIクラスの例です。出力情報は、控えめに言っても、真ではないか、非常に不便な形式で発行されるか、単に省略されることが示されています。 Microsoft Scripting Guyチームによって開発されたScriptmaticV2.htaは、WMIクラスへのWQLクエリを実行するためのスタンドとして使用されます。 ScriptomaticV2.htaは、VBS、JS、Perl、Pythonをサポートしています。 後者の2つがないため、JSとVBSの結果のみが使用されました。 したがって、PerlやPythonが正しい情報を提供してくれた場合、前述のWMIクラスの開発者に事前に謝罪します。 さらに、C#、C ++プログラムで同じWMIクラスを使用することで、結果が正しく出力されることを期待しています。



1. オブジェクトの作成またはマウントの日付が無効または省略されている



プロパティリストの上記のすべてのクラスには、「InstallDate」というプロパティが含まれています。 Windowsレジストリのこのプロパティは、REG_QWORDに対応しています。 Windows 8.1+(8.1およびすべてのWindows 10ビルド)CDROMDrive、DiskDriveでは、この値はInitialTimeStampに格納され、アドレス指定されます



HKLM \ SYSTEM \ CurrentControlSet \ Enum \ SCSI \\デバイスパラメータ\ StorPort



InitialTimeStamp値はNULLの場合がありますが、ほとんどの場合、Microsoftのドキュメントで完全に説明されている形式で非常に実際の日付が含まれています。



「イベントが生成される時間を示す一意の値。

これは、1601年1月1日以降の100ナノ秒間隔の数を表す64ビットのFILETIME値です。情報は協定世界時(UTC)形式です。 このプロパティは__Eventから継承されます。 この値を他の時間形式に変換するには、SWbemDateTimeのメソッドSetFileTimeおよびGetFileTimeを使用します。



どうやら、Win32-WMIクラスの開発者はSWbemDateTimeメソッドも使用したくなかったため、InstallDateフィールドでJSコードを発行すると、常にnull日付が置換され、VBSコードを発行するとこのフィールドは控えめに省略されます。 しかし、結局のところ、上記の形式の64ビットQWORD番号をミリ秒単位の日付を表す数値に変換するためのメソッドは必要ありません。これに基づいて、Dateオブジェクトを作成できます。 これには初等算術が必要です。



2. 一貫性のないデータ、フィールドInterfaceType、Win32_DiskDriveのエラー



インデックス:0

InstallDate:nullの日付は、Sun Jul 19 08:12:08 UTC + 0300 2015

InterfaceType:IDE

...

モデル:ST9320423AS

名前:\\。\ PHYSICALDRIVE0

...

PNPDeviceID:SCSI \ DISK&VEN_&PROD_ST9320423AS \ 4&3516B3B5&0&000000



誰かがInterfaceTypeフィールドの値の合理的な説明を与えることができます。これは、以下に示すPNPDeviceIDと、HKLM \ SYSTEM \ CurrentControlSet \ Enum \のWindows 8.1からIDEインターフェイスがなく、最後にWindows 7のみに存在したという事実と直接矛盾します?



3. フィールドSerialNumberの負の値、クラスWin32_DiskDrive、Win32_Volumeによる署名



シリアル番号:日立HT100219FCC400NEJTBU5G

署名:-1498719820

...

目的:null

QuotasEnabled:false

QuotasIncomplete:false

クォータの再構築:false

シリアル番号:-1408044882



これは一般的にお気に入りの「チップ」であり、完全に消化できない形式で非常に重要な情報を発行します。 SerialNumberとSignatureは両方とも、16番目の形式での読み取りに使用されます。



4. Gptフォーマットのディスク、Win32_DiskPartitionクラスの誤ったパーティションインデックス



キャプション:ディスク#3、パーティション#0

...

説明:GPT:基本データ



さて、私に説明してください、「基本データ」のようなGptフォーマットのパーティションはインデックス0を取得しました。 当然のことながら、パーティションリスト内のWin32_DiskPartition MSRパーティションは一般に無視されます。



5. JSの場合はNULLを含むフィールド、WQLクエリのすべてのオブジェクトの場合はVBSの場合は空のフィールドの存在



例として、Win32_VolumeクラスのAccessプロパティとDescriptionプロパティの値を引用できます。 2つの内部ディスク、2つの仮想DVD-ROM、Gptフォーマットのパーティションを持ついくつかのVHD、USBディスク、SDカード、フラッシュドライブなど、9つのマウントされたデバイスがあり、16のボリュームがあり、すべてのフィールドにJSのNULLが含まれています-VBS発行の場合は発行または空。 問題は、示されたプロパティの少なくとも1つがデバイスにとって重要であるために、デバイスが配置されているボリュームは何ですか? それができない場合、なぜこれらのプロパティを結果に含めるのですか?

PS、「gwmi win32_volume」で確認し、すべてのボリュームがAccess、Descriptionプロパティに空の値を返しました。



おわりに



この短い、おそらく過度に感情的な出版物の主なポイントは、コードでWMIクラスを使用するすべての人の注意を引き、抽出されたデータを批判的に評価し、他のソースから再チェックすることです。 上記のWin32クラスと同様に、MSFTクラスは常に正しい情報を提供しますが、署名フィールドに負の数値を発行することによっても罪を犯します。



All Articles