177 lines
4.6 KiB
C
177 lines
4.6 KiB
C
/*
|
|
* async_wmi_demo.c
|
|
*
|
|
###########################################################################
|
|
#
|
|
# This program is part of Zenoss Core, an open source monitoring platform.
|
|
# Copyright (C) 2008-2010, Zenoss Inc.
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify it
|
|
# under the terms of the GNU General Public License version 2, or (at your
|
|
# option) any later version, as published by the Free Software Foundation.
|
|
#
|
|
# For complete information please visit: http://www.zenoss.com/oss/
|
|
#
|
|
###########################################################################
|
|
*
|
|
* Created on: Aug 19, 2008
|
|
* Author: cgibbons
|
|
*/
|
|
|
|
#include "includes.h"
|
|
|
|
#include "libcli/composite/composite.h"
|
|
#include "librpc/rpc/dcerpc.h"
|
|
#include "librpc/gen_ndr/winreg.h"
|
|
#include "librpc/gen_ndr/ndr_winreg.h"
|
|
#include "librpc/gen_ndr/ndr_winreg_c.h"
|
|
#include "librpc/gen_ndr/oxidresolver.h"
|
|
#include "librpc/gen_ndr/ndr_oxidresolver.h"
|
|
#include "librpc/gen_ndr/ndr_oxidresolver_c.h"
|
|
#include "auth/credentials/credentials.h"
|
|
|
|
#include "zenoss_events.h"
|
|
|
|
#include "librpc/gen_ndr/ndr_dcom.h"
|
|
#include "librpc/gen_ndr/ndr_dcom_c.h"
|
|
#include "librpc/gen_ndr/ndr_remact_c.h"
|
|
#include "librpc/gen_ndr/ndr_epmapper_c.h"
|
|
#include "librpc/gen_ndr/com_dcom.h"
|
|
#include "librpc/rpc/dcerpc_table.h"
|
|
|
|
#include "lib/com/proto.h"
|
|
#include "lib/com/dcom/dcom.h"
|
|
#include "lib/com/dcom/proto.h"
|
|
|
|
#include "wmi/wmi.h"
|
|
|
|
struct WBEMCLASS;
|
|
struct WBEMOBJECT;
|
|
|
|
#include "wmi/proto.h"
|
|
|
|
|
|
/**
|
|
* Initialize the Zenoss async event context. Will ensure that all
|
|
* necessary Samba library initializtion takes place and that a root
|
|
* event context for our local implementation is created.
|
|
*/
|
|
struct event_context* async_create_context(struct reactor_functions *funcs)
|
|
{
|
|
// load all Samba parameters
|
|
lp_load();
|
|
|
|
// initialize the Samba DCERPC libraries
|
|
dcerpc_init();
|
|
dcerpc_table_init();
|
|
dcom_proxy_IUnknown_init();
|
|
dcom_proxy_IWbemLevel1Login_init();
|
|
dcom_proxy_IWbemServices_init();
|
|
dcom_proxy_IEnumWbemClassObject_init();
|
|
dcom_proxy_IRemUnknown_init();
|
|
dcom_proxy_IWbemFetchSmartEnum_init();
|
|
dcom_proxy_IWbemWCOSmartEnum_init();
|
|
|
|
// and finally create our top-level event context
|
|
return zenoss_event_context_init(NULL, funcs);
|
|
}
|
|
|
|
#define WERR_CHECK(msg) if (!W_ERROR_IS_OK(result)) { \
|
|
DEBUG(0, ("ERROR: %s\n", msg)); \
|
|
goto error; \
|
|
} else { \
|
|
DEBUG(1, ("OK : %s\n", msg)); \
|
|
}
|
|
|
|
WERROR ConnectAndQuery(struct com_context* ctx,
|
|
const char *hostname,
|
|
const char *query,
|
|
struct IEnumWbemClassObject **pEnum)
|
|
{
|
|
uint32_t cnt = 5, ret;
|
|
WERROR result;
|
|
NTSTATUS status;
|
|
struct IWbemServices *pWS = NULL;
|
|
|
|
result = WBEM_ConnectServer(ctx,
|
|
hostname,
|
|
"root\\cimv2",
|
|
0, 0, 0, 0, 0, 0,
|
|
&pWS);
|
|
WERR_CHECK("Login to remote object.");
|
|
|
|
result = IWbemServices_ExecQuery(pWS,
|
|
ctx,
|
|
"WQL",
|
|
query,
|
|
WBEM_FLAG_RETURN_IMMEDIATELY |
|
|
WBEM_FLAG_ENSURE_LOCATABLE,
|
|
NULL,
|
|
pEnum);
|
|
WERR_CHECK("WMI query execute.");
|
|
|
|
result = IEnumWbemClassObject_Reset(*pEnum, ctx);
|
|
WERR_CHECK("Reset result of WMI query.");
|
|
error:
|
|
return result;
|
|
}
|
|
|
|
/* This is a function */
|
|
struct composite_context * IWbemServices_ExecQuery_send_f(
|
|
struct IWbemServices *interface,
|
|
TALLOC_CTX *mem_ctx,
|
|
BSTR strQueryLanguage,
|
|
BSTR strQuery,
|
|
int32_t lFlags,
|
|
struct IWbemContext *pCtx)
|
|
{
|
|
/* This is a macro, and not directly callable from python */
|
|
return IWbemServices_ExecQuery_send(interface,
|
|
mem_ctx,
|
|
strQueryLanguage,
|
|
strQuery,
|
|
lFlags,
|
|
pCtx);
|
|
}
|
|
|
|
|
|
/* This is a function */
|
|
struct composite_context * IWbemServices_ExecNotificationQuery_send_f(
|
|
struct IWbemServices *interface,
|
|
TALLOC_CTX *mem_ctx,
|
|
BSTR strQueryLanguage,
|
|
BSTR strQuery,
|
|
int32_t lFlags,
|
|
struct IWbemContext *pCtx)
|
|
{
|
|
/* This is a macro, and not directly callable from python */
|
|
return IWbemServices_ExecNotificationQuery_send(interface,
|
|
mem_ctx,
|
|
strQueryLanguage,
|
|
strQuery,
|
|
lFlags,
|
|
pCtx);
|
|
}
|
|
|
|
|
|
struct composite_context * IEnumWbemClassObject_Reset_send_f(
|
|
struct IEnumWbemClassObject *interface,
|
|
TALLOC_CTX *mem_ctx)
|
|
{
|
|
return IEnumWbemClassObject_Reset_send(interface, mem_ctx);
|
|
}
|
|
|
|
struct composite_context * IUnknown_Release_send_f(
|
|
struct IUnknown *interface,
|
|
TALLOC_CTX *mem_ctx)
|
|
{
|
|
return IUnknown_Release_send(interface, mem_ctx);
|
|
}
|
|
|
|
typedef void (*some_function)();
|
|
some_function hook_me_into_library[] = {
|
|
(some_function)IEnumWbemClassObject_SmartNext,
|
|
(some_function)dcerpc_winreg_OpenHKPD_send,
|
|
(some_function)com_init_ctx,
|
|
};
|