Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi auf WMI-Verfügbarkeit prüfen (https://www.delphipraxis.net/93352-auf-wmi-verfuegbarkeit-pruefen.html)

Mazel 4. Jun 2007 19:08


auf WMI-Verfügbarkeit prüfen
 
Guten Abend,

ist es möglich zu überprüfen, ob WMI auf einem System installiert ist?

Gruß
Mazel

NicoDE 4. Jun 2007 20:13

Re: auf WMI-Verfügbarkeit prüfen
 
Ich würde versuchen eine Instanz des entsprechenden COM-Objekts erzeugen. Wenn es fehlschlägt, dann ist kein WMI verfügbar (ob es installiert ist, ist eine andere Frage - aber eigentlich nicht relevant, oder?).

Mazel 4. Jun 2007 20:20

Re: auf WMI-Verfügbarkeit prüfen
 
Ich weis aber nicht ob das die beste Variante ist, ich muss erst noch testen, ob eine Fehlermeldung erzeugt wird, die vermieden werden sollte.

RWarnecke 4. Jun 2007 20:26

Re: auf WMI-Verfügbarkeit prüfen
 
Ich habe dazu mal folgenden Link gefunden als VB-Script. Oder du probierst es so :
Delphi-Quellcode:
    If not WMIGetInfo('.', 'root\CIMV2', '', '', 'Win32_DiskPartition', WMIResults) Then
    begin
      result := Infos + CRLF + CRLF + 'Fehler beim Auslesen der physikalischen Festplatten';
      Exit;
    end;

NicoDE 5. Jun 2007 09:24

Re: auf WMI-Verfügbarkeit prüfen
 
Zitat:

Zitat von Mazel
Ich weis aber nicht ob das die beste Variante ist, ich muss erst noch testen, ob eine Fehlermeldung erzeugt wird, die vermieden werden sollte.

Ich wüsste nicht, warum da eine Meldung kommen sollte...
Delphi-Quellcode:
////////////////////////////////////////////////////////////////////////////////
//
//  Excerpt from WbemCli.pas
//

type
  TCimType = LongInt;
const
  CIM_EMPTY     = TCimType(0);
  CIM_SINT16     = TCimType(2);
  CIM_SINT32     = TCimType(3);
  CIM_REAL32     = TCimType(4);
  CIM_REAL64     = TCimType(5);
  CIM_STRING    = TCimType(8);
  CIM_BOOLEAN   = TCimType(11);
  CIM_OBJECT    = TCimType(13);
  CIM_SINT8      = TCimType(16);
  CIM_UINT8      = TCimType(17);
  CIM_UINT16     = TCimType(18);
  CIM_UINT32     = TCimType(19);
  CIM_SINT64     = TCimType(20);
  CIM_UINT64     = TCimType(21);
  CIM_DATETIME  = TCimType(101);
  CIM_REFERENCE = TCimType(102);
  CIM_CHAR16     = TCimType(103);
  CIM_ILLEGAL   = TCimType($0FFF);
  CIM_FLAG_ARRAY = TCimType($2000);

type
  IWbemContext = interface(IUnknown)
    ['{44ACA674-E8FC-11D0-A07C-00C04FB68820}']
    function Clone(out ppNewCopy: IWbemContext): HRESULT; stdcall;
    function GetNames(lFlags: LongInt; out pNames: TSafeArray
      ): HRESULT; stdcall;
    function BeginEnumeration(lFlags: LongInt): HRESULT; stdcall;
    function Next(lFlags: LongInt; out pstrName: WideString;
      out pValue: OleVariant): HRESULT; stdcall;
    function EndEnumeration(): HRESULT; stdcall;
    function SetValue(wszName: LPCWSTR; lFlags: LongInt;
      const pValue: OleVariant): HRESULT; stdcall;
    function GetValue(wszName: LPCWSTR; lFlags: LongInt; out pValue: OleVariant
      ): HRESULT; stdcall;
    function DeleteValue(wszName: LPCWSTR; lFlags: LongInt): HRESULT; stdcall;
    function DeleteAll(): HRESULT; stdcall;
  end;

type
  IWbemQualifierSet = interface(IUnknown)
    ['{DC12A680-737F-11CF-884D-00AA004B2E24}']
    function Get(wszName: LPCWSTR; lFlags: LongInt; out pVal: OleVariant;
      out plFlavor: LongInt): HRESULT; stdcall;
    function Put(wszName: LPCWSTR; const pVal: OleVariant; lFlavor: LongInt
      ): HRESULT; stdcall;
    function Delete(wszName: LPCWSTR): HRESULT; stdcall;
    function GetNames(lFlags: LongInt; out pNames: TSafeArray
      ): HRESULT; stdcall;
    function BeginEnumeration(lFlags: LongInt): HRESULT; stdcall;
    function Next(lFlags: LongInt; out pstrName: WideString;
      out pVal: OleVariant; out plFlavor: LongInt): HRESULT; stdcall;
    function EndEnumeration(): HRESULT; stdcall;
  end;

type
  IWbemClassObject = interface(IUnknown)
    ['{DC12A681-737F-11CF-884D-00AA004B2E24}']
    function GetQualifierSet(out ppQualSet: IWbemQualifierSet
      ): HRESULT; stdcall;
    function Get(wszName: LPCWSTR; lFlags: LongInt; out pVal: OleVariant;
      out pType: TCimType; out plFlavor: LongInt): HRESULT; stdcall;
    function Put(wszName: LPCWSTR; lFlags: LongInt; const pVal: OleVariant;
      Type_: TCimType): HRESULT; stdcall;
    function Delete(wszName: LPCWSTR): HRESULT; stdcall;
    function GetNames(wszQualifierName: LPCWSTR; lFlags: LongInt;
      const pQualifierVal: OleVariant; out pNames: TSafeArray
      ): HRESULT; stdcall;
    function BeginEnumeration(lEnumFlags: LongInt): HRESULT; stdcall;
    function Next(lFlags: LongInt; out strName: WideString;
      out pVal: OleVariant; out pType: TCimType; out plFlavor: LongInt
      ): HRESULT; stdcall;
    function EndEnumeration(): HRESULT; stdcall;
    function GetPropertyQualifierSet(wszProperty: LPCWSTR;
      out ppQualSet: IWbemQualifierSet): HRESULT; stdcall;
    function Clone(out ppCopy: IWbemClassObject): HRESULT; stdcall;
    function GetObjectText(lFlags: LongInt; out pstrObjectText: WideString
      ): HRESULT; stdcall;
    function SpawnDerivedClass(lFlags: LongInt; out ppNewClass: IWbemClassObject
      ): HRESULT; stdcall;
    function SpawnInstance(lFlags: LongInt; out ppNewInstance: IWbemClassObject
      ): HRESULT; stdcall;
    function CompareTo(lFlags: LongInt; pCompareTo: IWbemClassObject
      ): HRESULT; stdcall;
    function GetPropertyOrigin(wszName: LPCWSTR; out pstrClassName: WideString
      ): HRESULT; stdcall;
    function InheritsFrom(strAncestor: LPCWSTR): HRESULT; stdcall;
    function GetMethod(wszName: LPCWSTR; lFlags: LongInt;
      out ppInSignature: IWbemClassObject; out ppOutSignature: IWbemClassObject
      ): HRESULT; stdcall;
    function PutMethod(wszName: LPCWSTR; lFlags: LongInt;
      pInSignature: IWbemClassObject; pOutSignature: IWbemClassObject
      ): HRESULT; stdcall;
    function DeleteMethod(wszName: LPCWSTR): HRESULT; stdcall;
    function BeginMethodEnumeration(lEnumFlags: LongInt): HRESULT; stdcall;
    function NextMethod(lFlags: LongInt; out pstrName: WideString;
      out ppInSignature, ppOutSignature: IWbemClassObject): HRESULT; stdcall;
    function EndMethodEnumeration(): HRESULT; stdcall;
    function GetMethodQualifierSet(wszMethod: LPCWSTR;
      out ppQualSet: IWbemQualifierSet): HRESULT; stdcall;
    function GetMethodOrigin(wszMethodName: LPCWSTR;
      out pstrClassName: WideString): HRESULT; stdcall;
  end;

type
  IWbemObjectSink = interface(IUnknown)
    ['{7C857801-7381-11CF-884D-00AA004B2E24}']
    function Indicate(lObjectCount: LongInt; const apObjArray: IWbemClassObject
      ): HRESULT; stdcall;
    function SetStatus(lFlags: LongInt; hResult: HRESULT; strParam: WideString;
      pObjParam: IWbemClassObject): HRESULT; stdcall;
  end;

type
  IEnumWbemClassObject = interface(IUnknown)
    ['{027947E1-D731-11CE-A357-000000000001}']
    function Reset(): HRESULT; stdcall;
    function Next(lTimeout: LongInt; uCount: LongWord;
      out apObjects: IWbemClassObject; out puReturned: LongWord
      ): HRESULT; stdcall;
    function NextAsync(uCount: LongWord; pSink: IWbemObjectSink
      ): HRESULT; stdcall;
    function Clone(out ppEnum: IEnumWbemClassObject): HRESULT; stdcall;
    function Skip(lTimeout: LongInt; nCount: LongWord): HRESULT; stdcall;
  end;

type
  IWbemServices = interface; // forward

  IWbemCallResult = interface(IUnknown)
    ['{44ACA675-E8FC-11D0-A07C-00C04FB68820}']
    function GetResultObject(lTimeout: LongInt;
      out ppResultObject: IWbemClassObject): HRESULT; stdcall;
    function GetResultString(lTimeout: LongInt;
      out pstrResultString: WideString): HRESULT; stdcall;
    function GetResultServices(lTimeout: LongInt; out ppServices: IWbemServices
      ): HRESULT; stdcall;
    function GetCallStatus(lTimeout: LongInt; out plStatus: LongInt
      ): HRESULT; stdcall;
  end;

  IWbemServices = interface(IUnknown)
    ['{9556DC99-828C-11CF-A37E-00AA003240C7}']
    function OpenNamespace(const strNamespace: WideString; lFlags: LongInt;
      pCtx: IWbemContext; out ppWorkingNamespace: IWbemServices;
      out ppResult: IWbemCallResult): HRESULT; stdcall;
    function CancelAsyncCall(pSink: IWbemObjectSink): HRESULT; stdcall;
    function QueryObjectSink(lFlags: LongInt;
      out ppResponseHandler: IWbemObjectSink): HRESULT; stdcall;
    function GetObject(const strObjectPath: WideString; lFlags: LongInt;
      pCtx: IWbemContext; out ppObject: IWbemClassObject;
      out ppCallResult: IWbemCallResult): HRESULT; stdcall;
    function GetObjectAsync(const strObjectPath: WideString; lFlags: LongInt;
      pCtx: IWbemContext; pResponseHandler: IWbemObjectSink): HRESULT; stdcall;
    function PutClass(pObject: IWbemClassObject; lFlags: LongInt;
      pCtx: IWbemContext; out ppCallResult: IWbemCallResult): HRESULT; stdcall;
    function PutClassAsync(pObject: IWbemClassObject; lFlags: LongInt;
      pCtx: IWbemContext; pResponseHandler: IWbemObjectSink): HRESULT; stdcall;
    function DeleteClass(const strClass: WideString; lFlags: LongInt;
      pCtx: IWbemContext; out ppCallResult: IWbemCallResult): HRESULT; stdcall;
    function DeleteClassAsync(const strClass: WideString; lFlags: LongInt;
      pCtx: IWbemContext; pResponseHandler: IWbemObjectSink): HRESULT; stdcall;
    function CreateClassEnum(const strSuperclass: WideString; lFlags: LongInt;
      pCtx: IWbemContext; out ppEnum: IEnumWbemClassObject): HRESULT; stdcall;
    function CreateClassEnumAsync(const strSuperclass: WideString;
      lFlags: LongInt; pCtx: IWbemContext; pResponseHandler: IWbemObjectSink
      ): HRESULT; stdcall;
    function PutInstance(pInst: IWbemClassObject; lFlags: LongInt;
      pCtx: IWbemContext; out ppCallResult: IWbemCallResult): HRESULT; stdcall;
    function PutInstanceAsync(pInst: IWbemClassObject; lFlags: LongInt;
      pCtx: IWbemContext; pResponseHandler: IWbemObjectSink): HRESULT; stdcall;
    function DeleteInstance(const strObjectPath: WideString; lFlags: LongInt;
      pCtx: IWbemContext; out ppCallResult: IWbemCallResult): HRESULT; stdcall;
    function DeleteInstanceAsync(const strObjectPath: WideString;
      lFlags: LongInt; pCtx: IWbemContext; pResponseHandler: IWbemObjectSink
      ): HRESULT; stdcall;
    function CreateInstanceEnum(const strFilter: WideString; lFlags: LongInt;
      pCtx: IWbemContext; out ppEnum: IEnumWbemClassObject): HRESULT; stdcall;
    function CreateInstanceEnumAsync(const strFilter: WideString;
      lFlags: LongInt; pCtx: IWbemContext; pResponseHandler: IWbemObjectSink
      ): HRESULT; stdcall;
    function ExecQuery(const strQueryLanguage: WideString;
      const strQuery: WideString; lFlags: LongInt; pCtx: IWbemContext;
      out ppEnum: IEnumWbemClassObject): HRESULT; stdcall;
    function ExecQueryAsync(const strQueryLanguage, strQuery: WideString;
      lFlags: LongInt; pCtx: IWbemContext; pResponseHandler: IWbemObjectSink
      ): HRESULT; stdcall;
    function ExecNotificationQuery(const strQueryLanguage, strQuery: WideString;
      lFlags: LongInt; pCtx: IWbemContext; out ppEnum: IEnumWbemClassObject
      ): HRESULT; stdcall;
    function ExecNotificationQueryAsync(const strQueryLanguage,
      strQuery: WideString; lFlags: LongInt; pCtx: IWbemContext;
      pResponseHandler: IWbemObjectSink): HRESULT; stdcall;
    function ExecMethod(const strObjectPath, strMethodName: WideString;
      lFlags: LongInt; pCtx: IWbemContext; pInParams: IWbemClassObject;
      out ppOutParams: IWbemClassObject; out ppCallResult: IWbemCallResult
      ): HRESULT; stdcall;
    function ExecMethodAsync(const strObjectPath, strMethodName: WideString;
      lFlags: LongInt; pCtx: IWbemContext; pInParams: IWbemClassObject;
      pResponseHandler: IWbemObjectSink): HRESULT; stdcall;
  end;

type
  IWbemLocator = interface(IUnknown)
    ['{DC12A687-737F-11CF-884D-00AA004B2E24}']
    function ConnectServer(const strNetworkResource, strUser, strPassword,
      strLocale: WideString; lSecurityFlags: LongInt;
      const strAuthority: WideString; pCtx: IWbemContext;
      out ppNamespace: IWbemServices): HRESULT; stdcall;
  end;

const
  IID_IWbemLocator = IWbemLocator;
  CLSID_IWbemLocator: TCLSID = '{4590F811-1D3A-11D0-891F-00AA004B2E24}';

//
////////////////////////////////////////////////////////////////////////////////

function IsWmiAvailable(const AResource: WideString = 'root\default'): Boolean;
var
  Locator: IWbemLocator;
  Resource: WideString;
  Services: IWbemServices;
begin
  Result := False;
  CoInitialize(nil);
  try
    if Succeeded(CoCreateInstance(CLSID_IWbemLocator, nil, CLSCTX_INPROC_SERVER,
      IID_IWbemLocator, Locator)) and Assigned(Locator) then
    try
      //NOTE: [NicoDE] Don't pass a WideString constant directly here.
      // Even if "strNetworkResource" is defined as "const BSTR", the
      // WBEM implementation might raise an exception if you pass the
      // default parameter directly to the ConnectServer() function.
      // Happend on Windows Vista x64 (RTM) with '\\.\root\default'.
      Resource := AResource;
      UniqueString(Resource);
      if Succeeded(Locator.ConnectServer(Resource, '', '', '', 0, '', nil,
        Services)) and Assigned(Services) then
      try
        Result := True;
      finally
        Services := nil;
      end;
    finally
      Locator := nil;
    end;
  finally
    CoUninitialize();
  end;
end;
ps: Deklarationen aus WbemCli.pas reinkopiert.

himitsu 5. Jun 2007 12:47

Re: auf WMI-Verfügbarkeit prüfen
 
genau, eine Fehlermeldung müßte selbst erzeugt werden ... die nötigen Funktionen liefern nur entsprechende Fehlercodes (meißt als Funktionsergebnis), welche man nur auszuwerten braucht.

Und mit dem Installiert: genau, einfach probieren ... wenn nicht vorhanden, oder ungenügent Rechte, dann geht's halt nich :stupid:

siehe Hier im Forum suchenWMIDemo

Mazel 10. Jun 2007 13:20

Re: auf WMI-Verfügbarkeit prüfen
 
Hallo,

ich hatte gedacht, auf WMI zu überprüfen sei einfach aber das ist es doch nicht. Ich habe jetzt folgenden Code probiert, das Problem was auftritt ist, das Windows 98 schon Probleme mit dem zu erzeugenden Locator hat:
Delphi-Quellcode:
{--[WMI]-----------------------------------------------------------------------}

function TMain.WMI: Boolean;
var
 Locator       : ISWbemLocator;
 Services      : ISWbemServices;

begin
 Result := False;
 // Verbindung aufbauen
 Locator := CoSWbemLocator.Create;  // Fehler: "Klasse nicht registriert"
 // Verbindung zum Server herstellen
 Services := Locator.ConnectServer('.', 'root\CIMV2', '', '', '', '', 0, nil);
 if Assigned(Services) then Result := True;
end;
Wie kann ich den Fehler vermeiden und stattdessen ein für mich passendes Ergebnis ermitteln?

Gruß
Mazel

MagicAndre1981 10. Jun 2007 13:26

Re: auf WMI-Verfügbarkeit prüfen
 
Fang doch die Exception ab, wenn die Klasse nicht registriert ist, dann gibt es kein WMI.

Mazel 10. Jun 2007 14:27

Re: auf WMI-Verfügbarkeit prüfen
 
OK, ich habe das ganze jetzt so gelöst:
Delphi-Quellcode:
function TMain.WMI: Boolean;
var
 Locator       : ISWbemLocator;
 Services      : ISWbemServices;

begin
 Result := False;
 try
  // Verbindung aufbauen
  Locator := CoSWbemLocator.Create;
  Result := True;
 except
  Result := False;
 end;
end;
Gruß
Mazel


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz