本帖最后由 bcrun 于 2012-12-26 20:13:55 编辑

解决方案 »

  1.   

    本帖最后由 bcrun 于 2012-12-29 19:34:55 编辑
      

  2.   

    这是利用SMART接口获取硬盘序列号的代码.如果不能成功,不一定是代码的问题,运行环境也有很多因素会造成获取失败.比如,主板驱动不正常,硬盘驱动不正常,或者程序没有相应的权限等.建议你在不能正常获取的机器上运行一下HDTune这个硬盘检测软件,它好象也是利用SMART接口的,看看在info选项卡里能否得到Serial项的内容.如果HDTune能获取而你的程序不能获取,那时再找找原因不迟.
      

  3.   

    那请问,如果HDTune会不会也检测不到呢,怎么办?
    有没有不用SMART接口获取硬盘序列号的代码?
      

  4.   

    不使用SMART接口的话可能就只有自己写个驱动去直接与硬盘通讯了.这个我就没办法啦!
      

  5.   

    其实可以利用现成的比如Safengine里的那个SESDKDummy.dll,他直接可以返回所有硬件和bios的参数计算出来的一个码,你可以调用他的
      

  6.   

    不知道这个的输出有没有你要的SNConst strComputer As String = "."
    Dim strClass As String
    Dim wbemServices As Object
    Dim wbemObjectSet As Object
    Dim wbemObject As Object
    Dim p As Object
    Set wbemServices = GetObject("winmgmts:\\" & strComputer)
    Set wbemObjectSet = wbemServices.InstancesOf("CIM_DiskDrive")
    For Each wbemObject In wbemObjectSet
            Debug.Print "-------Properties---"
            For Each p In wbemObject.Properties_
                    Debug.Print p.Name; ":"; ConvPVtoStr(p.Value)
            Next
            Debug.Print "-------System Properties---"
            For Each p In wbemObject.SystemProperties_
                    Debug.Print p.Name; ":"; ConvPVtoStr(p.Value)
            Next
    Next-------Properties---
    Availability:
    BytesPerSector:512
    Capabilities:3,4
    CapabilityDescriptions:
    Caption:FUJITSU MJA2250BH G2
    CompressionMethod:
    ConfigManagerErrorCode:0
    ConfigManagerUserConfig:False
    CreationClassName:Win32_DiskDrive
    DefaultBlockSize:
    Description:磁盘驱动器
    DeviceID:\\.\PHYSICALDRIVE0
    ErrorCleared:
    ErrorDescription:
    ErrorMethodology:
    Index:0
    InstallDate:
    InterfaceType:IDE
    LastErrorCode:
    Manufacturer:(标准磁盘驱动器)
    MaxBlockSize:
    MaxMediaSize:
    MediaLoaded:True
    MediaType:Fixed   hard disk media
    MinBlockSize:
    Model:FUJITSU MJA2250BH G2
    Name:\\.\PHYSICALDRIVE0
    NeedsCleaning:
    NumberOfMediaSupported:
    Partitions:4
    PNPDeviceID:IDE\DISKFUJITSU_MJA2250BH_G2____________________0084001C\5&4AEFDA8&0&0.0.0
    PowerManagementCapabilities:
    PowerManagementSupported:
    SCSIBus:0
    SCSILogicalUnit:0
    SCSIPort:0
    SCSITargetId:0
    SectorsPerTrack:63
    Signature:1064714101
    Size:250056737280
    Status:OK
    StatusInfo:
    SystemCreationClassName:Win32_ComputerSystem
    SystemName:BJZJ-YANGWEI
    TotalCylinders:30401
    TotalHeads:255
    TotalSectors:488392065
    TotalTracks:7752255
    TracksPerCylinder:255
    -------System Properties---
    __PATH:\\BJZJ-YANGWEI\root\cimv2:Win32_DiskDrive.DeviceID="\\\\.\\PHYSICALDRIVE0"
    __NAMESPACE:root\cimv2
    __SERVER:BJZJ-YANGWEI
    __DERIVATION:CIM_DiskDrive,CIM_MediaAccessDevice,CIM_LogicalDevice,CIM_LogicalElement,CIM_ManagedSystemElement
    __PROPERTY_COUNT:49
    __RELPATH:Win32_DiskDrive.DeviceID="\\\\.\\PHYSICALDRIVE0"
    __DYNASTY:CIM_ManagedSystemElement
    __SUPERCLASS:CIM_DiskDrive
    __CLASS:Win32_DiskDrive
    __GENUS:2
      

  7.   

    CBool(DeviceIoControl(这个是向驱动层读取信息的,如果读取失败,估计很难
      

  8.   

    目前网上流行的程序只能取得IDE硬盘物理序列号,SATA硬盘物理序列号不好获取,跟SATA驱动程序有关。
      

  9.   


    你说错了,网上N多程序都可以返回SATA硬盘的,我硬盘就是SATA一样返回得到序列号
      

  10.   

    我觉得你说的对,现在在做个案子,需要获取到一个通过USB3.0 controller连接的SATA HDD的model name和firmware reversion,之前不能读取,读取到的信息都是这个USB3.0 controller信息,然后请厂商更改了FW可以显示连接的SATA HDD信息。通过wmi读的话只能读到model name ,其他信息全部错误和读不到。然后用HD Tunes和CrystalDiskInfo这些软件都可读取到正确的信息。查了下这些软件原理说是通过读取smart来获取,可以通过wmi和deviceidcontrol的方法去读,但是,问题又来了,我找了相关smartview等查看smart和用wmi的MSStorageDriver_ATAPISmartData都读不到,这个电脑更不不能显示smart信息,所以可能是通过其他方式获取到smart信息的,不知道你还有这方面获取smart信息的方法吗?有deviceidcontrol完整code吗?谢谢。