2012-11-04 17 views
9

Uygulamamı Güvenli Hale Getirmek ve Uygulamanın Güvenli Olması İçin delphi programı Sunucu ve İstemciyi yapmaya çalışıyorum Onları kaybetmemek için değiştirilemeyen benzersiz bir Anahtar vermeliyim Onları Tutamak, Bu yüzden bence HDD Seri Numarası + Bios SN olmalı, ama Bios Değişebilir Olabilir hatırlıyorum Anakart Pil çıkarıldığında iş olmayacak. yüzden benim şimdi seçim i almak için aşağıdaki bu kodu denemek değilim ama işe didn'r HDD Gerçek seri numarasıdırDelphi ile Gerçek HDD Seri Numarası Alın

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. 

* yüzden herhangi biri benim kod düzeltmek veya bana başka fikir ver olabiliriz En sayının *

cevap

18

Kodunuz çalışmıyor çünkü WMI sınıf adında bir çift tırnak işareti geçiyorsunuz.

değişiklik Btw bu

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

için bu kod

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

, bir çok artırabilir Bu soruya How can I improve the WMI performance using delphi? cevabını tavsiyelerine uymaya eğer WMI fonksiyonu (GetWMIstring).

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; 
+1

+1 (geç bağlama bu kod kullanımı ve WbemScripting_TLB üniteyi gerekmez) Bu örneği deneyin. Güzel göz! Bu ekstra '' 'onu işaret etmeden önce zordu. :-) –

+0

hızlı yanıt için çok teşekkürler, fark etmediğim sınıftan çift alıntıyı kaldırdım ama yine de bulunamadı ve geri dönmedi , delphi konsol için geliştirmek ben delphi app –

+0

dönüştürmek bilmiyorum Belki de Windows XP kullanıyorsunuz? MSDN [belgeler] (http://msdn.microsoft.com/en-us/library/windows/ desktop/aa394132% 28v = vs85% 29.aspx) bu özellik hakkında (SerialNumber) diyor ki .. ..Windows Server 2003, Windows XP, Windows 2000 ve Windows NT 4.0: Bu özellik kullanılamaz. ' – RRUZ