////////////////////////////////////////////////////////////////////////////////
//
// 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;