none
Помогите правильно подобрать параметры для выполнения метода Сopy класса Win32_NTEventlogFile на С++ RRS feed

  • Вопрос

  • Здравствуйте, я в программировании новичок, в институте попросили считать логи журналов безопасности и проаналаизировать их. 

    По совету знакомого решил воспользоваться  WMI , нашел примеры , но выполнить нужный метод не получилось Далее приведен код ошибки и код программы Сам метод вызывается в шагах 6 и7. Помогите, пожалуйста, разобраться  какие параметры заданы неверно. Операционная система  Windows Vista Ultimate SP1 64 разрядная. Среда MVS 2010

    E_NOINTERFACE

    0x80004002

    The QueryInterface method did not recognize the requested interface. The interface is not supported.
    // COM_PR.cpp: определяет точку входа для консольного приложения.
    //
    #include "stdafx.h"
    #define _WIN32_DCOM
    #include <iostream>
    #include <windows.h>
    #include <conio.h>
    #include <cstdio>
    #include <comdef.h>
    using namespace std;
    #include <wbemidl.h>
    # pragma comment(lib, "wbemuuid.lib")

    int _tmain(int argc, _TCHAR* argv[])
    {
    IWbemLocator *pLoc = 0;
    HRESULT hr;
    HRESULT hres;
    hr = CoInitializeEx(0, COINIT_MULTITHREADED);
    if (FAILED(hr))
    { cout << "Failed to initialize COM library. Error code = 0x"
    << hex << hr << endl;
    return hr;
    }
    hres = CoInitializeSecurity(
    NULL, // Security descriptor
    -1, // COM negotiates authentication service
    NULL, // Authentication services
    NULL, // Reserved
    RPC_C_AUTHN_LEVEL_DEFAULT, // Default authentication level for proxies
    RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation level for proxies
    NULL, // Authentication info
    EOAC_NONE, // Additional capabilities of the client or server
    NULL); // Reserved

    if (FAILED(hr))
    {
    cout << "Failed to initialize security. Error code = 0x"
    << hex << hr << endl;
    CoUninitialize();
    return hres; // Program has failed.
    }
    //2.Creating a Connection to a WMI Namespace с помощью IWbemServices, через который можно получить доступ к различным методам WMI
    //2.1Initialize the IWbemLocator interface through a call to CoCreateInstance. WMI does not require that you perform any additional procedures when calling CoCreateInstance on IWbemLocator.
    hr = CoCreateInstance(CLSID_WbemLocator, 0,
    CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc);

    if (FAILED(hr))
    {
    cout << "Failed to create IWbemLocator object. Err code = 0x"
    << hex << hr << endl;
    CoUninitialize();
    return hres; // Program has failed.
    }
    //2.2 Connect to WMI through a call to the IWbemLocator::ConnectServer method.
    IWbemServices *pSvc = 0;

    // Connect to the root\default namespace with the current user.
    hres = pLoc->ConnectServer(
    BSTR(L"ROOT\\CIMV2"),
    0, NULL, 0, NULL, 0, 0, &pSvc);

    if (FAILED(hr))
    {
    cout << "Could not connect. Error code = 0x"
    << hex << hr << endl;
    pLoc->Release();
    CoUninitialize();
    return hres; // Program has failed.
    }

    cout << "Connected to WMI" << endl;
    //Setting the Security Levels on a WMI Connection
    // Set the proxy so that impersonation of the client occurs.
    hres = CoSetProxyBlanket(pSvc,
    RPC_C_AUTHN_WINNT,
    RPC_C_AUTHZ_NONE,
    NULL,
    RPC_C_AUTHN_LEVEL_CALL,
    RPC_C_IMP_LEVEL_IMPERSONATE,
    NULL,
    EOAC_NONE
    );

    if (FAILED(hres))
    {
    cout << "Could not set proxy blanket. Error code = 0x"
    << hex << hres << endl;
    pSvc->Release();
    pLoc->Release();
    CoUninitialize();
    return hres; // Program has failed.
    }
    // Step 6: --------------------------------------------------
    // Use the IWbemServices pointer to make requests of WMI ----

    // set up to call the Win32_NTEventlofFile::Copy
    BSTR MethodName = SysAllocString(L"Copy");
    BSTR ClassName = SysAllocString(L"Win32_NTEventlogFile");

    IWbemClassObject* pClass = NULL;
    hres = pSvc->GetObject(ClassName, 0, NULL, &pClass, NULL);

    IWbemClassObject *pInParamsDefinition = NULL;
    hres = pClass->GetMethod(MethodName, 0,
    &pInParamsDefinition, NULL);
    //hres = pClass->GetMethod(
    IWbemClassObject* pClassInstance = NULL;
    hres = pInParamsDefinition->SpawnInstance(0, &pClassInstance);

    // Create the values for the in parameters
    VARIANT varCommand;
    varCommand.vt = VT_BSTR;
    varCommand.bstrVal =SysAllocString(L" C:\\in.txt ");
    char str[]="C:\\Windows\\System32\\Winevt\\Log\\Security.evtx";
    // Store the value for the in parameters
    hres = pClassInstance->Put(
    SysAllocString(L"Win32_NTEventlogFile.Name=str"),
    0,
    &varCommand,
    0);
    wprintf(L"The command is: %s\n", V_BSTR(&varCommand));
    // Execute Method
    IWbemClassObject* pOutParams = NULL;
    hres = pSvc->ExecMethod(ClassName, MethodName, 0,
    NULL, pClassInstance, &pOutParams, NULL);


    if (FAILED(hres))
    {
    cout << "Could not execute method. Error code = 0x" << hex << hres << endl;
    VariantClear(&varCommand);
    SysFreeString(ClassName);
    SysFreeString(MethodName);
    pClass->Release();
    pInParamsDefinition->Release();
    pOutParams->Release();
    pSvc->Release();
    pLoc->Release();
    CoUninitialize();
    return 1; // Program has failed.
    }
    // To see what the method returned,
    // use the following code. The return value will
    // be in &varReturnValue
    VARIANT varReturnValue;
    hres = pOutParams->Get(_bstr_t(L"ReturnValue"), 0,
    &varReturnValue, NULL, 0);
    // Cleanup
    // ========
    _getch();
    VariantClear(&varCommand);
    VariantClear(&varReturnValue);
    SysFreeString(ClassName);
    SysFreeString(MethodName);
    pClass->Release();
    pInParamsDefinition->Release();
    pOutParams->Release();
    pSvc->Release();
    pLoc->Release();
    CoUninitialize();
    return 0;
    }

     


    23 апреля 2011 г. 16:41

Ответы

  • Как описано здесь - WMI Tasks: Event Logs (...retrieve information about the Security event log?), вы должны установить Security привилегии для объекта WMI, чтобы получить логи безопасности, попробуйте сделать это аналогично примеру. Еще может потребоваться запустить программу от администратора.

    Если вас устроит вариант на C#, то: (exe или Visual Studio должна быть запущена от администратора, чтобы получить доступ к логам)

          EventLog log = new EventLog("Security");
          foreach (EventLogEntry entry in log.Entries)
          {
            Console.WriteLine(entry.Message);
          }
    

     


    Для связи [mail]
    • Помечено в качестве ответа Abolmasov Dmitry 3 мая 2011 г. 9:31
    28 апреля 2011 г. 8:47