// uses Variants,ActiveX, ComObj ;
procedure TForm1.Button1Click(Sender: TObject);
const
wbemFlagForwardOnly = $00000020;
var
FSWbemLocator : OLEVariant;
FWMIService : OLEVariant;
wmiDiskDrives : OLEVariant;
wmiDiskPartitions : OLEVariant;
wmiLogicalDisks : OLEVariant;
wmiDiskDrive : OLEVariant;
wmiDiskPartition : OLEVariant;
wmiLogicalDisk : OLEVariant;
oEnum : IEnumvariant;
oEnum2 : IEnumvariant;
oEnum3 : IEnumvariant;
iValue : LongWord;
DeviceID : string;
Partitions : string;
SerNum,SerNumByDriveLetter : string;
begin;
FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
FSWbemLocator.Security_.privileges.addasstring('sedebugprivilege', true);
FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', '');
FWMIService.Security_.ImpersonationLevel := 3;
//Get the physical disk drive
wmiDiskDrives := FWMIService.ExecQuery('SELECT Caption, DeviceID,SerialNumber FROM Win32_DiskDrive','WQL',wbemFlagForwardOnly);
oEnum := IUnknown(wmiDiskDrives._NewEnum) as IEnumVariant;
while oEnum.Next(1, wmiDiskDrive, iValue) = 0 do
begin
SerNum := '';
Memo1.Lines.add(wmiDiskDrive.Caption);
if wmiDiskDrive.SerialNumber <> Null then
SerNum := UpperCase(String( wmiDiskDrive.SerialNumber));
Memo1.Lines.add('Serial Number : ' + SerNum +
' = ' + HexStrToStr(SerNum));
Partitions := '';
//Use the disk drive device id to find associated partition
DeviceID:=StringReplace(String(wmiDiskDrive.DeviceID),'\','\\',[rfReplaceAll]);
wmiDiskPartitions := FWMIService.ExecQuery(
WideString('ASSOCIATORS OF {Win32_DiskDrive.DeviceID="'+
DeviceID+'"} WHERE AssocClass = Win32_DiskDriveToDiskPartition'),
'WQL',wbemFlagForwardOnly);
oEnum2 := IUnknown(wmiDiskPartitions._NewEnum) as IEnumVariant;
while oEnum2.Next(1, wmiDiskPartition, iValue) = 0 do
begin
wmiLogicalDisks := FWMIService.ExecQuery(
WideString('ASSOCIATORS OF {Win32_DiskPartition.DeviceID="'+
String(wmiDiskPartition.DeviceID)+
'"} WHERE AssocClass = Win32_LogicalDiskToPartition'),
'WQL',wbemFlagForwardOnly);
oEnum3 := IUnknown(wmiLogicalDisks._NewEnum) as IEnumVariant;
while oEnum3.Next(1, wmiLogicalDisk, iValue) = 0 do
begin
if (wmiLogicalDisk.DeviceID = 'C:') AND
(wmiDiskDrive.SerialNumber <> Null) then
SerNumByDriveLetter := HexStrToStr(SerNum);
Partitions := Partitions + String(wmiLogicalDisk.DeviceID)+ ' ,';
wmiLogicalDisk:=Unassigned;
end;
wmiDiskPartition:=Unassigned;
end;
wmiDiskDrive:=Unassigned;
Memo1.Lines.Append('Partitions : ' + Partitions);
Memo1.Lines.add('=======================================');
end;
Memo1.Append('Disk Serial Number for C: is ' + SerNumByDriveLetter );
end;