Приветствую всех.
Я реализовал WMI provider-а, который собирает информацию об аппаратной части сервера. При каком-либо изменении в конфигурации происходит генерация внутреннего события и собирается информация о новой конфигурации.
Провайдер цепляется к Microsoft MOM, в котором я делаю подписку на события WMI
Module Module1
Sub Main()
Dim objService = GetObject("winmgmts:\\.\root\cimv2")
Dim objEventSource = objService.ExecNotificationQuery _
("SELECT * FROM __InstanceCreationEvent " & _
"WITHIN 60 WHERE TargetInstance ISA 'Kraftway_LogicalDisk'")
While True
Dim ev = objEventSource.NextEvent()
Dim Str = ev.TargetInstance.ControllerNumber
Dim v = ""
End While
End Sub
End Module
Собственно говоря подписка эта ничто иное как подписка на функцию CreateInstanceEnumAsync
HRESULT ProvideDataToWMI (int entity, CComPtr<IWbemClassObject> cls, IWbemObjectSink* pResponseHandler) {
CComPtr<IWbemClassObject> pNewInst;
HRESULT hr = S_OK;
CInstanceContainer ciContainer;
if (SUCCEEDED(crDataRep.GetData(entity, ciContainer)))
{
for (unsigned int i = 0; i<ciContainer.size (); i++)
{
hr = cls->SpawnInstance (0, &pNewInst);
if (FAILED(hr)) break;
if (FAILED(ciContainer[i]->SetInstance (pNewInst)))
{
hr = WBEM_E_FAILED;
break;
}
// Deliver the class to WMI
hr = pResponseHandler->Indicate (1, &(pNewInst.p));
if (FAILED(hr)) break;
pNewInst.Release();
}
}
return hr;
}
STDMETHODIMP CCntInstProv::CreateInstanceEnumAsync(const BSTR Class, long lFlags, IWbemContext *pCtx, IWbemObjectSink *pResponseHandler)
{
CImpersonateClientHelper impersonateClient;
HRESULT hr = WBEM_S_NO_ERROR;
DWORD dwImpersonationLevel = 0;
if(SUCCEEDED(hr = impersonateClient.GetCurrentImpersonationLevel(dwImpersonationLevel))) {
// If the current thread has impersonation level set to RPC_C_IMP_LEVEL_IDENTIFY or RPC_C_IMP_LEVEL_ANONYMOUS
if(dwImpersonationLevel < RPC_C_IMP_LEVEL_IMPERSONATE) {
hr = WBEM_E_ACCESS_DENIED;
// Do the access check yourself on the resources accessed based on security configuration for the provider
// and change the return code hr appropriately
} else {
hr = impersonateClient.ImpersonateClient();
}
}
if(FAILED(hr)) return hr;
if (NULL == pResponseHandler) return WBEM_E_INVALID_PARAMETER;
hr = WBEM_S_NO_ERROR;
CComPtr<IWbemClassObject> pNewInst;
//Deliver Data to WMI
if ( 0 == _wcsicmp (Class , s_pControllerClassName) ) {
hr = ProvideDataToWMI (CRepository::ctController, m_pControllerClass, pResponseHandler);
} else if ( 0 == _wcsicmp (Class , s_pLogicalDriveClassName) ) {
hr = ProvideDataToWMI (CRepository::ctLogicalDrive, m_pLogicalDriveClass, pResponseHandler);
} else if ( 0 == _wcsicmp (Class , s_pPhysicalDriveClassName) ) {
hr = ProvideDataToWMI (CRepository::ctPhysicalDrive, m_pPhysicalDriveClass, pResponseHandler);
}
pResponseHandler->SetStatus(0, hr, NULL, NULL);
return hr;
}
При создании нового объекта я его успешно обрабатываю скриптом на бэйсике. Но мне еще надо отслеживать модификацию объектов,
подписываюсь я на нее так
Module Module1
Sub Main()
Dim objService = GetObject("winmgmts:\\.\root\cimv2")
Dim objEventSource = objService.ExecNotificationQuery _
("SELECT * FROM __InstanceModificationEvent " & _
"WITHIN 5 WHERE TargetInstance ISA 'Kraftway_LogicalDisk'")
While True
Dim ev = objEventSource.NextEvent()
Dim Str = ev.TargetInstance.ControllerNumber
Dim v = ""
End While
End Sub
End Module
Как выяснилось он тоже подписывается на CreateInstanceEnumAsync
Но вот никаких событий в скрипте не происходит.
Как мне получить или сгенерировать событие о модификации.