gpt4 book ai didi

delphi - 使用 Delphi 获取真实硬盘序列号

转载 作者:行者123 更新时间:2023-12-03 14:40:57 42 4
gpt4 key购买 nike

我正在尝试制作delphi程序服务器和客户端,以便保护我的应用程序并确保所有用户都在控制之下,我应该给他们一个唯一的 key ,该 key 不能更改以免丢失他们的句柄,所以我认为它应该是HDD序列号+Bios SN,但我记得Bios可以在移除主板电池时更改,所以它无法工作。所以我现在选择的是硬盘真实序列号我尝试下面的代码来获取它但它不起作用

    unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,WbemScripting_TLB,ActiveX;

type
TForm4 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form4: TForm4;

implementation

{$R *.dfm}

function GetWMIstring (wmiHost, wmiClass, wmiProperty : string):string;
var // These are all needed for the WMI querying process
Locator: ISWbemLocator;
Services: ISWbemServices;
SObject: ISWbemObject;
ObjSet: ISWbemObjectSet;
SProp: ISWbemProperty;
Enum: IEnumVariant;
Value: Cardinal;
TempObj: OleVariant;
SN: string;
begin
try
Locator := CoSWbemLocator.Create; // Create the Location object
// Connect to the WMI service, with the root\cimv2 namespace
Services := Locator.ConnectServer(wmiHost, 'root\cimv2', '', '', '','', 0, nil);
ObjSet := Services.ExecQuery('SELECT * FROM '+wmiClass, 'WQL',
wbemFlagReturnImmediately and wbemFlagForwardOnly , nil);
Enum := (ObjSet._NewEnum) as IEnumVariant;
while (Enum.Next(1, TempObj, Value) = S_OK) do
begin
SObject := IUnknown(tempObj) as ISWBemObject;
SProp := SObject.Properties_.Item(wmiProperty, 0);
if VarIsNull(SProp.Get_Value) then
result := ''
else
begin
SN := SProp.Get_Value;
result := SN;
end;
end;
except // Trap any exceptions (Not having WMI installed will cause one!)
on exception do
result := '';
end;
end;

procedure TForm4.Button1Click(Sender: TObject);
var
x:string;
Y:string;

begin


X:=GetWMIstring('','Win32_BIOS','SerialNumber');
Y:=GetWMIstring('','Win32_DiskDrive"','SerialNumber') ;

ShowMessage(x+';'+y);
end;

end.

*请有人更正我的代码或给我另一个想法最诚挚的问候*

最佳答案

您的代码不起作用,因为您在 WMI 类名中传递了双引号。

更改此代码

GetWMIstring('','Win32_DiskDrive"','SerialNumber');

至此

GetWMIstring('','Win32_DiskDrive','SerialNumber');

顺便说一句,如果您遵循此问题 How can I improve the WMI performance using delphi? 的答案的建议,您可以大大改进您的 WMI 函数 (GetWMIstring) .

尝试此示例(此代码使用后期绑定(bind),不需要 WbemScripting_TLB 单元)

  uses
ActiveX,
ComObj;

var
FSWbemLocator : OLEVariant;
FWMIService : OLEVariant;

function GetWMIstring(const WMIClass, WMIProperty:string): string;
const
wbemFlagForwardOnly = $00000020;
var
FWbemObjectSet: OLEVariant;
FWbemObject : OLEVariant;
oEnum : IEnumvariant;
iValue : LongWord;
begin;
Result:='';
FWbemObjectSet:= FWMIService.ExecQuery(Format('Select %s from %s',[WMIProperty, WMIClass]),'WQL',wbemFlagForwardOnly);
oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
if oEnum.Next(1, FWbemObject, iValue) = 0 then

if not VarIsNull(FWbemObject.Properties_.Item(WMIProperty).Value) then

Result:=FWbemObject.Properties_.Item(WMIProperty).Value;

FWbemObject:=Unassigned;
end;

procedure TForm4.Button1Click(Sender: TObject);
var
x:string;
Y:string;
begin
FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', '');

X:=GetWMIstring('Win32_BIOS','SerialNumber');
Y:=GetWMIstring('Win32_PhysicalMedia','SerialNumber');

ShowMessage(x+';'+y);
end;

关于delphi - 使用 Delphi 获取真实硬盘序列号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13215713/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com