2009-12-15 3 views

답변

0

@JD, WMi를 사용하여 Sql Server 인스턴스를 가져 오려면 WMI Provider for Configuration Management Classes을 사용해야합니다 (ServerSettings 클래스 참조).

동일한 작업을 수행하는 데 두 가지 방법으로이 샘플 코드를 확인하십시오.

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. 
관련 문제