none
Excel VBA で WMIの ExecQuery("Select * From Win32_DiskDrive") について。 RRS feed

  • 質問

  • 環境
    OS Windows 10 64Bit バージョン 1809(OSビルド 17763.745)

    Office Professional 2013 32Bit

    Excel VBA で WMIの ExecQuery("Select * From Win32_DiskDrive") で「ストレージデバイス」の情報を得ると
    FirmwareRevision と SerialNumber の値が「ストレージデバイス」の接続方法によって違います

    Serial ATA  接続の時は正常
    USB(SCSI)   接続の時は 間違い、SSD の SerialNumber は文字列が逆です。

    実行は  WDC の HDD と Samsung の SSD で行いました。
    実行した結果。

    WDC WD5000LPVX-22V0TT0  (HDD)
    FirmwareRevision
    Serial ATA : 01.01A01 正常
    USB            : 6601  間違い

    SerialNumber
    Serial ATA : MAT01B6Q 正常
    USB            : 0   間違い

    Samsung SSD 750 EVO 120GB  (SSD)
    FirmwareRevision
    Serial ATA : 01.01A01 正常
    USB            : 6601  間違い

    SerialNumber
    Serial ATA : S2SGNWAH101868M 正常
    USB            : M868101HAWNGS2S 間違い

    使用してコードの一部

        Set objClassSet = Service.ExecQuery("Select * From Win32_DiskDrive")
        If Err.Number <> 0 Then
            Err.Clear
            GoTo ErrorEnd
        End If
        ReDim DDI(objClassSet.count - 1)
        For Each objItem In objClassSet
    ここで SerialNumber , SerialNumber の値を得る。
        Next objItem
    これは自分のミスなのか or バグなのか?
    どなたか教えて下さい、よろしくお願いします。
    2019年5月10日 4:44

すべての返信

  • Windows 10 Home 64bit EXCEL 2013(15.0...
    長い間、返信が付いていなかったので、私もDEMOてみました。

    記載コードは、下記を参考に書きました。
    参考サイト: WMI Fun !! http://www.wmifun.net/step/wst_06.html

        Set oLocator = New WbemScripting.SWbemLocator
        Set oService = oLocator.ConnectServer
        Set oClassSet = oService.ExecQuery("Select * From Win32_DiskDrive")
        On Error Resume Next
        For Each oClass In oClassSet
            'sMesStr = sMesStr &
     Debug.Print  oClass.Caption & "SerialNumber: " & oClass.SerialNumber & vbCrLf
        Next
    powershell で get-wmiobject win32_physicalmedia

     SerialNumberを確認しましたが、(若干コードが違いますが)。。。問題の再現が出来ませんでした。

    今回の一番大事な部分、取得、出力のタイミングや方法の情報がないので、やはり不明ですね。


    • 編集済み Takumi_Q 2019年5月19日 15:22
    2019年5月19日 15:20
  • 間違えがありました。

    ここで SerialNumber , SerialNumber の値を得る。
    で無く下記です。
    ここで Firmware , SerialNumber の値を得る。

    Takumi_Q 様
    返信ありがとうございます。
    色々とへぼ用がありなかなか此方に集中できません。

    取得、出力のタイミングや方法の情報

    CrystalDiskInfo では  USB(SCSI)  接続でも正常な Firmware , SerialNumber の値を得れます。

    情報としては下記の構造体で確定です、後は IDE , SCSI でのこの構造体の受け取り方の様です。
    SerialNumber は文字列が逆 は正常な処理で無いので文字列の置換が出来ていない為の様です。
    Win32_DiskDrive のクラスは下記のサイトに明記されています。(ただし c++ 用)

    Win32_DiskDrive class
    https://docs.microsoft.com/en-us/windows/desktop/cimwin32prov/win32-diskdrive

    Firmware , SerialNumber の値 は文字列で FirmwareRevision , SerialNumber で定義されています。
    [Dynamic, Provider("CIMWin32"), UUID("{8502C4B2-5FBB-11D2-AAC1-006008C78BC7}"), AMENDMENT]
    class Win32_DiskDrive : CIM_DiskDrive
    {
        string   FirmwareRevision;
        string   SerialNumber;
    }

    CrystalDiskInfo
    https://ja.osdn.net/projects/crystaldiskinfo/
    CrystalDiskInfo(c++です) はソースコードも公開しているのでダウンロードそて確認しようと思います。

    2019年5月20日 7:35