AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

auf WMI-Verfügbarkeit prüfen

Ein Thema von Mazel · begonnen am 4. Jun 2007 · letzter Beitrag vom 10. Jun 2007
Antwort Antwort
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#1

auf WMI-Verfügbarkeit prüfen

  Alt 4. Jun 2007, 20:08
Guten Abend,

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

Gruß
Mazel
Marcel Jänicke
www.mj-software.net
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#2

Re: auf WMI-Verfügbarkeit prüfen

  Alt 4. Jun 2007, 21:13
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?).
  Mit Zitat antworten Zitat
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#3

Re: auf WMI-Verfügbarkeit prüfen

  Alt 4. Jun 2007, 21:20
Ich weis aber nicht ob das die beste Variante ist, ich muss erst noch testen, ob eine Fehlermeldung erzeugt wird, die vermieden werden sollte.
Marcel Jänicke
www.mj-software.net
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#4

Re: auf WMI-Verfügbarkeit prüfen

  Alt 4. Jun 2007, 21:26
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;
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#5

Re: auf WMI-Verfügbarkeit prüfen

  Alt 5. Jun 2007, 10:24
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#6

Re: auf WMI-Verfügbarkeit prüfen

  Alt 5. Jun 2007, 13:47
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

siehe Hier im Forum suchenWMIDemo
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#7

Re: auf WMI-Verfügbarkeit prüfen

  Alt 10. Jun 2007, 14:20
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
Marcel Jänicke
www.mj-software.net
  Mit Zitat antworten Zitat
Benutzerbild von MagicAndre1981
MagicAndre1981

Registriert seit: 4. Jun 2004
Ort: Nordhausen
2.214 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: auf WMI-Verfügbarkeit prüfen

  Alt 10. Jun 2007, 14:26
Fang doch die Exception ab, wenn die Klasse nicht registriert ist, dann gibt es kein WMI.
André
"A programmer is just a tool which converts caffeine into code", daran wirds wohl liegen, dass ich Abends nie pennen kann

Zitat von Luckie:
Nicht nur dass ihr offtopic geworden seid, jetzt werdet ihr selber im Offtopic noch offtopic
  Mit Zitat antworten Zitat
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#9

Re: auf WMI-Verfügbarkeit prüfen

  Alt 10. Jun 2007, 15:27
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
Marcel Jänicke
www.mj-software.net
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:21 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