我已经有很长的,可以从微观,中读取信息的应用程序工作的一些(大多数)失败的更多的还是缺少一些,我与WMI和德尔福工作。 我现在面临的问题是,我需要列出属于每个HD,例如单位:HD1具有驱动器C :, d:等。
谢谢
我已经有很长的,可以从微观,中读取信息的应用程序工作的一些(大多数)失败的更多的还是缺少一些,我与WMI和德尔福工作。 我现在面临的问题是,我需要列出属于每个HD,例如单位:HD1具有驱动器C :, d:等。
谢谢
要关联的逻辑驱动器和物理磁盘必须使用Win32_DiskDrive
类和Win32_DiskDriveToDiskPartition
, Win32_LogicalDiskToPartition
ASSOCIATORS类。
试试这个样品。
{$APPTYPE CONSOLE}
uses
SysUtils,
ActiveX,
ComObj,
Variants;
function ListDrives : string;
var
FSWbemLocator : OLEVariant;
objWMIService : OLEVariant;
colDiskDrives : OLEVariant;
colLogicalDisks: OLEVariant;
colPartitions : OLEVariant;
objdiskDrive : OLEVariant;
objPartition : OLEVariant;
objLogicalDisk : OLEVariant;
oEnumDiskDrive : IEnumvariant;
oEnumPartition : IEnumvariant;
oEnumLogical : IEnumvariant;
iValue : LongWord;
DeviceID : string;
begin;
Result:='';
FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
objWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', '');
colDiskDrives := objWMIService.ExecQuery('SELECT DeviceID FROM Win32_DiskDrive');
oEnumDiskDrive := IUnknown(colDiskDrives._NewEnum) as IEnumVariant;
while oEnumDiskDrive.Next(1, objdiskDrive, iValue) = 0 do
begin
Writeln(Format('DeviceID %s',[string(objdiskDrive.DeviceID)]));
//Escape the `\` chars in the DeviceID value because the '\' is a reserved character in WMI.
DeviceID := StringReplace(objdiskDrive.DeviceID,'\','\\',[rfReplaceAll]);
//link the Win32_DiskDrive class with the Win32_DiskDriveToDiskPartition class
colPartitions := objWMIService.ExecQuery(Format('ASSOCIATORS OF {Win32_DiskDrive.DeviceID="%s"} WHERE AssocClass = Win32_DiskDriveToDiskPartition',[DeviceID]));
oEnumPartition := IUnknown(colPartitions._NewEnum) as IEnumVariant;
while oEnumPartition.Next(1, objPartition, iValue) = 0 do
begin
if not VarIsNull(objPartition.DeviceID) then
begin
Writeln(Format(' Partition %s',[string(objPartition.DeviceID)]));
//link the Win32_DiskPartition class with theWin32_LogicalDiskToPartition class.
colLogicalDisks := objWMIService.ExecQuery('ASSOCIATORS OF {Win32_DiskPartition.DeviceID="'+VarToStr(objPartition.DeviceID)+'"} WHERE AssocClass = Win32_LogicalDiskToPartition');
oEnumLogical := IUnknown(colLogicalDisks._NewEnum) as IEnumVariant;
while oEnumLogical.Next(1, objLogicalDisk, iValue) = 0 do
begin
Writeln(Format(' Logical Disk %s',[string(objLogicalDisk.DeviceID)]));
objLogicalDisk:=Unassigned;
end;
end;
objPartition:=Unassigned;
end;
objdiskDrive:=Unassigned;
end;
end;
begin
try
CoInitialize(nil);
try
ListDrives;
finally
CoUninitialize;
end;
except
on E:Exception do
Writeln(E.Classname, ':', E.Message);
end;
Readln;
end.
这将输出的东西,像这样
DeviceID \\.\PHYSICALDRIVE0
Partition Disk #0, Partition #0
Logical Disk F:
DeviceID \\.\PHYSICALDRIVE1
Partition Disk #1, Partition #0
Logical Disk C:
使用MagWMi包装和它的一行功能(一个班轮是缓慢的 - 但不是在需要速度的地方)。 我用它来制作2级磁盘列表。
但你要记住,可能没有任何信件中使用某些磁盘。 因此,这将告诉你根目录的信息,但不多。 磁盘C:可催生到多个物理磁盘。 并且可以在不信的都可以使用一些物理磁盘。
unit WMI_Helper;
interface
function WMINetDiskName(const disk: string { 'C:' - w/o slash } ): string;
function WMIPhysDiskName(const disk: string { 'C:' - w/o slash } ): string;
function WMIGetVolumeName(const disk: string { 'C:' - w/o slash } ): string;
implementation
uses magwmi, SysUtils, StrUtils, Windows, IOUtils;
function WMIGetProp(const query, param, resultProp: string): string;
begin
if MagWmiGetOneQ(StringReplace(query, '%s', param, []), resultProp, Result) <= 0
then
Result := '';
Result := Trim(Result);
end;
function WMINetDiskName(const disk: string { 'C:' - w/o slash } ): string;
const
req = 'select ProviderName from Win32_MappedLogicalDisk where DeviceID = "%s"';
prop = 'ProviderName';
var
i: integer;
begin
Result := WMIGetProp(req, disk, prop);
If not TPath.IsUNCPath(Result) then
exit('');
i := PosEx('\', TPath.GetPathRoot(Result), 3);
if i <= 0 then
exit('');
SetLength(Result, i - 1);
end;
function WMIPhysDiskName(const disk: string { 'C:' - w/o slash } ): string;
const
resultProp = 'DeviceID';
reqPart = 'ASSOCIATORS OF {Win32_LogicalDisk.DeviceID="%s"} WHERE ResultClass=Win32_DiskPartition';
reqDisk = 'ASSOCIATORS OF {Win32_DiskPartition.DeviceID="%s"} WHERE ResultClass=Win32_DiskDrive';
begin
Result := WMIGetProp(reqPart, disk, resultProp);
if Result > '' then
Result := WMIGetProp(reqDisk, Result, resultProp);
end;
function WMIGetVolumeName(const disk: string { 'C:' - w/o slash } ): string;
const
prop = 'VolumeName';
reqNet = 'select VolumeName from Win32_MappedLogicalDisk where DeviceID = "%s"';
reqPhy = 'select VolumeName from Win32_LogicalDisk where DeviceID = "%s"';
begin
Result := WMIGetProp(IfThen(GetDriveType(PChar(disk)) = DRIVE_REMOTE, reqNet,
reqPhy), disk, prop);
end;
end.