подписка на события в WMI
От: nil5 Россия  
Дата: 04.06.07 14:01
Оценка:
Приветствую всех.

Я реализовал 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
Но вот никаких событий в скрипте не происходит.

Как мне получить или сгенерировать событие о модификации.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.