Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

681 lines
17 KiB

  1. /*++
  2. Copyright (c) 2000 Microsoft Corporation
  3. Module Name:
  4. cgenericlogger.cpp
  5. Abstract:
  6. This file contains base class definitions for logging RSOP security extension data to WMI.
  7. Author:
  8. Vishnu Patankar (VishnuP) 7-April-2000
  9. Environment:
  10. User Mode - Win32
  11. Revision History:
  12. --*/
  13. ///////////////////////////////////////////////////////////////////////////////
  14. // //
  15. // Includes //
  16. // //
  17. ///////////////////////////////////////////////////////////////////////////////
  18. #include "CGenericLogger.h"
  19. #include "scedllrc.h"
  20. extern HINSTANCE MyModuleHandle;
  21. /////////////////////////////////////////////////////////////////////
  22. // Construction/Destruction
  23. //////////////////////////////////////////////////////////////////////
  24. CGenericLogger::CGenericLogger(IWbemServices *pNamespace, PWSTR pwszGPOName, const PWSTR pwszSOMID)
  25. : m_bInitialized(FALSE),
  26. m_pHr(WBEM_S_NO_ERROR),
  27. m_pNamespace(NULL),
  28. m_pClassForSpawning(NULL),
  29. m_pObj(NULL)
  30. {
  31. m_pNamespace = pNamespace;
  32. m_pHr = WBEM_S_NO_ERROR;
  33. m_xbstrId = L"Id";
  34. if (!m_xbstrId) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;}
  35. m_xbstrGPO = L"GPOID";
  36. if (!m_xbstrGPO) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;}
  37. m_xbstrSOM = L"SOMID";
  38. if (!m_xbstrSOM) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;}
  39. m_xbstrPrecedence = L"precedence";
  40. if (!m_xbstrPrecedence) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;}
  41. m_xbstrStatus = L"Status";
  42. if (!m_xbstrStatus) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;}
  43. m_xbstrErrorCode = L"ErrorCode";
  44. if (!m_xbstrErrorCode) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;}
  45. m_xbstrCanonicalGPOName = pwszGPOName;
  46. if (!m_xbstrCanonicalGPOName) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;}
  47. m_xbstrSOMID = pwszSOMID;
  48. if (!m_xbstrSOMID) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;}
  49. done:
  50. return;
  51. }
  52. CGenericLogger::~CGenericLogger()
  53. {
  54. // Free class spawner instance and object instance (if need be)
  55. if (m_pObj) {
  56. m_pHr = m_pObj->Release();
  57. m_pObj = NULL;
  58. if ( FAILED(m_pHr) ) goto done;
  59. }
  60. if (m_pClassForSpawning) {
  61. m_pHr = m_pClassForSpawning->Release();
  62. m_pClassForSpawning = NULL;
  63. if ( FAILED(m_pHr) ) goto done;
  64. }
  65. done:
  66. m_pHr = WBEM_S_NO_ERROR;
  67. m_pNamespace = NULL;
  68. //doesn't matter if we cannot release
  69. m_bInitialized = FALSE;
  70. return;
  71. }
  72. /////////////////////////////////////////////////////////////////////
  73. // Set error method
  74. //////////////////////////////////////////////////////////////////////
  75. void CGenericLogger::SetError(HRESULT hr){
  76. m_pHr = hr;
  77. }
  78. /////////////////////////////////////////////////////////////////////
  79. // Get error method
  80. //////////////////////////////////////////////////////////////////////
  81. HRESULT CGenericLogger::GetError(){
  82. return m_pHr;
  83. }
  84. /////////////////////////////////////////////////////////////////////
  85. // Log properties common for all settings
  86. //////////////////////////////////////////////////////////////////////
  87. HRESULT CGenericLogger::PutGenericProperties(){
  88. GUID guid;
  89. WCHAR pwszGuid[MAX_GUID_STRING_LEN];
  90. // create unique guid for this instance
  91. m_pHr = CoCreateGuid( &guid );
  92. if ( FAILED(m_pHr) ) goto done;
  93. if (SCEP_NULL_GUID(guid)) goto done;
  94. SCEP_GUID_TO_STRING(guid, pwszGuid);
  95. // log generic properties
  96. m_pHr = PutProperty(m_pObj, m_xbstrId, pwszGuid);
  97. if ( FAILED(m_pHr) ) goto done;
  98. m_pHr = PutProperty(m_pObj, m_xbstrGPO, m_xbstrCanonicalGPOName);
  99. if ( FAILED(m_pHr) ) goto done;
  100. m_pHr = PutProperty(m_pObj, m_xbstrSOM, m_xbstrSOMID);
  101. if ( FAILED(m_pHr) ) goto done;
  102. m_pHr = PutProperty(m_pObj, m_xbstrStatus, (int)0);
  103. if ( FAILED(m_pHr) ) goto done;
  104. m_pHr = PutProperty(m_pObj, m_xbstrErrorCode, (int)ERROR_SUCCESS);
  105. if ( FAILED(m_pHr) ) goto done;
  106. done:
  107. return m_pHr;
  108. }
  109. /////////////////////////////////////////////////////////////////////
  110. // Commit the instance to the database and free resources
  111. //////////////////////////////////////////////////////////////////////
  112. HRESULT CGenericLogger::PutInstAndFreeObj(){
  113. m_pHr = m_pNamespace->PutInstance( m_pObj, WBEM_FLAG_CREATE_OR_UPDATE, NULL, NULL );
  114. if ( FAILED(m_pHr) ) goto done;
  115. done:
  116. m_pHr = m_pObj->Release();
  117. m_pObj = NULL;
  118. return m_pHr;
  119. }
  120. /////////////////////////////////////////////////////////////////////
  121. // Get
  122. // (a) an instance of spawner class (if needed) and
  123. // (b) an instance of a schema object from (a)
  124. //////////////////////////////////////////////////////////////////////
  125. HRESULT CGenericLogger::SpawnAnInstance(IWbemClassObject **pObj)
  126. {
  127. if(!m_pClassForSpawning){
  128. if(FAILED(m_pHr = m_pNamespace->GetObject(m_xbstrClassName, 0, NULL,
  129. &m_pClassForSpawning, NULL))){
  130. *pObj = NULL;
  131. return m_pHr;
  132. }
  133. }
  134. m_pHr = m_pClassForSpawning->SpawnInstance(0, pObj);
  135. return m_pHr;
  136. }
  137. /////////////////////////////////////////////////////////////////////
  138. // Overloaded logging functions
  139. //////////////////////////////////////////////////////////////////////
  140. /////////////////////////////////////////////////////////////////////
  141. // String logging
  142. //////////////////////////////////////////////////////////////////////
  143. HRESULT CGenericLogger::PutProperty(IWbemClassObject *pObj, const WCHAR *wcProperty, WCHAR *wcValue)
  144. {
  145. BSTR bstrName = SysAllocString(wcProperty);
  146. if (!bstrName) {m_pHr = WBEM_E_OUT_OF_MEMORY; return m_pHr;}
  147. VARIANT *vp = new VARIANT;
  148. if (vp == NULL ) { SysFreeString(bstrName); m_pHr = WBEM_E_OUT_OF_MEMORY; return m_pHr;}
  149. VariantInit(vp);
  150. V_VT(vp) = VT_BSTR;
  151. V_BSTR(vp) = SysAllocString(wcValue);
  152. if(!V_BSTR(vp)){
  153. SysFreeString(bstrName);
  154. delete vp;
  155. m_pHr = WBEM_E_OUT_OF_MEMORY;
  156. goto done;
  157. }
  158. if( wcValue != NULL ) {
  159. m_pHr = pObj->Put(bstrName, 0, vp, NULL);
  160. if(FAILED(m_pHr)){
  161. SysFreeString(bstrName);
  162. VariantClear(vp);
  163. delete vp;
  164. m_pHr = WBEM_E_OUT_OF_MEMORY;
  165. goto done;
  166. }
  167. }else m_pHr = WBEM_E_FAILED;
  168. SysFreeString(bstrName);
  169. VariantClear(vp);
  170. delete vp;
  171. done:
  172. return m_pHr;
  173. }
  174. /////////////////////////////////////////////////////////////////////
  175. // Integer logging
  176. //////////////////////////////////////////////////////////////////////
  177. HRESULT CGenericLogger::PutProperty(IWbemClassObject *pObj, const WCHAR *wcProperty, int iValue)
  178. {
  179. BSTR bstrName = SysAllocString(wcProperty);
  180. if (!bstrName) {m_pHr = WBEM_E_OUT_OF_MEMORY; return m_pHr;}
  181. VARIANT *pv = new VARIANT;
  182. if (pv == NULL ) { SysFreeString(bstrName); m_pHr = WBEM_E_OUT_OF_MEMORY; return m_pHr;}
  183. if(iValue != SCE_NO_VALUE){
  184. VariantInit(pv);
  185. V_VT(pv) = VT_I4;
  186. V_I4(pv) = iValue;
  187. m_pHr = pObj->Put(bstrName, 0, pv, NULL);
  188. VariantClear(pv);
  189. if(FAILED(m_pHr)){
  190. SysFreeString(bstrName);
  191. delete pv;
  192. if ( FAILED(m_pHr) ) goto done;
  193. }
  194. }else m_pHr = WBEM_E_FAILED;
  195. SysFreeString(bstrName);
  196. delete pv;
  197. done:
  198. return m_pHr;
  199. }
  200. /////////////////////////////////////////////////////////////////////
  201. // Boolean logging
  202. //////////////////////////////////////////////////////////////////////
  203. HRESULT CGenericLogger::PutProperty(IWbemClassObject *pObj, const WCHAR *wcProperty, bool bValue)
  204. {
  205. BSTR bstrName = SysAllocString(wcProperty);
  206. if (!bstrName) {m_pHr = WBEM_E_OUT_OF_MEMORY; return m_pHr;}
  207. VARIANT *pv = new VARIANT;
  208. if (pv == NULL ) { SysFreeString(bstrName); m_pHr = WBEM_E_OUT_OF_MEMORY; return m_pHr;}
  209. VariantInit(pv);
  210. V_VT(pv) = VT_BOOL;
  211. if(bValue) V_BOOL(pv) = VARIANT_TRUE;
  212. else V_BOOL(pv) = VARIANT_FALSE;
  213. m_pHr = pObj->Put(bstrName, 0, pv, NULL);
  214. SysFreeString(bstrName);
  215. VariantClear(pv);
  216. delete pv;
  217. return m_pHr;
  218. }
  219. /////////////////////////////////////////////////////////////////////
  220. // List logging
  221. //////////////////////////////////////////////////////////////////////
  222. HRESULT CGenericLogger::PutProperty(IWbemClassObject *pObj, const WCHAR *wcProperty, PSCE_NAME_LIST strList)
  223. {
  224. if ( NULL == strList ) return m_pHr; // nothing to save
  225. long lCount=0;
  226. PSCE_NAME_LIST pTemp;
  227. VARIANT v;
  228. VariantInit(&v);
  229. for ( pTemp = strList; pTemp != NULL; pTemp=pTemp->Next,lCount++);
  230. if ( lCount == 0 ) return m_pHr; // nothing to save
  231. BSTR bstrName = SysAllocString(wcProperty);
  232. if (!bstrName)
  233. {
  234. m_pHr = WBEM_E_OUT_OF_MEMORY;
  235. goto done;
  236. }
  237. SAFEARRAYBOUND sbArrayBounds ;
  238. sbArrayBounds.cElements = lCount;
  239. sbArrayBounds.lLbound = 0;
  240. if(V_ARRAY(&v) = SafeArrayCreate(VT_BSTR, 1, &sbArrayBounds))
  241. {
  242. V_VT(&v) = VT_BSTR | VT_ARRAY ;
  243. BSTR bstrVal;
  244. long j;
  245. //get names in the SCE_NAME_LIST structure into the VARIANT
  246. for(j=0, pTemp = strList; j < lCount && pTemp != NULL ; j++, pTemp=pTemp->Next)
  247. {
  248. bstrVal = SysAllocString(pTemp->Name);
  249. if(NULL == bstrVal)
  250. {
  251. m_pHr = WBEM_E_OUT_OF_MEMORY;
  252. goto done;
  253. }
  254. m_pHr = SafeArrayPutElement(V_ARRAY(&v), &j, bstrVal);
  255. SysFreeString(bstrVal);
  256. if(FAILED(m_pHr))
  257. {
  258. goto done;
  259. }
  260. }
  261. m_pHr = pObj->Put(bstrName, 0, &v, NULL);
  262. if ( FAILED(m_pHr) ) goto done;
  263. }else
  264. {
  265. m_pHr = WBEM_E_FAILED;
  266. }
  267. done:
  268. SysFreeString(bstrName);
  269. VariantClear(&v);
  270. return m_pHr;
  271. }
  272. /////////////////////////////////////////////////////////////////////
  273. // Get method
  274. //////////////////////////////////////////////////////////////////////
  275. HRESULT CGenericLogger::GetProperty(IWbemClassObject *pObj, const WCHAR *wcProperty, int *piValue)
  276. {
  277. VARIANT v;
  278. BSTR bstrProp = SysAllocString(wcProperty);
  279. if(!bstrProp) {m_pHr = WBEM_E_OUT_OF_MEMORY; goto done;}
  280. VariantInit(&v);
  281. if(SUCCEEDED(m_pHr = pObj->Get(bstrProp, 0, &v, NULL, NULL))){
  282. if(V_VT(&v) == VT_I4) *piValue = V_I4(&v);
  283. else if(V_VT(&v) == VT_EMPTY || V_VT(&v) == VT_NULL ) m_pHr = WBEM_S_RESET_TO_DEFAULT;
  284. else *piValue = 0;
  285. }
  286. SysFreeString(bstrProp);
  287. VariantClear(&v);
  288. done:
  289. return m_pHr;
  290. }
  291. HRESULT DeleteInstances( WCHAR *pwszClass, IWbemServices *pWbemServices )
  292. {
  293. HRESULT hr = WBEM_E_OUT_OF_MEMORY;
  294. try {
  295. IEnumWbemClassObject *pEnum = NULL;
  296. XBStr xbstrClass( pwszClass );
  297. if ( !xbstrClass )
  298. return WBEM_E_OUT_OF_MEMORY;
  299. hr = pWbemServices->CreateInstanceEnum( xbstrClass,
  300. WBEM_FLAG_SHALLOW,
  301. NULL,
  302. &pEnum );
  303. if ( FAILED(hr) )
  304. return hr;
  305. XInterface<IEnumWbemClassObject> xEnum( pEnum );
  306. XBStr xbstrPath( L"__PATH" );
  307. if ( !xbstrPath )
  308. return WBEM_E_OUT_OF_MEMORY;
  309. IWbemClassObject *pInstance = NULL;
  310. ULONG ulReturned = 1;
  311. LONG TIMEOUT = -1;
  312. while ( ulReturned == 1 ) {
  313. hr = pEnum->Next( TIMEOUT,
  314. 1,
  315. &pInstance,
  316. &ulReturned );
  317. if ( hr == WBEM_S_NO_ERROR && ulReturned == 1 ) {
  318. XInterface<IWbemClassObject> xInstance( pInstance );
  319. VARIANT var;
  320. VariantInit( &var );
  321. hr = pInstance->Get( xbstrPath,
  322. 0L,
  323. &var,
  324. NULL,
  325. NULL );
  326. if ( FAILED(hr) )
  327. return hr;
  328. hr = pWbemServices->DeleteInstance( var.bstrVal,
  329. 0L,
  330. NULL,
  331. NULL );
  332. VariantClear( &var );
  333. if ( FAILED(hr) )
  334. return hr;
  335. }
  336. }
  337. } catch (...) {
  338. // do nothing
  339. }
  340. return hr;
  341. }
  342. /////////////////////////////////////////////////////////////////////
  343. // Error code conversion routines
  344. //////////////////////////////////////////////////////////////////////
  345. /////////////////////////////////////////////////////////////////////
  346. // ESCAPE to DOS
  347. //////////////////////////////////////////////////////////////////////
  348. /*
  349. DWORD
  350. ScepSceStatusToDosError(
  351. IN SCESTATUS SceStatus
  352. )
  353. {
  354. switch(SceStatus) {
  355. case SCESTATUS_SUCCESS:
  356. return(NO_ERROR);
  357. case SCESTATUS_OTHER_ERROR:
  358. return(ERROR_EXTENDED_ERROR);
  359. case SCESTATUS_INVALID_PARAMETER:
  360. return(ERROR_INVALID_PARAMETER);
  361. case SCESTATUS_RECORD_NOT_FOUND:
  362. return(ERROR_NO_MORE_ITEMS);
  363. case SCESTATUS_NO_MAPPING:
  364. return(ERROR_NONE_MAPPED);
  365. case SCESTATUS_TRUST_FAIL:
  366. return(ERROR_TRUSTED_DOMAIN_FAILURE);
  367. case SCESTATUS_INVALID_DATA:
  368. return(ERROR_INVALID_DATA);
  369. case SCESTATUS_OBJECT_EXIST:
  370. return(ERROR_FILE_EXISTS);
  371. case SCESTATUS_BUFFER_TOO_SMALL:
  372. return(ERROR_INSUFFICIENT_BUFFER);
  373. case SCESTATUS_PROFILE_NOT_FOUND:
  374. return(ERROR_FILE_NOT_FOUND);
  375. case SCESTATUS_BAD_FORMAT:
  376. return(ERROR_BAD_FORMAT);
  377. case SCESTATUS_NOT_ENOUGH_RESOURCE:
  378. return(ERROR_NOT_ENOUGH_MEMORY);
  379. case SCESTATUS_ACCESS_DENIED:
  380. return(ERROR_ACCESS_DENIED);
  381. case SCESTATUS_CANT_DELETE:
  382. return(ERROR_CURRENT_DIRECTORY);
  383. case SCESTATUS_PREFIX_OVERFLOW:
  384. return(ERROR_BUFFER_OVERFLOW);
  385. case SCESTATUS_ALREADY_RUNNING:
  386. return(ERROR_SERVICE_ALREADY_RUNNING);
  387. case SCESTATUS_SERVICE_NOT_SUPPORT:
  388. return(ERROR_NOT_SUPPORTED);
  389. case SCESTATUS_MOD_NOT_FOUND:
  390. return(ERROR_MOD_NOT_FOUND);
  391. case SCESTATUS_EXCEPTION_IN_SERVER:
  392. return(ERROR_EXCEPTION_IN_SERVICE);
  393. default:
  394. return(ERROR_EXTENDED_ERROR);
  395. }
  396. }
  397. */
  398. /////////////////////////////////////////////////////////////////////
  399. // DOS to WBEM
  400. //////////////////////////////////////////////////////////////////////
  401. HRESULT
  402. ScepDosErrorToWbemError(
  403. IN DWORD rc
  404. )
  405. {
  406. switch(rc) {
  407. case NO_ERROR:
  408. return(WBEM_S_NO_ERROR);
  409. case ERROR_INVALID_PARAMETER:
  410. return(WBEM_E_INVALID_PARAMETER);
  411. case ERROR_NO_MORE_ITEMS:
  412. case ERROR_NONE_MAPPED:
  413. case ERROR_NOT_FOUND:
  414. case ERROR_FILE_NOT_FOUND:
  415. case ERROR_MOD_NOT_FOUND:
  416. return(WBEM_E_NOT_FOUND);
  417. case ERROR_INVALID_DATA:
  418. case ERROR_BAD_FORMAT:
  419. return(WBEM_E_INVALID_CONTEXT);
  420. case ERROR_FILE_EXISTS:
  421. case ERROR_SERVICE_ALREADY_RUNNING:
  422. return(WBEM_S_ALREADY_EXISTS);
  423. case ERROR_INSUFFICIENT_BUFFER:
  424. return(WBEM_E_BUFFER_TOO_SMALL);
  425. case ERROR_NOT_ENOUGH_MEMORY:
  426. return(WBEM_E_OUT_OF_MEMORY);
  427. case ERROR_ACCESS_DENIED:
  428. return(WBEM_E_ACCESS_DENIED);
  429. case ERROR_BUFFER_OVERFLOW:
  430. return(WBEM_E_QUEUE_OVERFLOW);
  431. case ERROR_NOT_SUPPORTED:
  432. return(WBEM_E_NOT_SUPPORTED);
  433. case ERROR_NO_MATCH:
  434. return(WBEM_E_INVALID_CLASS);
  435. default:
  436. return(WBEM_E_FAILED);
  437. }
  438. }
  439. /////////////////////////////////////////////////////////////////////
  440. // WBEM to DOS
  441. //////////////////////////////////////////////////////////////////////
  442. DWORD
  443. ScepWbemErrorToDosError(
  444. IN HRESULT m_pHr
  445. )
  446. {
  447. switch(m_pHr) {
  448. case WBEM_S_NO_ERROR:
  449. // this is a boolean used while enumeration etc. - so really a tautology check (not a real error)
  450. case WBEM_S_FALSE:
  451. return(NO_ERROR);
  452. case WBEM_E_INVALID_PARAMETER:
  453. return(ERROR_INVALID_PARAMETER);
  454. case WBEM_E_INVALID_CLASS:
  455. return(ERROR_NO_MATCH);
  456. case WBEM_E_NOT_FOUND:
  457. return(ERROR_NOT_FOUND);
  458. case WBEM_E_INVALID_CONTEXT:
  459. return(ERROR_BAD_FORMAT);
  460. case WBEM_S_ALREADY_EXISTS:
  461. return(ERROR_FILE_EXISTS);
  462. case WBEM_E_BUFFER_TOO_SMALL:
  463. return(ERROR_INSUFFICIENT_BUFFER);
  464. case WBEM_E_OUT_OF_MEMORY:
  465. return(ERROR_NOT_ENOUGH_MEMORY);
  466. case WBEM_E_ACCESS_DENIED:
  467. return(ERROR_ACCESS_DENIED);
  468. case WBEM_E_QUEUE_OVERFLOW:
  469. return(ERROR_BUFFER_OVERFLOW);
  470. case WBEM_E_NOT_SUPPORTED:
  471. return(ERROR_NOT_SUPPORTED);
  472. default:
  473. return(ERROR_INVALID_PARAMETER);
  474. }
  475. }