2009-12-15 42 views
0

我需要確定SQL Server實例(本地)作爲安裝程序的一部分。delphi使用SQL Server與WMI

有沒有人有任何代碼我可以如何做到這一點與WMI和德爾福? JDD。

JD。

回答

0

@JD,要使用WMi獲取Sql Server實例,您必須使用WMI Provider for Configuration Management Classes,請參閱ServerSettings類。

檢查此示例代碼,以2種不同的方法完成相同的任務。

program GetWMI_SqlInstancesInfo; 

{$APPTYPE CONSOLE} 

uses 
    Windows, 
    Classes, 
    ActiveX, 
    Variants, 
    SysUtils, 
    WbemScripting_TLB in '..\..\Documents\RAD Studio\5.0\Imports\WbemScripting_TLB.pas'; 

procedure WmiHelper(RootStr,WmiQuery:String); 
var 
    WMIServices : ISWbemServices; 
    WMILocator : ISWbemLocator; 
    Root   : ISWbemObjectSet; 
    SWbemObject : ISWbemObject; 
    Item   : IEnumVariant; 
    rgVar  : OleVariant; 
    pCelFetched : Cardinal; 
begin 
    WMILocator := CoSWbemLocator.Create(); 
    WMIServices := WMILocator.ConnectServer('.', RootStr,'', '', '', '', 0, nil); // 
    Root := WMIServices.ExecQuery(WmiQuery,'WQL', 0, nil); 
    Item := (Root._NewEnum) as IEnumVariant; 
    while (Item.Next(1, rgVar, pCelFetched) = S_OK) do 
    begin 
     SWbemObject := IUnknown(rgVar) as ISWBemObject; 
     if (SWbemObject <> nil) then 
     begin 
     SWbemObject.Properties_; 
     Writeln(SWbemObject.GetObjectText_(0)); 
     end; 
    end; 
end; 

//option 1 , shows all properties of the class just by running the query 

procedure GetWMISQLInstancesInfo; 
begin 
    WmiHelper('root\Microsoft\SqlServer\ComputerManagement','SELECT * FROM ServerSettings'); 
    //WmiHelper('root\Microsoft\SqlServer\ComputerManagement','SELECT * FROM SqlServiceAdvancedProperty where SQLServiceType = 1'); 
end; 


//option 2 , in this case you must know the properties names to get the info 
    procedure GetWMISQLInstancesInfo2; 
    var 
     WMIServices: ISWbemServices; 
     Root  : ISWbemObjectSet; 
     Item  : Variant; 
     I   : Integer; 
    begin 
     WMIServices := CoSWbemLocator.Create.ConnectServer('.', 'root\Microsoft\SqlServer\ComputerManagement','', '', '', '', 0, nil); 
     Root := WMIServices.ExecQuery('SELECT * FROM ServerSettings','WQL', 0, nil); 
     for I := 0 to Root.Count - 1 do 
     begin 
     Item := Root.ItemIndex(I); 
     Writeln('Instance Name '+VarToStr(Item.InstanceName)); 
     end; 
    End; 

    begin 
    try 
     CoInitialize(nil); 
     try 
      GetWMISQLInstancesInfo; 
      GetWMISQLInstancesInfo2; 
      Readln; 
     finally 
      CoUninitialize; 
     end; 
    except 
     on E:Exception do 
     Begin 
      Writeln(E.Classname, ': ', E.Message); 
      Readln; 
     End; 
     end; 
    end.