3 Copyright (C) 2006 Andrzej Hajda <andrzej.hajda@wp.pl>
4 Copyright (C) 2008 Jelmer Vernooij <jelmer@samba.org>
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 #include "auth/credentials/credentials.h"
23 #include "librpc/gen_ndr/com_dcom.h"
24 #include "lib/com/dcom/dcom.h"
25 #include "librpc/gen_ndr/wmi.h"
26 #include "librpc/gen_ndr/com_wmi.h"
27 #include "librpc/rpc/dcerpc.h"
28 #include "librpc/ndr/ndr_table.h"
33 #define WERR_CHECK(msg) if (!W_ERROR_IS_OK(result)) { \
34 DEBUG(0, ("ERROR: %s\n", msg)); \
37 DEBUG(1, ("OK : %s\n", msg)); \
40 void wmi_init(struct com_context
**ctx
, struct cli_credentials
*credentials
,
41 struct loadparm_context
*lp_ctx
)
46 /* FIXME: Register DCOM proxies? */
48 com_init_ctx(ctx
, NULL
);
49 dcom_client_init(*ctx
, credentials
);
52 /** FIXME: Use credentials struct rather than user/password here */
53 WERROR
WBEM_ConnectServer(struct com_context
*ctx
, const char *server
, const uint16_t *nspace
,
54 struct cli_credentials
*credentials
,
55 const char *locale
, uint32_t flags
, const char *authority
,
56 struct IWbemContext
* wbem_ctx
, struct IWbemServices
** services
)
60 WERROR result
, coresult
;
61 struct IUnknown
**mqi
;
62 struct IWbemLevel1Login
*pL
;
64 GUID_from_string(CLSID_WBEMLEVEL1LOGIN
, &clsid
);
65 GUID_from_string(COM_IWBEMLEVEL1LOGIN_UUID
, &iid
);
66 result
= dcom_create_object(ctx
, &clsid
, server
, 1, &iid
, &mqi
, &coresult
);
67 WERR_CHECK("dcom_create_object.");
69 WERR_CHECK("Create remote WMI object.");
70 pL
= (struct IWbemLevel1Login
*)mqi
[0];
73 result
= IWbemLevel1Login_NTLMLogin(pL
, ctx
, nspace
, locale
, flags
, wbem_ctx
, services
);
74 WERR_CHECK("Login to remote object.");
76 IUnknown_Release((struct IUnknown
*)pL
, ctx
);
81 struct werror_code_struct
{
82 const char *dos_errstr
;
86 static const struct werror_code_struct wmi_errs
[] =
88 { "RPC_S_CALL_FAILED", W_ERROR(RPC_S_CALL_FAILED
) },
90 { "WBEM_NO_ERROR", W_ERROR(WBEM_NO_ERROR
) },
91 { "WBEM_S_NO_ERROR", W_ERROR(WBEM_S_NO_ERROR
) },
92 { "WBEM_S_SAME", W_ERROR(WBEM_S_SAME
) },
93 { "WBEM_S_FALSE", W_ERROR(WBEM_S_FALSE
) },
94 { "WBEM_S_ALREADY_EXISTS", W_ERROR(WBEM_S_ALREADY_EXISTS
) },
95 { "WBEM_S_RESET_TO_DEFAULT", W_ERROR(WBEM_S_RESET_TO_DEFAULT
) },
96 { "WBEM_S_DIFFERENT", W_ERROR(WBEM_S_DIFFERENT
) },
97 { "WBEM_S_TIMEDOUT", W_ERROR(WBEM_S_TIMEDOUT
) },
98 { "WBEM_S_NO_MORE_DATA", W_ERROR(WBEM_S_NO_MORE_DATA
) },
99 { "WBEM_S_OPERATION_CANCELLED", W_ERROR(WBEM_S_OPERATION_CANCELLED
) },
100 { "WBEM_S_PENDING", W_ERROR(WBEM_S_PENDING
) },
101 { "WBEM_S_DUPLICATE_OBJECTS", W_ERROR(WBEM_S_DUPLICATE_OBJECTS
) },
102 { "WBEM_S_ACCESS_DENIED", W_ERROR(WBEM_S_ACCESS_DENIED
) },
103 { "WBEM_S_PARTIAL_RESULTS", W_ERROR(WBEM_S_PARTIAL_RESULTS
) },
104 { "WBEM_S_NO_POSTHOOK", W_ERROR(WBEM_S_NO_POSTHOOK
) },
105 { "WBEM_S_POSTHOOK_WITH_BOTH", W_ERROR(WBEM_S_POSTHOOK_WITH_BOTH
) },
106 { "WBEM_S_POSTHOOK_WITH_NEW", W_ERROR(WBEM_S_POSTHOOK_WITH_NEW
) },
107 { "WBEM_S_POSTHOOK_WITH_STATUS", W_ERROR(WBEM_S_POSTHOOK_WITH_STATUS
) },
108 { "WBEM_S_POSTHOOK_WITH_OLD", W_ERROR(WBEM_S_POSTHOOK_WITH_OLD
) },
109 { "WBEM_S_REDO_PREHOOK_WITH_ORIGINAL_OBJECT", W_ERROR(WBEM_S_REDO_PREHOOK_WITH_ORIGINAL_OBJECT
) },
110 { "WBEM_S_SOURCE_NOT_AVAILABLE", W_ERROR(WBEM_S_SOURCE_NOT_AVAILABLE
) },
111 { "WBEM_E_FAILED", W_ERROR(WBEM_E_FAILED
) },
112 { "WBEM_E_NOT_FOUND", W_ERROR(WBEM_E_NOT_FOUND
) },
113 { "WBEM_E_ACCESS_DENIED", W_ERROR(WBEM_E_ACCESS_DENIED
) },
114 { "WBEM_E_PROVIDER_FAILURE", W_ERROR(WBEM_E_PROVIDER_FAILURE
) },
115 { "WBEM_E_TYPE_MISMATCH", W_ERROR(WBEM_E_TYPE_MISMATCH
) },
116 { "WBEM_E_OUT_OF_MEMORY", W_ERROR(WBEM_E_OUT_OF_MEMORY
) },
117 { "WBEM_E_INVALID_CONTEXT", W_ERROR(WBEM_E_INVALID_CONTEXT
) },
118 { "WBEM_E_INVALID_PARAMETER", W_ERROR(WBEM_E_INVALID_PARAMETER
) },
119 { "WBEM_E_NOT_AVAILABLE", W_ERROR(WBEM_E_NOT_AVAILABLE
) },
120 { "WBEM_E_CRITICAL_ERROR", W_ERROR(WBEM_E_CRITICAL_ERROR
) },
121 { "WBEM_E_INVALID_STREAM", W_ERROR(WBEM_E_INVALID_STREAM
) },
122 { "WBEM_E_NOT_SUPPORTED", W_ERROR(WBEM_E_NOT_SUPPORTED
) },
123 { "WBEM_E_INVALID_SUPERCLASS", W_ERROR(WBEM_E_INVALID_SUPERCLASS
) },
124 { "WBEM_E_INVALID_NAMESPACE", W_ERROR(WBEM_E_INVALID_NAMESPACE
) },
125 { "WBEM_E_INVALID_OBJECT", W_ERROR(WBEM_E_INVALID_OBJECT
) },
126 { "WBEM_E_INVALID_CLASS", W_ERROR(WBEM_E_INVALID_CLASS
) },
127 { "WBEM_E_PROVIDER_NOT_FOUND", W_ERROR(WBEM_E_PROVIDER_NOT_FOUND
) },
128 { "WBEM_E_INVALID_PROVIDER_REGISTRATION", W_ERROR(WBEM_E_INVALID_PROVIDER_REGISTRATION
) },
129 { "WBEM_E_PROVIDER_LOAD_FAILURE", W_ERROR(WBEM_E_PROVIDER_LOAD_FAILURE
) },
130 { "WBEM_E_INITIALIZATION_FAILURE", W_ERROR(WBEM_E_INITIALIZATION_FAILURE
) },
131 { "WBEM_E_TRANSPORT_FAILURE", W_ERROR(WBEM_E_TRANSPORT_FAILURE
) },
132 { "WBEM_E_INVALID_OPERATION", W_ERROR(WBEM_E_INVALID_OPERATION
) },
133 { "WBEM_E_INVALID_QUERY", W_ERROR(WBEM_E_INVALID_QUERY
) },
134 { "WBEM_E_INVALID_QUERY_TYPE", W_ERROR(WBEM_E_INVALID_QUERY_TYPE
) },
135 { "WBEM_E_ALREADY_EXISTS", W_ERROR(WBEM_E_ALREADY_EXISTS
) },
136 { "WBEM_E_OVERRIDE_NOT_ALLOWED", W_ERROR(WBEM_E_OVERRIDE_NOT_ALLOWED
) },
137 { "WBEM_E_PROPAGATED_QUALIFIER", W_ERROR(WBEM_E_PROPAGATED_QUALIFIER
) },
138 { "WBEM_E_PROPAGATED_PROPERTY", W_ERROR(WBEM_E_PROPAGATED_PROPERTY
) },
139 { "WBEM_E_UNEXPECTED", W_ERROR(WBEM_E_UNEXPECTED
) },
140 { "WBEM_E_ILLEGAL_OPERATION", W_ERROR(WBEM_E_ILLEGAL_OPERATION
) },
141 { "WBEM_E_CANNOT_BE_KEY", W_ERROR(WBEM_E_CANNOT_BE_KEY
) },
142 { "WBEM_E_INCOMPLETE_CLASS", W_ERROR(WBEM_E_INCOMPLETE_CLASS
) },
143 { "WBEM_E_INVALID_SYNTAX", W_ERROR(WBEM_E_INVALID_SYNTAX
) },
144 { "WBEM_E_NONDECORATED_OBJECT", W_ERROR(WBEM_E_NONDECORATED_OBJECT
) },
145 { "WBEM_E_READ_ONLY", W_ERROR(WBEM_E_READ_ONLY
) },
146 { "WBEM_E_PROVIDER_NOT_CAPABLE", W_ERROR(WBEM_E_PROVIDER_NOT_CAPABLE
) },
147 { "WBEM_E_CLASS_HAS_CHILDREN", W_ERROR(WBEM_E_CLASS_HAS_CHILDREN
) },
148 { "WBEM_E_CLASS_HAS_INSTANCES", W_ERROR(WBEM_E_CLASS_HAS_INSTANCES
) },
149 { "WBEM_E_QUERY_NOT_IMPLEMENTED", W_ERROR(WBEM_E_QUERY_NOT_IMPLEMENTED
) },
150 { "WBEM_E_ILLEGAL_NULL", W_ERROR(WBEM_E_ILLEGAL_NULL
) },
151 { "WBEM_E_INVALID_QUALIFIER_TYPE", W_ERROR(WBEM_E_INVALID_QUALIFIER_TYPE
) },
152 { "WBEM_E_INVALID_PROPERTY_TYPE", W_ERROR(WBEM_E_INVALID_PROPERTY_TYPE
) },
153 { "WBEM_E_VALUE_OUT_OF_RANGE", W_ERROR(WBEM_E_VALUE_OUT_OF_RANGE
) },
154 { "WBEM_E_CANNOT_BE_SINGLETON", W_ERROR(WBEM_E_CANNOT_BE_SINGLETON
) },
155 { "WBEM_E_INVALID_CIM_TYPE", W_ERROR(WBEM_E_INVALID_CIM_TYPE
) },
156 { "WBEM_E_INVALID_METHOD", W_ERROR(WBEM_E_INVALID_METHOD
) },
157 { "WBEM_E_INVALID_METHOD_PARAMETERS", W_ERROR(WBEM_E_INVALID_METHOD_PARAMETERS
) },
158 { "WBEM_E_SYSTEM_PROPERTY", W_ERROR(WBEM_E_SYSTEM_PROPERTY
) },
159 { "WBEM_E_INVALID_PROPERTY", W_ERROR(WBEM_E_INVALID_PROPERTY
) },
160 { "WBEM_E_CALL_CANCELLED", W_ERROR(WBEM_E_CALL_CANCELLED
) },
161 { "WBEM_E_SHUTTING_DOWN", W_ERROR(WBEM_E_SHUTTING_DOWN
) },
162 { "WBEM_E_PROPAGATED_METHOD", W_ERROR(WBEM_E_PROPAGATED_METHOD
) },
163 { "WBEM_E_UNSUPPORTED_PARAMETER", W_ERROR(WBEM_E_UNSUPPORTED_PARAMETER
) },
164 { "WBEM_E_MISSING_PARAMETER_ID", W_ERROR(WBEM_E_MISSING_PARAMETER_ID
) },
165 { "WBEM_E_INVALID_PARAMETER_ID", W_ERROR(WBEM_E_INVALID_PARAMETER_ID
) },
166 { "WBEM_E_NONCONSECUTIVE_PARAMETER_IDS", W_ERROR(WBEM_E_NONCONSECUTIVE_PARAMETER_IDS
) },
167 { "WBEM_E_PARAMETER_ID_ON_RETVAL", W_ERROR(WBEM_E_PARAMETER_ID_ON_RETVAL
) },
168 { "WBEM_E_INVALID_OBJECT_PATH", W_ERROR(WBEM_E_INVALID_OBJECT_PATH
) },
169 { "WBEM_E_OUT_OF_DISK_SPACE", W_ERROR(WBEM_E_OUT_OF_DISK_SPACE
) },
170 { "WBEM_E_BUFFER_TOO_SMALL", W_ERROR(WBEM_E_BUFFER_TOO_SMALL
) },
171 { "WBEM_E_UNSUPPORTED_PUT_EXTENSION", W_ERROR(WBEM_E_UNSUPPORTED_PUT_EXTENSION
) },
172 { "WBEM_E_UNKNOWN_OBJECT_TYPE", W_ERROR(WBEM_E_UNKNOWN_OBJECT_TYPE
) },
173 { "WBEM_E_UNKNOWN_PACKET_TYPE", W_ERROR(WBEM_E_UNKNOWN_PACKET_TYPE
) },
174 { "WBEM_E_MARSHAL_VERSION_MISMATCH", W_ERROR(WBEM_E_MARSHAL_VERSION_MISMATCH
) },
175 { "WBEM_E_MARSHAL_INVALID_SIGNATURE", W_ERROR(WBEM_E_MARSHAL_INVALID_SIGNATURE
) },
176 { "WBEM_E_INVALID_QUALIFIER", W_ERROR(WBEM_E_INVALID_QUALIFIER
) },
177 { "WBEM_E_INVALID_DUPLICATE_PARAMETER", W_ERROR(WBEM_E_INVALID_DUPLICATE_PARAMETER
) },
178 { "WBEM_E_TOO_MUCH_DATA", W_ERROR(WBEM_E_TOO_MUCH_DATA
) },
179 { "WBEM_E_SERVER_TOO_BUSY", W_ERROR(WBEM_E_SERVER_TOO_BUSY
) },
180 { "WBEM_E_INVALID_FLAVOR", W_ERROR(WBEM_E_INVALID_FLAVOR
) },
181 { "WBEM_E_CIRCULAR_REFERENCE", W_ERROR(WBEM_E_CIRCULAR_REFERENCE
) },
182 { "WBEM_E_UNSUPPORTED_CLASS_UPDATE", W_ERROR(WBEM_E_UNSUPPORTED_CLASS_UPDATE
) },
183 { "WBEM_E_CANNOT_CHANGE_KEY_INHERITANCE", W_ERROR(WBEM_E_CANNOT_CHANGE_KEY_INHERITANCE
) },
184 { "WBEM_E_CANNOT_CHANGE_INDEX_INHERITANCE", W_ERROR(WBEM_E_CANNOT_CHANGE_INDEX_INHERITANCE
) },
185 { "WBEM_E_TOO_MANY_PROPERTIES", W_ERROR(WBEM_E_TOO_MANY_PROPERTIES
) },
186 { "WBEM_E_UPDATE_TYPE_MISMATCH", W_ERROR(WBEM_E_UPDATE_TYPE_MISMATCH
) },
187 { "WBEM_E_UPDATE_OVERRIDE_NOT_ALLOWED", W_ERROR(WBEM_E_UPDATE_OVERRIDE_NOT_ALLOWED
) },
188 { "WBEM_E_UPDATE_PROPAGATED_METHOD", W_ERROR(WBEM_E_UPDATE_PROPAGATED_METHOD
) },
189 { "WBEM_E_METHOD_NOT_IMPLEMENTED", W_ERROR(WBEM_E_METHOD_NOT_IMPLEMENTED
) },
190 { "WBEM_E_METHOD_DISABLED", W_ERROR(WBEM_E_METHOD_DISABLED
) },
191 { "WBEM_E_REFRESHER_BUSY", W_ERROR(WBEM_E_REFRESHER_BUSY
) },
192 { "WBEM_E_UNPARSABLE_QUERY", W_ERROR(WBEM_E_UNPARSABLE_QUERY
) },
193 { "WBEM_E_NOT_EVENT_CLASS", W_ERROR(WBEM_E_NOT_EVENT_CLASS
) },
194 { "WBEM_E_MISSING_GROUP_WITHIN", W_ERROR(WBEM_E_MISSING_GROUP_WITHIN
) },
195 { "WBEM_E_MISSING_AGGREGATION_LIST", W_ERROR(WBEM_E_MISSING_AGGREGATION_LIST
) },
196 { "WBEM_E_PROPERTY_NOT_AN_OBJECT", W_ERROR(WBEM_E_PROPERTY_NOT_AN_OBJECT
) },
197 { "WBEM_E_AGGREGATING_BY_OBJECT", W_ERROR(WBEM_E_AGGREGATING_BY_OBJECT
) },
198 { "WBEM_E_UNINTERPRETABLE_PROVIDER_QUERY", W_ERROR(WBEM_E_UNINTERPRETABLE_PROVIDER_QUERY
) },
199 { "WBEM_E_BACKUP_RESTORE_WINMGMT_RUNNING", W_ERROR(WBEM_E_BACKUP_RESTORE_WINMGMT_RUNNING
) },
200 { "WBEM_E_QUEUE_OVERFLOW", W_ERROR(WBEM_E_QUEUE_OVERFLOW
) },
201 { "WBEM_E_PRIVILEGE_NOT_HELD", W_ERROR(WBEM_E_PRIVILEGE_NOT_HELD
) },
202 { "WBEM_E_INVALID_OPERATOR", W_ERROR(WBEM_E_INVALID_OPERATOR
) },
203 { "WBEM_E_LOCAL_CREDENTIALS", W_ERROR(WBEM_E_LOCAL_CREDENTIALS
) },
204 { "WBEM_E_CANNOT_BE_ABSTRACT", W_ERROR(WBEM_E_CANNOT_BE_ABSTRACT
) },
205 { "WBEM_E_AMENDED_OBJECT", W_ERROR(WBEM_E_AMENDED_OBJECT
) },
206 { "WBEM_E_CLIENT_TOO_SLOW", W_ERROR(WBEM_E_CLIENT_TOO_SLOW
) },
207 { "WBEM_E_NULL_SECURITY_DESCRIPTOR", W_ERROR(WBEM_E_NULL_SECURITY_DESCRIPTOR
) },
208 { "WBEM_E_TIMED_OUT", W_ERROR(WBEM_E_TIMED_OUT
) },
209 { "WBEM_E_INVALID_ASSOCIATION", W_ERROR(WBEM_E_INVALID_ASSOCIATION
) },
210 { "WBEM_E_AMBIGUOUS_OPERATION", W_ERROR(WBEM_E_AMBIGUOUS_OPERATION
) },
211 { "WBEM_E_QUOTA_VIOLATION", W_ERROR(WBEM_E_QUOTA_VIOLATION
) },
212 { "WBEM_E_RESERVED_001", W_ERROR(WBEM_E_RESERVED_001
) },
213 { "WBEM_E_RESERVED_002", W_ERROR(WBEM_E_RESERVED_002
) },
214 { "WBEM_E_UNSUPPORTED_LOCALE", W_ERROR(WBEM_E_UNSUPPORTED_LOCALE
) },
215 { "WBEM_E_HANDLE_OUT_OF_DATE", W_ERROR(WBEM_E_HANDLE_OUT_OF_DATE
) },
216 { "WBEM_E_CONNECTION_FAILED", W_ERROR(WBEM_E_CONNECTION_FAILED
) },
217 { "WBEM_E_INVALID_HANDLE_REQUEST", W_ERROR(WBEM_E_INVALID_HANDLE_REQUEST
) },
218 { "WBEM_E_PROPERTY_NAME_TOO_WIDE", W_ERROR(WBEM_E_PROPERTY_NAME_TOO_WIDE
) },
219 { "WBEM_E_CLASS_NAME_TOO_WIDE", W_ERROR(WBEM_E_CLASS_NAME_TOO_WIDE
) },
220 { "WBEM_E_METHOD_NAME_TOO_WIDE", W_ERROR(WBEM_E_METHOD_NAME_TOO_WIDE
) },
221 { "WBEM_E_QUALIFIER_NAME_TOO_WIDE", W_ERROR(WBEM_E_QUALIFIER_NAME_TOO_WIDE
) },
222 { "WBEM_E_RERUN_COMMAND", W_ERROR(WBEM_E_RERUN_COMMAND
) },
223 { "WBEM_E_DATABASE_VER_MISMATCH", W_ERROR(WBEM_E_DATABASE_VER_MISMATCH
) },
224 { "WBEM_E_VETO_DELETE", W_ERROR(WBEM_E_VETO_DELETE
) },
225 { "WBEM_E_VETO_PUT", W_ERROR(WBEM_E_VETO_PUT
) },
226 { "WBEM_E_INVALID_LOCALE", W_ERROR(WBEM_E_INVALID_LOCALE
) },
227 { "WBEM_E_PROVIDER_SUSPENDED", W_ERROR(WBEM_E_PROVIDER_SUSPENDED
) },
228 { "WBEM_E_SYNCHRONIZATION_REQUIRED", W_ERROR(WBEM_E_SYNCHRONIZATION_REQUIRED
) },
229 { "WBEM_E_NO_SCHEMA", W_ERROR(WBEM_E_NO_SCHEMA
) },
230 { "WBEM_E_PROVIDER_ALREADY_REGISTERED", W_ERROR(WBEM_E_PROVIDER_ALREADY_REGISTERED
) },
231 { "WBEM_E_PROVIDER_NOT_REGISTERED", W_ERROR(WBEM_E_PROVIDER_NOT_REGISTERED
) },
232 { "WBEM_E_FATAL_TRANSPORT_ERROR", W_ERROR(WBEM_E_FATAL_TRANSPORT_ERROR
) },
233 { "WBEM_E_ENCRYPTED_CONNECTION_REQUIRED", W_ERROR(WBEM_E_ENCRYPTED_CONNECTION_REQUIRED
) },
234 { "WBEM_E_PROVIDER_TIMED_OUT", W_ERROR(WBEM_E_PROVIDER_TIMED_OUT
) },
235 { "WBEM_E_NO_KEY", W_ERROR(WBEM_E_NO_KEY
) },
236 { "WBEM_E_PROVIDER_DISABLED", W_ERROR(WBEM_E_PROVIDER_DISABLED
) },
240 const char *wmi_errstr(WERROR werror
)
244 while (wmi_errs
[idx
].dos_errstr
!= NULL
) {
245 if (W_ERROR_V(wmi_errs
[idx
].werror
) ==
247 return wmi_errs
[idx
].dos_errstr
;
251 return win_errstr(werror
);