ManagementObjectSearcher searcher =
                    new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia");这个样子好像有部分的硬盘号无法获得,有什么办法可以解决这个问题?
请给出代码或可以调用的文件
急!谢谢!

解决方案 »

  1.   

    http://www.pconline.com.cn/pcjob/process/other/others/0410/471619.html 
      使用c#获得cpu,硬盘的序列号(源码)
      

  2.   

    C# code  try
                {
                    string path = Path.Combine(FileUtil.AppDir, "harddisk.txt");
                    StreamWriter writer = new StreamWriter(path, false);
                    ManagementObjectCollection instances = new ManagementClass("Win32_DiskDrive").GetInstances();
                    foreach (ManagementObject obj2 in instances)
                    {
                        foreach (PropertyData data in obj2.Properties)
                        {
                            writer.WriteLine("{0} = {1};", data.Name, data.Value);
                        }
                        _hardDiskID = (string) obj2.Properties["SerialNumber"].Value;
                        if (!string.IsNullOrEmpty(_hardDiskID) && !IsException)
                        {
                            writer.Close();
                            File.Delete(path);
                            break;
                        }
                        obj2.Dispose();
                    }
                    writer.Close();
                    instances.Dispose();
                }
                catch
                {
                }
      

  3.   

    using System;
    using System.Runtime.InteropServices;
    using  System.Management;
    namespace Hardware
    {
     /// <summary>
     /// Hardware_Mac 的摘要说明。
     /// </summary>
     public class HardwareInfo
     {
      //取机器名 
      public string GetHostName()
      {
       return System.Net.Dns.GetHostName(); 
      }
      //取CPU编号
      public String GetCpuID() 
      {
       try
       {
        ManagementClass mc = new ManagementClass("Win32_Processor");
        ManagementObjectCollection moc = mc.GetInstances();
          
        String strCpuID = null ;
        foreach( ManagementObject mo in moc ) 
        {
         strCpuID = mo.Properties["ProcessorId"].Value.ToString();
         break; 
        }
        return strCpuID;
       }
       catch
       {
        return "";
       }  }//end method
     
      //取第一块硬盘编号
      public String GetHardDiskID() 
      {
       try
       {
        ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia");
        String strHardDiskID = null ;
        foreach(ManagementObject mo in searcher.Get()) 
        {    
         strHardDiskID = mo["SerialNumber"].ToString().Trim();
         break;          
        }
        return strHardDiskID ;
       }
       catch
       {
        return "";
       }
      }//end   public enum NCBCONST 
      { 
       NCBNAMSZ   =16,      /* absolute length of a net name         */ 
       MAX_LANA   =254,      /* lana's in range 0 to MAX_LANA inclusive   */ 
       NCBENUM      =0x37,      /* NCB ENUMERATE LANA NUMBERS            */ 
       NRC_GOODRET   =0x00,      /* good return                              */ 
       NCBRESET    =0x32,      /* NCB RESET                        */ 
       NCBASTAT    =0x33,      /* NCB ADAPTER STATUS                  */ 
       NUM_NAMEBUF =30,      /* Number of NAME's BUFFER               */ 
      }   [StructLayout(LayoutKind.Sequential)] 
       public struct ADAPTER_STATUS 
      { 
       [MarshalAs(UnmanagedType.ByValArray, SizeConst=6)] 
       public byte[] adapter_address; 
       public byte   rev_major;  
       public byte   reserved0;  
       public byte   adapter_type;  
       public byte   rev_minor;  
       public ushort    duration;  
       public ushort    frmr_recv;  
       public ushort    frmr_xmit;  
       public ushort    iframe_recv_err;  
       public ushort    xmit_aborts;  
       public uint   xmit_success;  
       public uint   recv_success;  
       public ushort    iframe_xmit_err;  
       public ushort    recv_buff_unavail;  
       public ushort    t1_timeouts;  
       public ushort    ti_timeouts;  
       public uint   reserved1;  
       public ushort    free_ncbs;  
       public ushort    max_cfg_ncbs;  
       public ushort    max_ncbs;  
       public ushort    xmit_buf_unavail;  
       public ushort    max_dgram_size;  
       public ushort    pending_sess;  
       public ushort    max_cfg_sess;  
       public ushort    max_sess;  
       public ushort    max_sess_pkt_size;  
       public ushort    name_count; 
      }   [StructLayout(LayoutKind.Sequential)] 
       public struct NAME_BUFFER 
      {  
       [MarshalAs(UnmanagedType.ByValArray, SizeConst=(int)NCBCONST.NCBNAMSZ)] 
       public byte[] name; 
       public byte name_num;  
       public byte name_flags;  
      }   [StructLayout(LayoutKind.Sequential)] 
       public struct NCB 
      {  
       public byte  ncb_command;  
       public byte  ncb_retcode;  
       public byte  ncb_lsn;  
       public byte  ncb_num;  
       public IntPtr ncb_buffer;  
       public ushort ncb_length;  
       [MarshalAs(UnmanagedType.ByValArray, SizeConst=(int)NCBCONST.NCBNAMSZ)] 
       public byte[]  ncb_callname;  
       [MarshalAs(UnmanagedType.ByValArray, SizeConst=(int)NCBCONST.NCBNAMSZ)] 
       public byte[]  ncb_name;  
       public byte  ncb_rto;  
       public byte  ncb_sto;  
       public IntPtr ncb_post;  
       public byte  ncb_lana_num;  
       public byte  ncb_cmd_cplt;  
       [MarshalAs(UnmanagedType.ByValArray, SizeConst=10)] 
       public byte[] ncb_reserve; 
       public IntPtr ncb_event; 
      }   [StructLayout(LayoutKind.Sequential)] 
       public struct LANA_ENUM 
      {  
       public byte length;  
       [MarshalAs(UnmanagedType.ByValArray, SizeConst=(int)NCBCONST.MAX_LANA)] 
       public byte[] lana; 
      }   [StructLayout(LayoutKind.Auto)] 
       public struct ASTAT 
      {  
       public ADAPTER_STATUS adapt; 
       [MarshalAs(UnmanagedType.ByValArray, SizeConst=(int)NCBCONST.NUM_NAMEBUF)] 
       public NAME_BUFFER[] NameBuff; 
      } 
      public class Win32API 
      { 
       [DllImport("NETAPI32.DLL")] 
       public static extern char Netbios(ref NCB ncb); 
      } 
      
      public string GetMacAddress() 
      { 
       string addr=""; 
       try
       {
        int cb; 
        ASTAT adapter; 
        NCB Ncb=new NCB(); 
        char uRetCode; 
        LANA_ENUM lenum;     Ncb.ncb_command = (byte)NCBCONST.NCBENUM; 
        cb = Marshal.SizeOf(typeof(LANA_ENUM)); 
        Ncb.ncb_buffer = Marshal.AllocHGlobal(cb); 
        Ncb.ncb_length = (ushort)cb; 
        uRetCode = Win32API.Netbios(ref Ncb); 
        lenum = (LANA_ENUM)Marshal.PtrToStructure(Ncb.ncb_buffer, typeof(LANA_ENUM)); 
        Marshal.FreeHGlobal(Ncb.ncb_buffer); 
        if(uRetCode != (short)NCBCONST.NRC_GOODRET) 
         return "";     for(int i=0; i < lenum.length ;i++) 
        { 
         Ncb.ncb_command = (byte)NCBCONST.NCBRESET; 
         Ncb.ncb_lana_num = lenum.lana[i]; 
         uRetCode = Win32API.Netbios(ref Ncb); 
         if(uRetCode != (short)NCBCONST.NRC_GOODRET) 
          return "";      Ncb.ncb_command = (byte)NCBCONST.NCBASTAT; 
         Ncb.ncb_lana_num = lenum.lana[i]; 
         Ncb.ncb_callname[0]=(byte)'*'; 
         cb = Marshal.SizeOf(typeof(ADAPTER_STATUS)) + Marshal.SizeOf(typeof(NAME_BUFFER))*(int)NCBCONST.NUM_NAMEBUF; 
         Ncb.ncb_buffer = Marshal.AllocHGlobal(cb); 
         Ncb.ncb_length = (ushort)cb; 
         uRetCode = Win32API.Netbios(ref Ncb); 
         adapter.adapt = (ADAPTER_STATUS)Marshal.PtrToStructure(Ncb.ncb_buffer, typeof(ADAPTER_STATUS)); 
         Marshal.FreeHGlobal(Ncb.ncb_buffer);      if (uRetCode == (short)NCBCONST.NRC_GOODRET) 
         { 
          if(i>0) 
           addr += ":"; 
          addr = string.Format("{0,2:X}{1,2:X}{2,2:X}{3,2:X}{4,2:X}{5,2:X}", 
           adapter.adapt.adapter_address[0], 
           adapter.adapt.adapter_address[1], 
           adapter.adapt.adapter_address[2], 
           adapter.adapt.adapter_address[3], 
           adapter.adapt.adapter_address[4], 
           adapter.adapt.adapter_address[5]); 
         } 
        } 
       }
       catch
       {}
       return addr.Replace(' ', '0'); 
      }  }
    }
      

  4.   

    添加引用System.Management组件
    参考
      

  5.   

    调API/// <summary>
    /// 读取第一个硬盘信息
    /// </summary>
    /// <returns></returns>
    private static string ReadPhysicalDriveInNTWithZeroRights()
    {
        string result = string.Empty;
        const uint FILE_SHARE_READ = 0x00000001;
        const uint FILE_SHARE_WRITE = 0x00000002;
        const uint OPEN_EXISTING = 3;        int drive = 0;
            //  Try to get a handle to PhysicalDrive IOCTL, report failure
            //  and exit if can't.
            string driveName = "\\\\.\\PhysicalDrive" + drive.ToString();        //  Windows NT, Windows 2000, Windows XP - admin rights not required
            uint hPhysicalDriveIOCTL = Win32API.CreateFile(driveName, 0,
            FILE_SHARE_READ | FILE_SHARE_WRITE, 0,
            OPEN_EXISTING, 0, 0);        if (hPhysicalDriveIOCTL != 0)
            {
                Win32API.STORAGE_PROPERTY_QUERY query = new Win32API.STORAGE_PROPERTY_QUERY();
                uint cbBytesReturned = 0;            query.PropertyId = Win32API.STORAGE_PROPERTY_ID.StorageDeviceProperty;
                query.QueryType = Win32API.STORAGE_QUERY_TYPE.PropertyStandardQuery;            IntPtr descripPoint = Marshal.AllocHGlobal(1000);            int j = Marshal.SizeOf(query);
                if (0 != Win32API.DeviceIoControl(hPhysicalDriveIOCTL, 2954240,
                    ref query,
                    Marshal.SizeOf(query),
                    descripPoint,
                    1000,
                    ref cbBytesReturned, 0))
                {
                    Win32API.STORAGE_DEVICE_DESCRIPTOR descrip = (Win32API.STORAGE_DEVICE_DESCRIPTOR)
                        Marshal.PtrToStructure(descripPoint, typeof(Win32API.STORAGE_DEVICE_DESCRIPTOR));
                    result = (Marshal.PtrToStringAnsi((IntPtr)(descripPoint.ToInt32() + (int)descrip.SerialNumberOffset))).Trim();
                }            Marshal.FreeHGlobal(descripPoint);
                Win32API.CloseHandle((IntPtr)hPhysicalDriveIOCTL);
            }    return result;
    }
    public class Win32API
    {
        public enum STORAGE_PROPERTY_ID
        {
            StorageDeviceProperty = 0,
            StorageAdapterProperty
        }    public enum STORAGE_QUERY_TYPE
        {
            PropertyStandardQuery = 0,          // Retrieves the descriptor
            PropertyExistsQuery,                // Used to test whether the descriptor is supported
            PropertyMaskQuery,                  // Used to retrieve a mask of writeable fields in the descriptor
            PropertyQueryMaxDefined     // use to validate the value
        }
        [StructLayout(LayoutKind.Sequential)]
        public struct STORAGE_PROPERTY_QUERY
        {
            public STORAGE_PROPERTY_ID PropertyId;// ID of the property being retrieved
            public STORAGE_QUERY_TYPE QueryType;// Flags indicating the type of query being performed
            public System.IntPtr AdditionalParameters;// Space for additional parameters if necessary
        }
        public enum STORAGE_BUS_TYPE
        {
            BusTypeUnknown = 0x00,
            BusTypeScsi,
            BusTypeAtapi,
            BusTypeAta,
            BusType1394,
            BusTypeSsa,
            BusTypeFibre,
            BusTypeUsb,
            BusTypeRAID,
            BusTypeMaxReserved = 0x7F
        }    [StructLayout(LayoutKind.Sequential)]
        public struct STORAGE_DEVICE_DESCRIPTOR
        {
            public uint Version;
            public uint Size;
            public char DeviceType;
            public char DeviceTypeModifier;
            public byte RemovableMedia;
            public byte CommandQueueing;
            public uint VendorIdOffset;
            public uint ProductIdOffset;
            public uint ProductRevisionOffset;
            public uint SerialNumberOffset;
            public STORAGE_BUS_TYPE BusType;
            public uint RawPropertiesLength;
            public IntPtr RawDeviceProperties;
        }    [DllImport("kernel32.dll")]
        public static extern int DeviceIoControl(uint hDevice,
        uint dwIoControlCode,
        ref STORAGE_PROPERTY_QUERY lpInBuffer,
        int nInBufferSize,
        IntPtr lpOutBuffer,
        int nOutBufferSize,
        ref uint lpbytesReturned,
        int lpOverlapped);    [DllImport("kernel32.dll")]
        public static extern uint CreateFile(string lpFileName,
        uint dwDesiredAccess,
        uint dwShareMode,
        int lpSecurityAttributes,
        uint dwCreationDisposition,
        uint dwFlagsAndAttributes,
        int hTemplateFile);    [DllImport("kernel32.dll")]
        public static extern bool CloseHandle(IntPtr handle);}
      

  6.   


    /// <summary>
        /// 使用WMI方式获取硬盘信息
        /// </summary>
        public class WMI_HD
        {
           /// <summary>
           /// 获取硬盘唯一序列号(不是卷标号),可能需要以管理员身份运行程序
           /// </summary>
           /// <returns></returns>
            public static string GetHdId()
            {
                ManagementObjectSearcher wmiSearcher = new ManagementObjectSearcher();
                /*
                 * PNPDeviceID   的数据是由四部分组成的:   
      1、接口,通常有   IDE,ATA,SCSI;   
      2、型号   
      3、(可能)驱动版本号   
      4、(可能)硬盘的出厂序列号   
                 * 
                 * 
                 */
                //signature 需要程序以管理员身份运行(经过测试,2003系统上非管理员身份也可以运行,查相关资料说,可能在2000系统上获取的值为空)            wmiSearcher.Query = new SelectQuery(
                "Win32_DiskDrive",
                "",
                new string[] { "PNPDeviceID", "signature" }
                );
                ManagementObjectCollection myCollection = wmiSearcher.Get();
                ManagementObjectCollection.ManagementObjectEnumerator em =
                myCollection.GetEnumerator();
                em.MoveNext();
                ManagementBaseObject mo = em.Current;
                //string id = mo.Properties["PNPDeviceID"].Value.ToString().Trim();
                string id="";
                try
                {
                    //首先使用signature,SCSI硬盘可能没有该属性
                    if (mo.Properties["signature"] != null && mo.Properties["signature"].Value != null)
                        id = mo.Properties["signature"].Value.ToString();
                    else if (mo.Properties["PNPDeviceID"] != null && mo.Properties["PNPDeviceID"].Value != null)//防止意外
                        id = mo.Properties["PNPDeviceID"].Value.ToString();
                }
                catch
                {
                    if (mo.Properties["PNPDeviceID"] != null && mo.Properties["PNPDeviceID"].Value != null)//防止意外
                        id = mo.Properties["PNPDeviceID"].Value.ToString();
                }
                
                return id;
            }
        }
      

  7.   

    先查一下用哪个API 然后就应该简单了吧
      

  8.   

    要用API获取 
    或用DiskID32.dll获取 
    [DllImport("DiskID32.dll")] 
    private static extern long DiskID32(ref byte DiskModel,ref byte DiskID); 
    int j=0; 
    Byte[] buffer =new byte[31]; 
    Byte[] ID =new byte[31]; 
    DiskID32(ref buffer[0],ref ID[0]); http://topic.csdn.net/u/20090910/21/17aa85ca-ba01-407b-80ae-79360641ca6d.html?seed=472690931&r=59712438
      

  9.   

    说的大都还是用SELECT * FROM Win32_PhysicalMedia处理的,无法取到SATA和SCSI的硬盘序列号