有许多不同的方法可以检索所有这些信息。
但检索所有这些内容的一种通用方法是WMI查询 https://learn.microsoft.com/en-us/windows/win32/wmisdk/querying-wmi.
您感兴趣的 WMI 类是:
- Win32_ComputerSystem https://learn.microsoft.com/en-us/windows/win32/cimwin32prov/win32-computersystem
- Win32_OperatingSystem https://learn.microsoft.com/en-us/windows/win32/cimwin32prov/win32-operatingsystem
- Win32_Processor https://learn.microsoft.com/en-us/windows/win32/cimwin32prov/win32-processor
- Win32_NetworkAdapterConfiguration https://learn.microsoft.com/en-us/windows/win32/cimwin32prov/win32-networkadapterconfiguration
function WbemQuery(WbemServices: Variant; Query: string): Variant;
var
WbemObjectSet: Variant;
begin
Result := Null;
WbemObjectSet := WbemServices.ExecQuery(Query);
if not VarIsNull(WbemObjectSet) and (WbemObjectSet.Count > 0) then
begin
Result := WbemObjectSet.ItemIndex(0);
end;
end;
procedure CollectInformation;
var
Query: string;
WbemLocator, WbemServices: Variant;
ComputerSystem, OperatingSystem, Processor: Variant;
NetworkAdapters, NetworkAdapter: Variant;
IPAddresses: array of string;
I, I2: Integer;
begin
WbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
WbemServices := WbemLocator.ConnectServer('.', 'root\CIMV2');
Query := 'SELECT TotalPhysicalMemory, UserName FROM Win32_ComputerSystem';
ComputerSystem := WbemQuery(WbemServices, Query);
if not VarIsNull(ComputerSystem) then
begin
Log(Format('TotalPhysicalMemory=%s', [ComputerSystem.TotalPhysicalMemory]));
Log(Format('UserName=%s', [ComputerSystem.UserName]));
end;
Query := 'SELECT Caption FROM Win32_OperatingSystem';
OperatingSystem := WbemQuery(WbemServices, Query);
if not VarIsNull(OperatingSystem) then
begin
Log(Format('OperatingSystem=%s', [OperatingSystem.Caption]));
end;
Query := 'SELECT Name FROM Win32_Processor';
Processor := WbemQuery(WbemServices, Query);
if not VarIsNull(Processor) then
begin
Log(Format('Processor=%s', [Processor.Name]));
end;
Query :=
'SELECT IPEnabled, IPAddress, MACAddress ' +
'FROM Win32_NetworkAdapterConfiguration';
NetworkAdapters := WbemServices.ExecQuery(Query);
if not VarIsNull(NetworkAdapters) then
begin
for I := 0 to NetworkAdapters.Count - 1 do
begin
NetworkAdapter := NetworkAdapters.ItemIndex(I);
if (not VarIsNull(NetworkAdapter.MACAddress)) and
NetworkAdapter.IPEnabled then
begin
Log(Format('Adapter %d MAC=%s', [I, NetworkAdapter.MACAddress]));
if not VarIsNull(NetworkAdapter.IPAddress) then
begin
IPAddresses := NetworkAdapter.IPAddress;
for I2 := 0 to GetArrayLength(IPAddresses) - 1 do
begin
Log(Format('Adapter %d IP %d=%s', [I, I2, IPAddresses[I2]]));
end;
end;
end;
end;
end;
end;
该代码需要 Inno Setup 的 Unicode 版本(Inno Setup 6 中唯一的版本)better Variant support https://stackoverflow.com/q/34317882/850848.
The SWbemObjectSet.ItemIndex method https://learn.microsoft.com/en-us/windows/win32/wmisdk/swbemobjectset-itemindex与一起使用Win32_NetworkAdapterConfiguration
在 Windows XP 或更旧版本上不可用。看在 Windows XP 和 Inno Setup 中迭代 SWbemObjectSet https://stackoverflow.com/q/43222471/850848.
它将为您提供以下信息:
TotalPhysicalMemory=12835962880
UserName=domain\martin
OperatingSystem=Microsoft Windows 10 Home
Processor=Intel(R) Core(TM) i7-3630QM CPU @ 2.40GHz
Adapter 1 MAC=11:51:67:D0:10:21
Adapter 1 IP 0=192.168.78.2
Adapter 1 IP 1=ef08::8da9:601e:3f8a:da00
Adapter 2 MAC=80:06:E6:10:F7:B9
Adapter 2 IP 0=192.168.1.3
要查看相关类中的所有可用信息,请在命令行上运行以下命令:
wmic computersystem get * /format:value
wmic os get * /format:value
wmic cpu get * /format:value
wmic nicconfig get * /format:value