Subversion Repositories userdetect2

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. // http://stackoverflow.com/questions/5202270/in-delphi7-how-can-i-retrieve-hard-disk-unique-serial-number
  2.  
  3. unit hddinfo;
  4.  
  5. interface
  6.  
  7. function GetDiskSerial(const Drive:AnsiChar):string;
  8.  
  9. implementation
  10.  
  11. uses
  12.   SysUtils,
  13.   ActiveX,
  14.   ComObj,
  15.   Variants;
  16.  
  17. function GetDiskSerial(const Drive:AnsiChar):string;
  18. var
  19.   FSWbemLocator  : OLEVariant;
  20.   objWMIService  : OLEVariant;
  21.   colDiskDrives  : OLEVariant;
  22.   colLogicalDisks: OLEVariant;
  23.   colPartitions  : OLEVariant;
  24.   objDiskDrive   : OLEVariant;
  25.   objPartition   : OLEVariant;
  26.   objLogicalDisk : OLEVariant;
  27.   oEnumDiskDrive : IEnumvariant;
  28.   oEnumPartition : IEnumvariant;
  29.   oEnumLogical   : IEnumvariant;
  30.   iValue         : LongWord;
  31.   DeviceID       : string;
  32. begin;
  33.   Result:='';
  34.   FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  35.   objWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', ''); //Connect to the WMI
  36.   colDiskDrives := objWMIService.ExecQuery('SELECT * FROM Win32_DiskDrive','WQL',0);
  37.   oEnumDiskDrive:= IUnknown(colDiskDrives._NewEnum) as IEnumVariant;
  38.   while oEnumDiskDrive.Next(1, objDiskDrive, iValue) = 0 do
  39.   begin
  40.    DeviceID        := StringReplace(objDiskDrive.DeviceID,'\','\\',[rfReplaceAll]); //Escape the `\` chars in the DeviceID value because the '\' is a reserved character in WMI.
  41.    colPartitions   := objWMIService.ExecQuery(Format('ASSOCIATORS OF {Win32_DiskDrive.DeviceID="%s"} WHERE AssocClass = Win32_DiskDriveToDiskPartition',[DeviceID]));//link the Win32_DiskDrive class with the Win32_DiskDriveToDiskPartition class
  42.    oEnumPartition  := IUnknown(colPartitions._NewEnum) as IEnumVariant;
  43.     while oEnumPartition.Next(1, objPartition, iValue) = 0 do
  44.      begin
  45.         colLogicalDisks := objWMIService.ExecQuery('ASSOCIATORS OF {Win32_DiskPartition.DeviceID="'+objPartition.DeviceID+'"} WHERE AssocClass = Win32_LogicalDiskToPartition'); //link the Win32_DiskPartition class with theWin32_LogicalDiskToPartition class.
  46.         oEnumLogical  := IUnknown(colLogicalDisks._NewEnum) as IEnumVariant;
  47.           while oEnumLogical.Next(1, objLogicalDisk, iValue) = 0 do
  48.           begin
  49.             if objLogicalDisk.DeviceID=(Drive+':')  then //compare the device id
  50.             begin
  51.                 Result:=objDiskDrive.SerialNumber;
  52.                 Exit;
  53.             end;
  54.            objLogicalDisk:=Unassigned;
  55.           end;
  56.         objPartition:=Unassigned;
  57.      end;
  58.   end;
  59. end;
  60.  
  61. end.
  62.