Determine how much free memory a computer has
Use the class Win32_OperatingSystem and the FreePhysicalMemory property.
const wbemFlagForwardOnly = $00000020; var FSWbemLocator : OLEVariant; FWMIService : OLEVariant; FWbemObjectSet: OLEVariant; FWbemObject : OLEVariant; oEnum : IEnumvariant; iValue : LongWord; begin; FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\cimv2', '', ''); FWbemObjectSet:= FWMIService.ExecQuery('SELECT FreePhysicalMemory FROM Win32_OperatingSystem','WQL',wbemFlagForwardOnly); oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; if oEnum.Next(1, FWbemObject, iValue) = 0 then begin Writeln(Format('Available Physical Memory %d',[Integer(FWbemObject.FreePhysicalMemory)])); FWbemObject:=Unassigned; end; end;
Determine whether a computer has a DVD drive
Use the Win32_CDROMDrive class and check for the acronym DVD in the Name or DeviceID property.
const wbemFlagForwardOnly = $00000020; var FSWbemLocator : OLEVariant; FWMIService : OLEVariant; FWbemObjectSet: OLEVariant; FWbemObject : OLEVariant; oEnum : IEnumvariant; iValue : LongWord; begin; FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\cimv2', '', ''); FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_CDROMDrive','WQL',wbemFlagForwardOnly); oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; while oEnum.Next(1, FWbemObject, iValue) = 0 do begin Writeln(Format('DeviceID %s',[FWbemObject.DeviceID])); Writeln(Format('Description %s',[FWbemObject.Description])); Writeln(Format('Name %s',[FWbemObject.Name])); Writeln(''); FWbemObject:=Unassigned; end; end;
Determine how much RAM is installed in a computer
Use the Win32_ComputerSystem class and check the value of the TotalPhysicalMemory property.
const wbemFlagForwardOnly = $00000020; var FSWbemLocator : OLEVariant; FWMIService : OLEVariant; FWbemObjectSet: OLEVariant; FWbemObject : OLEVariant; oEnum : IEnumvariant; iValue : LongWord; begin; FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\cimv2', '', ''); FWbemObjectSet:= FWMIService.ExecQuery('SELECT TotalPhysicalMemory FROM Win32_ComputerSystem','WQL',wbemFlagForwardOnly); oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; if oEnum.Next(1, FWbemObject, iValue) = 0 then begin Writeln(Format('Total Physical Memory %d',[Integer(FWbemObject.TotalPhysicalMemory)])); FWbemObject:=Unassigned; end; end;
Determine if a computer has more than one processor
Use the Win32_ComputerSystem class and the property NumberOfProcessors.
const wbemFlagForwardOnly = $00000020; var FSWbemLocator : OLEVariant; FWMIService : OLEVariant; FWbemObjectSet: OLEVariant; FWbemObject : OLEVariant; oEnum : IEnumvariant; iValue : LongWord; begin; FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\cimv2', '', ''); FWbemObjectSet:= FWMIService.ExecQuery('SELECT NumberOfProcessors FROM Win32_ComputerSystem ','WQL',wbemFlagForwardOnly); oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; if oEnum.Next(1, FWbemObject, iValue) = 0 then begin Writeln(Format('Number Of Processors %d',[Integer(FWbemObject.NumberOfProcessors)])); FWbemObject:=Unassigned; end; end;
Determine whether a computer has a PCMCIA slot
Use the Win32_PCMCIAController class.
const wbemFlagForwardOnly = $00000020; var FSWbemLocator : OLEVariant; FWMIService : OLEVariant; FWbemObjectSet: OLEVariant; FWbemObject : OLEVariant; oEnum : IEnumvariant; iValue : LongWord; c : Integer; begin; FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\cimv2', '', ''); FWbemObjectSet:= FWMIService.ExecQuery('SELECT DeviceID FROM Win32_PCMCIAController','WQL',wbemFlagForwardOnly); oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; c:=0; while oEnum.Next(1, FWbemObject, iValue) = 0 do begin inc(c); FWbemObject:=Unassigned; end; Writeln(Format('Number of PCMCIA slots %d',[c])); end;
Identify devices that are not working (those marked with an exclamation point icon in Device Manager)
Use the Win32_PnPEntity class and use the following clause in your WQL query. WHERE ConfigManagerErrorCode <> 0.
const wbemFlagForwardOnly = $00000020; var FSWbemLocator : OLEVariant; FWMIService : OLEVariant; FWbemObjectSet: OLEVariant; FWbemObject : OLEVariant; oEnum : IEnumvariant; iValue : LongWord; begin; FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\cimv2', '', ''); FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_PnPEntity WHERE ConfigManagerErrorCode <> 0','WQL',wbemFlagForwardOnly); oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; while oEnum.Next(1, FWbemObject, iValue) = 0 do begin Writeln(Format('Class GUID %s',[String(FWbemObject.ClassGUID)])); Writeln(Format('Description %s',[String(FWbemObject.Description)])); Writeln(Format('Device ID %s',[String(FWbemObject.DeviceID)])); Writeln(Format('Manufacturer %s',[String(FWbemObject.Manufacturer)])); Writeln(Format('Name %s',[String(FWbemObject.Name)])); Writeln(Format('PNP Device ID %s',[String(FWbemObject.PNPDeviceID)])); Writeln(''); FWbemObject:=Unassigned; end; end;
Determine the properties of the mouse used on computer
Use the Win32_PointingDevice class. This returns the properties of all pointing devices, not just mouse devices.
const wbemFlagForwardOnly = $00000020; var FSWbemLocator : OLEVariant; FWMIService : OLEVariant; FWbemObjectSet: OLEVariant; FWbemObject : OLEVariant; oEnum : IEnumvariant; iValue : LongWord; begin; FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\cimv2', '', ''); FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_PointingDevice','WQL',wbemFlagForwardOnly); oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; while oEnum.Next(1, FWbemObject, iValue) = 0 do begin Writeln(Format('Device ID %s',[String(FWbemObject.DeviceID)])); Writeln(Format('Description %s',[String(FWbemObject.Description)])); Writeln(Format('Manufacturer %s',[String(FWbemObject.Manufacturer)])); Writeln(Format('Device Interface %s',[String(FWbemObject.DeviceInterface)])); Writeln(Format('PNP Device ID %s',[String(FWbemObject.PNPDeviceID)])); if not VarIsNull(FWbemObject.DoubleSpeedThreshold) then Writeln(Format('Double Speed Threshold %d',[Integer(FWbemObject.DoubleSpeedThreshold)])); if not VarIsNull(FWbemObject.Resolution) then Writeln(Format('Resolution %d',[Integer(FWbemObject.Resolution)])); if not VarIsNull(FWbemObject.SampleRate) then Writeln(Format('Sample Rate %d',[Integer(FWbemObject.SampleRate)])); if not VarIsNull(FWbemObject.Synch) then Writeln(Format('Synch %d',[Integer(FWbemObject.Synch)])); Writeln(''); FWbemObject:=Unassigned; end; end;
Determine the speed of a processor installed in a computer
Use the Win32_Processor class and check the value of the MaxClockSpeed property.
const wbemFlagForwardOnly = $00000020; var FSWbemLocator : OLEVariant; FWMIService : OLEVariant; FWbemObjectSet: OLEVariant; FWbemObject : OLEVariant; oEnum : IEnumvariant; iValue : LongWord; begin; FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\cimv2', '', ''); FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_Processor','WQL',wbemFlagForwardOnly); oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; while oEnum.Next(1, FWbemObject, iValue) = 0 do begin Writeln(Format('Processor Id %s',[String(FWbemObject.ProcessorId)])); Writeln(Format('Max Clock Speed %d',[Integer(FWbemObject.MaxClockSpeed)])); Writeln(''); FWbemObject:=Unassigned; end; end;
Determine whether a computer is a tower, a mini-tower, a laptop, and so on
Use the Win32_SystemEnclosure class and check the value of the ChassisType property.
Value | Meaning |
---|---|
|
Other |
|
Unknown |
|
Desktop |
|
Low Profile Desktop |
|
Pizza Box |
|
Mini Tower |
|
Tower |
|
Portable |
|
Laptop |
|
Notebook |
|
Hand Held |
|
Docking Station |
|
All in One |
|
Sub Notebook |
|
Space-Saving |
|
Lunch Box |
|
Main System Chassis |
|
Expansion Chassis |
|
SubChassis |
|
Bus Expansion Chassis |
|
Peripheral Chassis |
|
Storage Chassis |
|
Rack Mount Chassis |
|
Sealed-Case PC |
const wbemFlagForwardOnly = $00000020; var FSWbemLocator : OLEVariant; FWMIService : OLEVariant; FWbemObjectSet: OLEVariant; FWbemObject : OLEVariant; oEnum : IEnumvariant; iValue : LongWord; i : integer; begin; FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\cimv2', '', ''); FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_SystemEnclosure','WQL',wbemFlagForwardOnly); oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; if oEnum.Next(1, FWbemObject, iValue) = 0 then begin for i := VarArrayLowBound(FWbemObject.ChassisTypes, 1) to VarArrayHighBound(FWbemObject.ChassisTypes, 1) do Writeln(Format('Chassis Types %d',[Integer(FWbemObject.ChassisTypes[i])])); FWbemObject:=Unassigned; end; end;
Get the serial number and asset tag of a computer
Use the Win32_SystemEnclosure class, and the properties SerialNumber and SMBIOSAssetTag.
const wbemFlagForwardOnly = $00000020; var FSWbemLocator : OLEVariant; FWMIService : OLEVariant; FWbemObjectSet: OLEVariant; FWbemObject : OLEVariant; oEnum : IEnumvariant; iValue : LongWord; begin; FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\cimv2', '', ''); FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_SystemEnclosure','WQL',wbemFlagForwardOnly); oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; if oEnum.Next(1, FWbemObject, iValue) = 0 then begin if not VarIsNull(FWbemObject.PartNumber) then Writeln(Format('Part Number %s',[String(FWbemObject.PartNumber)])); if not VarIsNull(FWbemObject.SerialNumber) then Writeln(Format('Serial Number %s',[String(FWbemObject.SerialNumber)])); if not VarIsNull(FWbemObject.SMBIOSAssetTag) then Writeln(Format('SMBIOS Asset Tag %s',[String(FWbemObject.SMBIOSAssetTag)])); FWbemObject:=Unassigned; end; end;
Determine what kind of device is plugged into a USB port
Use the Win32_USBHub class and check the Description property. This property may have a value such as “Mass Storage Device” or “Printing Support”.
const wbemFlagForwardOnly = $00000020; var FSWbemLocator : OLEVariant; FWMIService : OLEVariant; FWbemObjectSet: OLEVariant; FWbemObject : OLEVariant; oEnum : IEnumvariant; iValue : LongWord; begin; FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\cimv2', '', ''); FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_USBHub','WQL',wbemFlagForwardOnly); oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; while oEnum.Next(1, FWbemObject, iValue) = 0 do begin if not VarIsNull(FWbemObject.DeviceID) then Writeln(Format('Device ID %s',[String(FWbemObject.DeviceID)])); if not VarIsNull(FWbemObject.PNPDeviceID) then Writeln(Format('PNP Device ID %s',[String(FWbemObject.PNPDeviceID)])); if not VarIsNull(FWbemObject.Description) then Writeln(Format('Description %s',[String(FWbemObject.Description)])); Writeln; FWbemObject:=Unassigned; end; end;
This post is based in the MSDN entry WMI Tasks: Computer Hardware
October 22, 2011 at 10:30 am
It appears that FWbemObject.FreePhysicalMemory is not returning the correct result.
Format( ‘%s’, [ string( FWbemObject.FreePhysicalMemory ) ] ) returns 5,808,468 bytes.
GlobalMemoryStatusEx( Memory );
Format( ‘%s’, [IntToStr( Memory.ullAvailPhys ) ) ] returns 6,011,977,728 bytes which is correct.
Can you confirm this?
October 22, 2011 at 10:38 am
this was tested on two different pc’s on Windows 7. FreePhysicalMemory was incorrect on both pc’s.
October 22, 2011 at 3:35 pm
The FreePhysicalMemory property returns the Number, in kilobytes, of physical memory currently unused and available.
so you must multiply the value returned for this property.
Check this sample
Remember which can exist small differences because the physical memory can be released or reserved betwen the functions calls.
October 22, 2011 at 5:56 pm
I get the correct results now…. This is a great blog…
Thank-you.
October 23, 2011 at 12:55 pm
Running Windows 7 on a Dell Studio XPS 9100 box. This function returns “Unknown”. System Information Shows:
Intel(R) ICH10 Family USB Enhanced Host Controller – 3A3A PCI\VEN_8086&DEV_3A3A&SUBSYS_04821028&REV_00\3&11583659&0&EF
Intel(R) ICH10 Family USB Enhanced Host Controller – 3A3C PCI\VEN_8086&DEV_3A3C&SUBSYS_04821028&REV_00\3&11583659&0&D7
Intel(R) ICH10 Family USB Universal Host Controller – 3A34 PCI\VEN_8086&DEV_3A34&SUBSYS_04821028&REV_00\3&11583659&0&E8
Intel(R) ICH10 Family USB Universal Host Controller – 3A35 PCI\VEN_8086&DEV_3A35&SUBSYS_04821028&REV_00\3&11583659&0&E9
Intel(R) ICH10 Family USB Universal Host Controller – 3A36 PCI\VEN_8086&DEV_3A36&SUBSYS_04821028&REV_00\3&11583659&0&EA
Intel(R) ICH10 Family USB Universal Host Controller – 3A37 PCI\VEN_8086&DEV_3A37&SUBSYS_04821028&REV_00\3&11583659&0&D0
Intel(R) ICH10 Family USB Universal Host Controller – 3A38 PCI\VEN_8086&DEV_3A38&SUBSYS_04821028&REV_00\3&11583659&0&D1
Intel(R) ICH10 Family USB Universal Host Controller – 3A39 PCI\VEN_8086&DEV_3A39&SUBSYS_04821028&REV_00\3&11583659&0&D2
Did I make a mistake?
function WMIGetNumberOfPCMCIASlots: string;
// Get Number Of PCMCIA Slots
const
wbemFlagForwardOnly = $00000020;
var
FSWbemLocator: OleVariant;
FWMIService: OleVariant;
FWbemObjectSet: OleVariant;
FWbemObject: OleVariant;
oEnum: IEnumvariant;
iValue: LongWord;
begin
FSWbemLocator := CreateOleObject( ‘WbemScripting.SWbemLocator’ );
FWMIService := FSWbemLocator.ConnectServer( ‘localhost’, ‘root\cimv2’, ”, ” );
FWbemObjectSet := FWMIService.ExecQuery( ‘SELECT * FROM Win32_PCMCIAController’, ‘WQL’, wbemFlagForwardOnly );
oEnum := IUnknown( FWbemObjectSet._NewEnum ) as IEnumvariant;
if oEnum.Next( 1, FWbemObject, iValue ) = 0 then
begin
if not VarIsNull( FWbemObject.Count ) then
Result := Format( ‘%d’, [ Integer( FWbemObject.Count ) ] )
else
Result := ‘Unknown’;
FWbemObject := Unassigned;
end
else
Result := ‘Unknown’;
end;
October 23, 2011 at 11:07 pm
Try the new updated snippet of the Win32_PCMCIAController class, Also are you sure which that list are PCMCIA slots? because looks like a list of USB devices.
October 24, 2011 at 8:49 am
The updated snippet reports: 0… but I have a lot of slots…4-5 on the Dell Box as well as 4 on the monitor. Does this snippet work on your Dell?
October 24, 2011 at 9:16 am
I think which you are a little confused, the PCMCIA slots are present generally in laptops systems. it seems which you need list of PCI Slots, check these wmi classes Win32_SystemSlot and Win32_Bus.
October 24, 2011 at 9:20 am
Yes I think you are right. The slots are not the card slots on the motherboard but on the front of the Dell Box which typically load camera cards.
October 24, 2011 at 9:42 am
I wrote a new function to return the number of processor cores:
is WMIGetNumberOfCores correct?
October 24, 2011 at 10:48 am
You must compare the value returned by the GetSystemInfo function with the NumberOfLogicalProcessors property.
October 24, 2011 at 9:54 am
Here are 2 more Win32_Processor functions:
WMIGetNumberOfCores returns 4 here.
WMIGetNumberOfLogicalProcessors returns 8 here.
Feel free to add to your snippets if you like.
Pingback: /*Prog*/ Delphi-Neftalí /*finProg*/ » Comienza un nuevo año… (10/01/2012)
Pingback: Anonymous