![]() |
auf WMI-Verfügbarkeit prüfen
Guten Abend,
ist es möglich zu überprüfen, ob WMI auf einem System installiert ist? Gruß Mazel |
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?).
|
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.
|
Re: auf WMI-Verfügbarkeit prüfen
Ich habe dazu mal folgenden Link gefunden als
![]()
Delphi-Quellcode:
If not WMIGetInfo('.', 'root\CIMV2', '', '', 'Win32_DiskPartition', WMIResults) Then
begin result := Infos + CRLF + CRLF + 'Fehler beim Auslesen der physikalischen Festplatten'; Exit; end; |
Re: auf WMI-Verfügbarkeit prüfen
Zitat:
Delphi-Quellcode:
ps: Deklarationen aus WbemCli.pas reinkopiert.
////////////////////////////////////////////////////////////////////////////////
// // 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; |
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 ![]() |
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:
Wie kann ich den Fehler vermeiden und stattdessen ein für mich passendes Ergebnis ermitteln?
{--[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; Gruß Mazel |
Re: auf WMI-Verfügbarkeit prüfen
Fang doch die Exception ab, wenn die Klasse nicht registriert ist, dann gibt es kein WMI.
|
Re: auf WMI-Verfügbarkeit prüfen
OK, ich habe das ganze jetzt so gelöst:
Delphi-Quellcode:
Gruß
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; Mazel |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:38 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz