Subversion Repositories userdetect2

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
89 daniel-mar 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.