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. |