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.

2743 lines
77 KiB

  1. /*++
  2. Copyright (c) 1998-2000 Microsoft Corporation
  3. Module Name:
  4. iisprov.cpp
  5. Abstract:
  6. Defines the CIISInstProvider class. An object of this class is
  7. created by the class factory for each connection.
  8. Author:
  9. ???
  10. Revision History:
  11. Mohit Srivastava 18-Dec-00
  12. --*/
  13. #define WMI_HR(hr) \
  14. (FAILED(hr) && HRESULT_FACILITY(hr) != FACILITY_ITF) ? WBEM_E_FAILED : hr
  15. #include "iisprov.h"
  16. #include "appladmin.h"
  17. #include "enum.h"
  18. #include "ipsecurity.h"
  19. #include "adminacl.h"
  20. #include "certmap.h"
  21. #include "iiswmimsg.h"
  22. #include "pusher.h"
  23. #include "instancehelper.h"
  24. #include "webservicemethod.h"
  25. #include "queryhelper.h"
  26. #include "smartpointer.h"
  27. #include "secconlib.h"
  28. #include "MultiSzHelper.h"
  29. #define PARAMS WMI_METHOD_PARAM_DATA
  30. #define METHODS WMI_METHOD_DATA
  31. #define CLASSES WMI_CLASS_DATA
  32. #define PROPS METABASE_PROPERTY_DATA
  33. extern CDynSchema* g_pDynSch; // Initialized to NULL in schemadynamic.cpp
  34. bool CIISInstProvider::ms_bInitialized = false;
  35. CSafeAutoCriticalSection* CIISInstProvider::m_SafeCritSec = NULL;
  36. HRESULT CIISInstProvider::DoInitialize(
  37. LPWSTR i_wszUser,
  38. LONG i_lFlags,
  39. LPWSTR i_wszNamespace,
  40. LPWSTR i_wszLocale,
  41. IWbemServices* i_pNamespace,
  42. IWbemContext* i_pCtx,
  43. IWbemProviderInitSink* i_pInitSink)
  44. /*++
  45. Synopsis:
  46. According to stevm from WMI, calls to Initialize are guaranteed to be
  47. synchronized - so long as all providers are in the same namespace.
  48. Arguments: [wszUser] -
  49. [lFlags] -
  50. [wszNamespace] -
  51. [wszLocale] -
  52. [pNamespace] -
  53. [pCtx] -
  54. [pInitSink] -
  55. Return Value:
  56. --*/
  57. {
  58. HRESULT hr = S_OK;
  59. CSafeLock csSafe(*m_SafeCritSec);
  60. hr = csSafe.Lock();
  61. hr = HRESULT_FROM_WIN32(hr);
  62. if(FAILED(hr))
  63. {
  64. return hr;
  65. }
  66. CPusher pusher;
  67. CSchemaExtensions* pcatalog = NULL;
  68. hr = WBEM_S_NO_ERROR; // return value
  69. LONG lStatus = WBEM_S_INITIALIZED; // param to SetStatus
  70. CComPtr<IWbemContext> spCtx = i_pCtx; // must AddRef according to doc
  71. //
  72. // If we hit this, we are leaking memory, because m_pNamespace is
  73. // initilaized in this function only and cleaned up by the destructor only.
  74. //
  75. DBG_ASSERT(m_pNamespace == NULL);
  76. //
  77. // Initialize members
  78. //
  79. m_pNamespace = new CWbemServices(i_pNamespace);
  80. if(m_pNamespace == NULL)
  81. {
  82. hr = WBEM_E_OUT_OF_MEMORY;
  83. i_pInitSink->SetStatus(WBEM_E_FAILED,0);
  84. return hr;
  85. }
  86. //
  87. // If we've already initialized globals, jump to the end.
  88. // Else, we're going to initialize globals.
  89. //
  90. if(ms_bInitialized)
  91. {
  92. goto exit;
  93. }
  94. pcatalog = new CSchemaExtensions();
  95. if(pcatalog == NULL)
  96. {
  97. hr = WBEM_E_OUT_OF_MEMORY;
  98. goto exit;
  99. }
  100. //
  101. // Initialize the g_pDynSch
  102. // Populate pCatalog
  103. //
  104. DBGPRINTF((DBG_CONTEXT, "=> Instantiating CDynSchema\n"));
  105. DBG_ASSERT(!g_pDynSch);
  106. g_pDynSch = new CDynSchema();
  107. if(g_pDynSch == NULL)
  108. {
  109. hr = WBEM_E_OUT_OF_MEMORY;
  110. goto exit;
  111. }
  112. try
  113. {
  114. hr = g_pDynSch->Initialize();
  115. if(FAILED(hr))
  116. {
  117. goto exit;
  118. }
  119. hr = g_pDynSch->RunRules(pcatalog);
  120. if(FAILED(hr))
  121. {
  122. goto exit;
  123. }
  124. //
  125. // Use pCatalog, g_pDynSch to update repository
  126. //
  127. hr = pusher.Initialize(m_pNamespace, i_pCtx);
  128. if(FAILED(hr))
  129. {
  130. goto exit;
  131. }
  132. hr = pusher.Push(
  133. pcatalog,
  134. g_pDynSch->GetHashClasses(),
  135. g_pDynSch->GetHashAssociations());
  136. }
  137. catch (CIIsProvException e)
  138. {
  139. hr = e.GetHR();
  140. }
  141. catch (HRESULT hrError)
  142. {
  143. hr = hrError;
  144. }
  145. catch (...)
  146. {
  147. hr = WBEM_E_FAILED;
  148. }
  149. if(FAILED(hr))
  150. {
  151. goto exit;
  152. }
  153. ms_bInitialized = true;
  154. exit:
  155. //
  156. // Destructor makes IST calls, so call before we unload dispenser dll.
  157. //
  158. delete pcatalog;
  159. pcatalog = NULL;
  160. if(FAILED(hr))
  161. {
  162. DBG_ASSERT(ms_bInitialized == false);
  163. DBGPRINTF((DBG_CONTEXT, "<= Deleting CDynSchema\n"));
  164. delete g_pDynSch;
  165. g_pDynSch = NULL;
  166. lStatus = WBEM_E_FAILED;
  167. }
  168. //
  169. //Let CIMOM know you are initialized
  170. //
  171. i_pInitSink->SetStatus(lStatus,0);
  172. csSafe.Unlock();
  173. return hr;
  174. }
  175. HRESULT CIISInstProvider::DoCreateInstanceEnumAsync(
  176. const BSTR i_ClassName,
  177. long i_lFlags,
  178. IWbemContext* i_pCtx,
  179. IWbemObjectSink FAR* i_pHandler
  180. )
  181. /*++
  182. Synopsis:
  183. Asynchronously enumerates the instances.
  184. Arguments:
  185. Return Value:
  186. --*/
  187. {
  188. DBG_ASSERT(m_pNamespace != NULL);
  189. HRESULT hr = WBEM_S_NO_ERROR;
  190. IWbemClassObject FAR* pes = NULL;
  191. //
  192. // Do a check of arguments.
  193. //
  194. if(i_ClassName == NULL || i_pHandler == NULL)
  195. {
  196. return WBEM_E_INVALID_PARAMETER;
  197. }
  198. try
  199. {
  200. WorkerEnumObjectAsync(i_ClassName, i_pHandler);
  201. }
  202. catch (CIIsProvException e)
  203. {
  204. pes = ConstructExtendedStatus(&e);
  205. hr = e.GetHR();
  206. }
  207. catch (HRESULT hrError)
  208. {
  209. hr = hrError;
  210. }
  211. catch (...)
  212. {
  213. hr = WBEM_E_FAILED;
  214. }
  215. //
  216. // Set status
  217. //
  218. if(!pes)
  219. {
  220. pes = ConstructExtendedStatus(hr);
  221. }
  222. SCODE sc = i_pHandler->SetStatus(WBEM_STATUS_COMPLETE, hr, NULL, pes);
  223. if(pes)
  224. {
  225. pes->Release();
  226. }
  227. return sc;
  228. }
  229. HRESULT CIISInstProvider::DoDeleteInstanceAsync(
  230. const BSTR i_ObjectPath,
  231. long i_lFlags,
  232. IWbemContext* i_pCtx,
  233. IWbemObjectSink* i_pHandler
  234. )
  235. {
  236. DBG_ASSERT(m_pNamespace != NULL);
  237. CObjectPathParser PathParser(e_ParserAcceptRelativeNamespace);
  238. ParsedObjectPath* pParsedObject = NULL;
  239. IWbemClassObject* pes = NULL;
  240. HRESULT hr = WBEM_S_NO_ERROR;
  241. if(i_ObjectPath == NULL || i_pHandler == NULL)
  242. {
  243. return WBEM_E_INVALID_PARAMETER;
  244. }
  245. try
  246. {
  247. hr = CUtils::ParserErrToHR( PathParser.Parse(i_ObjectPath, &pParsedObject) );
  248. THROW_ON_ERROR(hr);
  249. DBG_ASSERT(pParsedObject);
  250. WorkerDeleteObjectAsync(pParsedObject);
  251. }
  252. catch (CIIsProvException e)
  253. {
  254. pes = ConstructExtendedStatus(&e);
  255. hr = e.GetHR();
  256. }
  257. catch (HRESULT hrError)
  258. {
  259. hr = hrError;
  260. }
  261. catch (...)
  262. {
  263. hr = WBEM_E_FAILED;
  264. }
  265. if (pParsedObject)
  266. {
  267. PathParser.Free(pParsedObject);
  268. }
  269. //
  270. // Set status
  271. //
  272. if(!pes)
  273. {
  274. pes = ConstructExtendedStatus(hr);
  275. }
  276. SCODE sc = i_pHandler->SetStatus(WBEM_STATUS_COMPLETE, hr, NULL, pes);
  277. if(pes)
  278. {
  279. pes->Release();
  280. }
  281. return sc;
  282. }
  283. HRESULT CIISInstProvider::DoExecMethodAsync(
  284. const BSTR i_strObjectPath,
  285. const BSTR i_strMethodName,
  286. long i_lFlags,
  287. IWbemContext* i_pCtx,
  288. IWbemClassObject* i_pInParams,
  289. IWbemObjectSink* i_pHandler
  290. )
  291. {
  292. DBG_ASSERT(m_pNamespace != NULL);
  293. HRESULT hr = WBEM_S_NO_ERROR;
  294. IWbemClassObject* pes = NULL;
  295. //
  296. // Do a check of arguments and make sure we have pointer to Namespace
  297. //
  298. if( i_pHandler == NULL ||
  299. i_strMethodName == NULL ||
  300. i_strObjectPath == NULL )
  301. {
  302. return WBEM_E_INVALID_PARAMETER;
  303. }
  304. try
  305. {
  306. WorkerExecMethodAsync(
  307. i_strObjectPath,
  308. i_strMethodName,
  309. i_pCtx,
  310. i_pInParams,
  311. i_pHandler
  312. );
  313. }
  314. catch (_com_error c)
  315. {
  316. hr = c.Error();
  317. }
  318. catch (CIIsProvException e)
  319. {
  320. pes = ConstructExtendedStatus(&e);
  321. hr = e.GetHR();
  322. }
  323. catch (HRESULT hrError)
  324. {
  325. hr = hrError;
  326. }
  327. catch (...)
  328. {
  329. hr = WBEM_E_FAILED;
  330. }
  331. //
  332. // Set status
  333. //
  334. if(!pes)
  335. {
  336. pes = ConstructExtendedStatus(hr);
  337. }
  338. SCODE sc = i_pHandler->SetStatus(WBEM_STATUS_COMPLETE, hr, NULL, pes);
  339. if(pes)
  340. {
  341. pes->Release();
  342. }
  343. return sc;
  344. }
  345. HRESULT CIISInstProvider::DoGetObjectAsync(
  346. const BSTR i_ObjectPath,
  347. long i_lFlags,
  348. IWbemContext* i_pCtx,
  349. IWbemObjectSink* i_pHandler
  350. )
  351. /*++
  352. Synopsis:
  353. Creates an instance given a particular path value.
  354. Arguments:
  355. Return Value:
  356. --*/
  357. {
  358. DBG_ASSERT(m_pNamespace != NULL);
  359. IWbemClassObject* pObj = NULL;
  360. IWbemClassObject* pes = NULL;
  361. HRESULT hr = WBEM_S_NO_ERROR;
  362. if(i_ObjectPath == NULL || i_pHandler == NULL)
  363. {
  364. return WBEM_E_INVALID_PARAMETER;
  365. }
  366. try
  367. {
  368. WorkerGetObjectAsync(&pObj, i_ObjectPath, false);
  369. hr = i_pHandler->Indicate(1,&pObj);
  370. pObj->Release();
  371. }
  372. catch (CIIsProvException e)
  373. {
  374. pes = ConstructExtendedStatus(&e);
  375. hr = e.GetHR();
  376. }
  377. catch (HRESULT hrError)
  378. {
  379. hr = hrError;
  380. }
  381. catch (...)
  382. {
  383. hr = WBEM_E_FAILED;
  384. }
  385. //
  386. // Set status
  387. //
  388. if(!pes)
  389. {
  390. pes = ConstructExtendedStatus(hr);
  391. }
  392. SCODE sc = i_pHandler->SetStatus(WBEM_STATUS_COMPLETE, hr, NULL, pes);
  393. if(pes)
  394. {
  395. pes->Release();
  396. }
  397. return sc;
  398. }
  399. HRESULT CIISInstProvider::DoPutInstanceAsync(
  400. IWbemClassObject* i_pObj,
  401. long i_lFlags,
  402. IWbemContext* i_pCtx,
  403. IWbemObjectSink* i_pHandler
  404. )
  405. {
  406. DBG_ASSERT(m_pNamespace != NULL);
  407. HRESULT hr = WBEM_S_NO_ERROR;
  408. CObjectPathParser PathParser(e_ParserAcceptRelativeNamespace);
  409. ParsedObjectPath* pParsedObject = NULL;
  410. CComPtr<IWbemClassObject> spObjOld;
  411. CComBSTR sbstrObjPath;
  412. IWbemClassObject* pes = NULL;
  413. if(i_pObj == NULL || i_pCtx == NULL || i_pHandler == NULL)
  414. {
  415. return WBEM_E_INVALID_PARAMETER;
  416. }
  417. try
  418. {
  419. _bstr_t bstr = L"__RelPath";
  420. _variant_t vtObjPath;
  421. hr = i_pObj->Get(bstr, 0, &vtObjPath, NULL, NULL);
  422. THROW_ON_ERROR(hr);
  423. if (vtObjPath.vt != VT_BSTR)
  424. {
  425. bstr = L"__Class";
  426. vtObjPath.Clear();
  427. hr = i_pObj->Get(bstr, 0, &vtObjPath, NULL, NULL);
  428. THROW_ON_ERROR(hr);
  429. //
  430. // This means the user is trying to create an instance but did not
  431. // specify a primary key.
  432. }
  433. if(vtObjPath.vt != VT_BSTR)
  434. {
  435. THROW_ON_ERROR(WBEM_E_INVALID_OBJECT);
  436. }
  437. hr = CUtils::ParserErrToHR( PathParser.Parse(vtObjPath.bstrVal, &pParsedObject) );
  438. THROW_ON_ERROR(hr);
  439. DBG_ASSERT(pParsedObject != NULL);
  440. bool bInstanceExists = false; // existing or new instance
  441. WMI_CLASS* pWmiClass = NULL;
  442. ValidatePutParsedObject(
  443. pParsedObject,
  444. i_pObj,
  445. NULL,
  446. &bInstanceExists,
  447. &pWmiClass);
  448. //
  449. // We auto-generate primary key only for IIsWebServer and IIsFtpServer
  450. //
  451. if( pParsedObject->m_dwNumKeys == 0 &&
  452. (pWmiClass->pkt == &METABASE_KEYTYPE_DATA::s_IIsWebServer ||
  453. pWmiClass->pkt == &METABASE_KEYTYPE_DATA::s_IIsFtpServer) )
  454. {
  455. //
  456. // Get the ServerComment
  457. //
  458. _variant_t vtServerComment;
  459. hr = i_pObj->Get(PROPS::s_ServerComment.pszPropName,
  460. 0, &vtServerComment, NULL, NULL);
  461. if(hr == WBEM_E_NOT_FOUND || vtServerComment.vt != VT_BSTR)
  462. {
  463. vtServerComment.Clear();
  464. vtServerComment.bstrVal = NULL;
  465. vtServerComment.vt = VT_BSTR;
  466. hr = WBEM_S_NO_ERROR;
  467. }
  468. THROW_ON_ERROR(hr);
  469. //
  470. // Create the site
  471. //
  472. eSC_SUPPORTED_SERVICES eServiceId;
  473. _bstr_t sbstrKeyValue;
  474. DWORD dwSiteId = 0;
  475. WCHAR wszSiteId[11] = {0};
  476. if( pWmiClass->pkt == &METABASE_KEYTYPE_DATA::s_IIsWebServer )
  477. {
  478. eServiceId = SC_W3SVC;
  479. sbstrKeyValue = "w3svc/";
  480. }
  481. else
  482. {
  483. eServiceId = SC_MSFTPSVC;
  484. sbstrKeyValue = "msftpsvc/";
  485. }
  486. CServiceMethod method(eServiceId);
  487. hr = method.Init();
  488. THROW_ON_ERROR(hr);
  489. hr = method.CreateNewSite(vtServerComment.bstrVal, &dwSiteId);
  490. THROW_ON_ERROR(hr);
  491. sbstrKeyValue += _itow(dwSiteId, wszSiteId, 10);
  492. VARIANT vtKeyValue;
  493. vtKeyValue.bstrVal = sbstrKeyValue;
  494. vtKeyValue.vt = VT_BSTR;
  495. THROW_ON_FALSE(pParsedObject->AddKeyRefEx(pWmiClass->pszKeyName, &vtKeyValue));
  496. }
  497. if( pWmiClass->pkt != &METABASE_KEYTYPE_DATA::s_TYPE_AdminACE &&
  498. pWmiClass->pkt != &METABASE_KEYTYPE_DATA::s_TYPE_AdminACL &&
  499. pWmiClass->pkt != &METABASE_KEYTYPE_DATA::s_TYPE_IPSecurity )
  500. {
  501. WorkerGetObjectAsync(&spObjOld, pParsedObject, true);
  502. }
  503. WorkerPutObjectAsync(
  504. i_pObj,
  505. spObjOld,
  506. pParsedObject,
  507. i_lFlags,
  508. bInstanceExists,
  509. &sbstrObjPath);
  510. }
  511. catch (CIIsProvException e)
  512. {
  513. pes = ConstructExtendedStatus(&e);
  514. hr = e.GetHR();
  515. }
  516. catch (HRESULT hrError)
  517. {
  518. hr = hrError;
  519. }
  520. catch (...)
  521. {
  522. hr = WBEM_E_FAILED;
  523. }
  524. if (pParsedObject)
  525. {
  526. PathParser.Free(pParsedObject);
  527. }
  528. //
  529. // Set status
  530. //
  531. if(!pes)
  532. {
  533. pes = ConstructExtendedStatus(hr);
  534. }
  535. SCODE sc = i_pHandler->SetStatus(
  536. WBEM_STATUS_COMPLETE, hr, sbstrObjPath, pes);
  537. if(pes)
  538. {
  539. pes->Release();
  540. }
  541. return sc;
  542. }
  543. HRESULT CIISInstProvider::DoExecQueryAsync(
  544. const BSTR i_bstrQueryLanguage,
  545. const BSTR i_bstrQuery,
  546. long i_lFlags,
  547. IWbemContext* i_pCtx,
  548. IWbemObjectSink* i_pResponseHandler)
  549. {
  550. if( i_bstrQueryLanguage == NULL ||
  551. i_bstrQuery == NULL ||
  552. i_pCtx == NULL ||
  553. i_pResponseHandler == NULL )
  554. {
  555. return WBEM_E_INVALID_PARAMETER;
  556. }
  557. DBG_ASSERT(m_pNamespace != NULL);
  558. HRESULT hr = WBEM_S_NO_ERROR;
  559. IWbemClassObject* pes = NULL;
  560. try
  561. {
  562. CQueryHelper QueryHelper(
  563. i_bstrQueryLanguage,
  564. i_bstrQuery,
  565. m_pNamespace,
  566. i_pResponseHandler);
  567. if(QueryHelper.IsAssoc())
  568. {
  569. QueryHelper.GetAssociations();
  570. }
  571. else
  572. {
  573. QueryHelper.GetInstances();
  574. }
  575. }
  576. catch (CIIsProvException e)
  577. {
  578. pes = ConstructExtendedStatus(&e);
  579. hr = e.GetHR();
  580. }
  581. catch (HRESULT hrError)
  582. {
  583. hr = hrError;
  584. }
  585. catch (...)
  586. {
  587. hr = WBEM_E_FAILED;
  588. }
  589. //
  590. // Set status
  591. //
  592. if(!pes)
  593. {
  594. pes = ConstructExtendedStatus(hr);
  595. }
  596. SCODE sc = i_pResponseHandler->SetStatus(WBEM_STATUS_COMPLETE, hr, NULL, pes);
  597. if(pes)
  598. {
  599. pes->Release();
  600. }
  601. return sc;
  602. }
  603. IWbemClassObject* CIISInstProvider::ConstructExtendedStatus(
  604. HRESULT i_hr) const
  605. {
  606. IWbemClassObject* pes = NULL;
  607. //
  608. // We only need extended status on failure.
  609. //
  610. if(SUCCEEDED(i_hr))
  611. {
  612. return NULL;
  613. }
  614. CIIsProvException e;
  615. e.SetHR(i_hr);
  616. pes = ConstructExtendedStatus(&e);
  617. return pes;
  618. }
  619. IWbemClassObject* CIISInstProvider::ConstructExtendedStatus(
  620. const CIIsProvException* i_pException) const
  621. {
  622. DBG_ASSERT(m_pNamespace != NULL);
  623. DBG_ASSERT(i_pException != NULL);
  624. HRESULT hr;
  625. CComPtr<IWbemClassObject> spClass;
  626. CComPtr<IWbemClassObject> spES;
  627. IWbemClassObject* pESRet = NULL;
  628. CComBSTR sbstr = L"__ExtendedStatus";
  629. if(sbstr.m_str == NULL)
  630. {
  631. return NULL;
  632. }
  633. //
  634. // Get the __ExtendedStatus class and Spawn and instance
  635. //
  636. hr = m_pNamespace->GetObject(
  637. sbstr,
  638. 0,
  639. NULL,
  640. &spClass,
  641. NULL
  642. );
  643. if(FAILED(hr))
  644. {
  645. return NULL;
  646. }
  647. hr = spClass->SpawnInstance(0, &spES);
  648. if(FAILED(hr))
  649. {
  650. return NULL;
  651. }
  652. //
  653. // Set the description.
  654. //
  655. CComVariant svt;
  656. sbstr.Empty();
  657. sbstr = i_pException->GetErrorText();
  658. svt = sbstr.Detach();
  659. if(svt.vt == VT_BSTR && svt.bstrVal != NULL)
  660. {
  661. hr = spES->Put(L"Description", 0, &svt, 0);
  662. if(FAILED(hr))
  663. {
  664. return NULL;
  665. }
  666. }
  667. //
  668. // Set the status code.
  669. //
  670. svt = i_pException->GetHR();
  671. hr = spES->Put(L"StatusCode", 0, &svt, 0);
  672. if(FAILED(hr))
  673. {
  674. return NULL;
  675. }
  676. //
  677. // Set the parameter info.
  678. //
  679. svt = i_pException->GetParams();
  680. if(svt.vt == VT_BSTR && svt.bstrVal != NULL)
  681. {
  682. hr = spES->Put(L"ParameterInfo", 0, &svt, 0);
  683. if(FAILED(hr))
  684. {
  685. return NULL;
  686. }
  687. }
  688. //
  689. // Set the provider name.
  690. //
  691. svt = g_wszIIsProvider;
  692. if(svt.vt == VT_BSTR && svt.bstrVal != NULL)
  693. {
  694. hr = spES->Put(L"ProviderName", 0, &svt, 0);
  695. if(FAILED(hr))
  696. {
  697. return NULL;
  698. }
  699. }
  700. //
  701. // If everything succeeded...
  702. //
  703. spES.CopyTo(&pESRet);
  704. return pESRet;
  705. }
  706. void CIISInstProvider::WorkerExecMethodAsync(
  707. BSTR i_strObjectPath,
  708. BSTR i_strMethodName,
  709. IWbemContext* i_pCtx,
  710. IWbemClassObject* i_pInParams,
  711. IWbemObjectSink* i_pHandler
  712. )
  713. {
  714. DBG_ASSERT(i_strObjectPath != NULL);
  715. DBG_ASSERT(i_strMethodName != NULL);
  716. DBG_ASSERT(i_pHandler != NULL);
  717. DBG_ASSERT(m_pNamespace != NULL);
  718. WMI_CLASS* pWMIClass;
  719. CObjectPathParser PathParser(e_ParserAcceptRelativeNamespace);
  720. TSmartPointer<ParsedObjectPath> spParsedObjPath;
  721. _bstr_t bstrMbPath;
  722. WMI_METHOD* pmethod;
  723. HRESULT hr = WBEM_S_NO_ERROR;
  724. hr = CUtils::ParserErrToHR( PathParser.Parse(i_strObjectPath, &spParsedObjPath) );
  725. THROW_ON_ERROR(hr);
  726. DBG_ASSERT(spParsedObjPath != NULL);
  727. if (!CUtils::GetClass(spParsedObjPath->m_pClass,&pWMIClass))
  728. {
  729. THROW_ON_ERROR(WBEM_E_INVALID_CLASS);
  730. }
  731. if (!CUtils::GetMethod(i_strMethodName, pWMIClass->ppMethod, &pmethod ))
  732. {
  733. THROW_ON_ERROR(WBEM_E_INVALID_METHOD);
  734. }
  735. CUtils::GetMetabasePath(NULL,spParsedObjPath,pWMIClass,bstrMbPath);
  736. if(pWMIClass->pkt == &METABASE_KEYTYPE_DATA::s_IIsFtpService)
  737. {
  738. WorkerExecFtpServiceMethod(
  739. bstrMbPath,
  740. pWMIClass,
  741. pmethod,
  742. i_pCtx,
  743. i_pInParams,
  744. i_pHandler);
  745. }
  746. else if(pWMIClass->pkt == &METABASE_KEYTYPE_DATA::s_IIsWebService)
  747. {
  748. WorkerExecWebServiceMethod(
  749. bstrMbPath,
  750. pWMIClass,
  751. pmethod,
  752. i_pCtx,
  753. i_pInParams,
  754. i_pHandler);
  755. }
  756. else if(pWMIClass->pkt == &METABASE_KEYTYPE_DATA::s_IIsFtpServer ||
  757. pWMIClass->pkt == &METABASE_KEYTYPE_DATA::s_IIsWebServer)
  758. {
  759. CMetabase metabase;
  760. HRESULT hr = S_OK;
  761. metabase.PutMethod(bstrMbPath, pmethod->dwMDId);
  762. }
  763. else if(pWMIClass->pkt == &METABASE_KEYTYPE_DATA::s_IIsWebVirtualDir ||
  764. pWMIClass->pkt == &METABASE_KEYTYPE_DATA::s_IIsWebDirectory)
  765. {
  766. WorkerExecWebAppMethod(
  767. bstrMbPath,
  768. pWMIClass->pszClassName,
  769. pmethod,
  770. i_pCtx,
  771. i_pInParams,
  772. i_pHandler,
  773. m_pNamespace
  774. );
  775. }
  776. else if(pWMIClass->pkt == &METABASE_KEYTYPE_DATA::s_IIsComputer)
  777. {
  778. WorkerExecComputerMethod(
  779. bstrMbPath,
  780. pWMIClass->pszClassName,
  781. pmethod,
  782. i_pCtx,
  783. i_pInParams,
  784. i_pHandler,
  785. m_pNamespace
  786. );
  787. }
  788. else if(pWMIClass->pkt == &METABASE_KEYTYPE_DATA::s_IIsCertMapper)
  789. {
  790. WorkerExecCertMapperMethod(
  791. bstrMbPath,
  792. pWMIClass->pszClassName,
  793. pmethod,
  794. i_pCtx,
  795. i_pInParams,
  796. i_pHandler,
  797. m_pNamespace
  798. );
  799. }
  800. else if(pWMIClass->pkt == &METABASE_KEYTYPE_DATA::s_IIsApplicationPool)
  801. {
  802. WorkerExecAppPoolMethod(
  803. bstrMbPath,
  804. pWMIClass->pszClassName,
  805. pmethod,
  806. i_pCtx,
  807. i_pInParams,
  808. i_pHandler,
  809. m_pNamespace
  810. );
  811. }
  812. else
  813. {
  814. THROW_ON_ERROR(WBEM_E_INVALID_METHOD);
  815. }
  816. }
  817. void CIISInstProvider::WorkerDeleteObjectAsync(
  818. ParsedObjectPath* i_pParsedObject
  819. )
  820. {
  821. DBG_ASSERT(m_pNamespace != NULL);
  822. DBG_ASSERT(i_pParsedObject != NULL);
  823. HRESULT hr = WBEM_S_NO_ERROR;
  824. _bstr_t bstrMbPath;
  825. WMI_CLASS* pWMIClass;
  826. METADATA_HANDLE hKey = NULL;
  827. CMetabase metabase;
  828. if (!CUtils::GetClass(i_pParsedObject->m_pClass,&pWMIClass))
  829. {
  830. THROW_ON_ERROR(WBEM_E_INVALID_CLASS);
  831. }
  832. //
  833. // get the meta path of object
  834. //
  835. CUtils::GetMetabasePath(NULL,i_pParsedObject,pWMIClass,bstrMbPath);
  836. // Special case - we want to be able to delete
  837. // IIsIPSecurity instances without deleting the node
  838. // and without checking the KeyType
  839. if(pWMIClass->pkt == &METABASE_KEYTYPE_DATA::s_TYPE_IPSecurity)
  840. {
  841. hKey = metabase.OpenKey(bstrMbPath, true);
  842. try
  843. {
  844. metabase.DeleteData(hKey, MD_IP_SEC, BINARY_METADATA);
  845. }
  846. catch (HRESULT hrError)
  847. {
  848. metabase.CloseKey(hKey);
  849. THROW_ON_ERROR(hrError)
  850. }
  851. catch (...)
  852. {
  853. metabase.CloseKey(hKey);
  854. THROW_ON_ERROR(WBEM_E_FAILED)
  855. }
  856. metabase.CloseKey(hKey);
  857. return;
  858. }
  859. // if AdminACL
  860. //
  861. if( pWMIClass->pkt == &METABASE_KEYTYPE_DATA::s_TYPE_AdminACL )
  862. {
  863. THROW_ON_ERROR(WBEM_E_NOT_SUPPORTED);
  864. }
  865. else if(pWMIClass->pkt == &METABASE_KEYTYPE_DATA::s_TYPE_AdminACE)
  866. {
  867. CAdminACL objACL;
  868. CMetabase metabase;
  869. hr = objACL.OpenSD(bstrMbPath, metabase);
  870. if(SUCCEEDED(hr))
  871. hr = objACL.DeleteObjectAsync(i_pParsedObject);
  872. THROW_ON_ERROR(hr);
  873. return;
  874. }
  875. else if(pWMIClass->pkt == &METABASE_KEYTYPE_DATA::s_IIsApplicationPool)
  876. {
  877. CAppPoolMethod objAppPool;
  878. objAppPool.DeleteAppPool(bstrMbPath);
  879. return;
  880. }
  881. // check that the KeyType is correct
  882. _variant_t vt;
  883. hKey = metabase.OpenKey(bstrMbPath, false);
  884. metabase.Get(hKey, &METABASE_PROPERTY_DATA::s_KeyType, m_pNamespace, vt, NULL, NULL);
  885. metabase.CloseKey(hKey);
  886. if( vt.vt != VT_BSTR ||
  887. vt.bstrVal == NULL ||
  888. !CUtils::CompareKeyType(vt.bstrVal, pWMIClass->pkt) )
  889. {
  890. CIIsProvException e;
  891. e.SetMC(WBEM_E_NOT_FOUND, IISWMI_INVALID_KEYTYPE, NULL);
  892. throw e;
  893. }
  894. vt.Clear();
  895. if( pWMIClass->pkt->m_pszDisallowDeletionNode &&
  896. _wcsicmp(bstrMbPath, pWMIClass->pkt->m_pszDisallowDeletionNode) == 0 )
  897. {
  898. CIIsProvException e;
  899. e.SetMC(WBEM_E_INVALID_OPERATION, IISWMI_INSTANCE_DELETION_DISALLOWED, NULL);
  900. throw e;
  901. }
  902. DBG_ASSERT(((LPWSTR)(bstrMbPath))[0] == L'/');
  903. DBG_ASSERT(((LPWSTR)(bstrMbPath))[1] != L'\0');
  904. LPWSTR pParent = wcsrchr(bstrMbPath, L'/');
  905. WCHAR wcStore = *pParent;
  906. *pParent = L'\0';
  907. hKey = metabase.OpenKey(bstrMbPath, true);
  908. *pParent = wcStore;
  909. hr = metabase.DeleteKey(hKey, pParent);
  910. THROW_ON_ERROR(hr);
  911. metabase.CloseKey(hKey);
  912. }
  913. void CIISInstProvider::WorkerGetObjectAsync(
  914. IWbemClassObject** o_ppObj,
  915. ParsedObjectPath* i_pParsedObjPath,
  916. bool i_bCreateKeyIfNotExist)
  917. {
  918. WMI_CLASS* pWmiClass = NULL;
  919. WMI_ASSOCIATION* pWmiAssoc = NULL;
  920. CMetabase metabase;
  921. CInstanceHelper InstanceHelper(i_pParsedObjPath, m_pNamespace);
  922. if(!InstanceHelper.IsAssoc())
  923. {
  924. InstanceHelper.GetInstance(
  925. i_bCreateKeyIfNotExist, // in
  926. &metabase, // in/out
  927. o_ppObj); // out
  928. }
  929. else
  930. {
  931. InstanceHelper.GetAssociation(
  932. o_ppObj); // out
  933. }
  934. }
  935. void CIISInstProvider::WorkerGetObjectAsync(
  936. IWbemClassObject** o_ppObj,
  937. BSTR i_bstrObjPath,
  938. bool i_bCreateKeyIfNotExist)
  939. {
  940. WMI_CLASS* pWmiClass = NULL;
  941. WMI_ASSOCIATION* pWmiAssoc = NULL;
  942. CMetabase metabase;
  943. CInstanceHelper InstanceHelper(i_bstrObjPath, m_pNamespace);
  944. if(!InstanceHelper.IsAssoc())
  945. {
  946. InstanceHelper.GetInstance(
  947. i_bCreateKeyIfNotExist, // in
  948. &metabase, // in/out
  949. o_ppObj); // out
  950. }
  951. else
  952. {
  953. InstanceHelper.GetAssociation(
  954. o_ppObj); // out
  955. }
  956. }
  957. void CIISInstProvider::ValidatePutParsedObject(
  958. ParsedObjectPath* i_pParsedObject,
  959. IWbemClassObject* i_pObj,
  960. bool* io_pbInstanceNameSame,
  961. bool* io_pbInstanceExists,
  962. WMI_CLASS** o_ppWmiClass
  963. )
  964. /*++
  965. Synopsis:
  966. Validates stuff before a Put operation.
  967. - Checks to see that the user is not changing the instance's
  968. primary key.
  969. - Verifies the parent metabase node exists.
  970. - Checks the container class list of the parent node in the metabase
  971. to see if it contains the node we are trying to insert.
  972. - Throws on failure. You should not continue with the put operation.
  973. Arguments: [i_pParsedObject] -
  974. --*/
  975. {
  976. DBG_ASSERT(i_pParsedObject != NULL);
  977. DBG_ASSERT(i_pObj != NULL);
  978. DBG_ASSERT(m_pNamespace != NULL);
  979. WMI_CLASS* pWMIClass = NULL;
  980. WMI_ASSOCIATION* pWMIAssoc = NULL;
  981. _bstr_t bstrMbPath;
  982. HRESULT hr = WBEM_S_NO_ERROR;
  983. if(CUtils::GetClass(i_pParsedObject->m_pClass,&pWMIClass))
  984. {
  985. }
  986. else if(CUtils::GetAssociation(i_pParsedObject->m_pClass,&pWMIAssoc))
  987. {
  988. THROW_ON_ERROR(WBEM_E_INVALID_OPERATION);
  989. }
  990. else
  991. {
  992. THROW_ON_ERROR(WBEM_E_INVALID_CLASS)
  993. }
  994. if(o_ppWmiClass)
  995. {
  996. *o_ppWmiClass = pWMIClass;
  997. }
  998. bool bSpecialPut = false;
  999. if( i_pParsedObject->m_dwNumKeys == 0)
  1000. {
  1001. if( pWMIClass->pkt == &METABASE_KEYTYPE_DATA::s_IIsWebServer ||
  1002. pWMIClass->pkt == &METABASE_KEYTYPE_DATA::s_IIsFtpServer )
  1003. {
  1004. bSpecialPut = true;
  1005. }
  1006. else
  1007. {
  1008. THROW_ON_ERROR(WBEM_E_INVALID_OBJECT);
  1009. }
  1010. }
  1011. if(!bSpecialPut)
  1012. {
  1013. CUtils::GetMetabasePath(NULL, i_pParsedObject, pWMIClass, bstrMbPath);
  1014. DBG_ASSERT(((LPWSTR)bstrMbPath) != NULL);
  1015. }
  1016. //
  1017. // Get the instance qualifiers in order to eventually evaluate
  1018. // that the user has not tried to change the primary key on
  1019. // this instance.
  1020. //
  1021. const ULONG iQuals = 2;
  1022. _variant_t avtQualValues[iQuals];
  1023. LPCWSTR awszQualNames[iQuals];
  1024. DBG_ASSERT(g_idxInstanceExists < iQuals);
  1025. DBG_ASSERT(g_idxInstanceName < iQuals);
  1026. awszQualNames[g_idxInstanceExists] = g_wszInstanceExists;
  1027. awszQualNames[g_idxInstanceName] = g_wszInstanceName;
  1028. hr = CUtils::GetQualifiers(i_pObj, awszQualNames, avtQualValues, iQuals);
  1029. THROW_ON_ERROR(hr);
  1030. //
  1031. // We assume the instance names are the same unless we can explicitly
  1032. // detect they are not.
  1033. //
  1034. bool bInstanceNameSame = true;
  1035. if( avtQualValues[g_idxInstanceName].vt == VT_BSTR &&
  1036. avtQualValues[g_idxInstanceName].bstrVal != NULL)
  1037. {
  1038. if(!bSpecialPut)
  1039. {
  1040. if(_wcsicmp(avtQualValues[g_idxInstanceName].bstrVal, bstrMbPath) != 0)
  1041. {
  1042. bInstanceNameSame = false;
  1043. }
  1044. }
  1045. else
  1046. {
  1047. bInstanceNameSame = false;
  1048. }
  1049. }
  1050. bool bInstanceExists = false;
  1051. if( avtQualValues[g_idxInstanceExists].vt == VT_BOOL &&
  1052. avtQualValues[g_idxInstanceExists].boolVal )
  1053. {
  1054. bInstanceExists = true;
  1055. }
  1056. if(bInstanceExists && !bInstanceNameSame)
  1057. {
  1058. //
  1059. // Someone has tried to change the primary key.
  1060. //
  1061. CIIsProvException e;
  1062. e.SetMC(WBEM_E_FAILED, IISWMI_CANNOT_CHANGE_PRIMARY_KEY_FIELD, NULL);
  1063. DBGPRINTF((DBG_CONTEXT, "Cannot change primary key field\n"));
  1064. throw e;
  1065. }
  1066. if(io_pbInstanceExists)
  1067. {
  1068. *io_pbInstanceExists = bInstanceExists;
  1069. }
  1070. if(io_pbInstanceNameSame)
  1071. {
  1072. *io_pbInstanceNameSame = bInstanceNameSame;
  1073. }
  1074. //
  1075. // Now verify that if this is a new class, creation is allowed.
  1076. //
  1077. if(!bInstanceExists && !pWMIClass->bCreateAllowed)
  1078. {
  1079. CIIsProvException e;
  1080. e.SetMC(WBEM_E_FAILED, IISWMI_INSTANCE_CREATION_DISALLOWED, NULL);
  1081. DBGPRINTF((DBG_CONTEXT, "Instance creation disallowed\n"));
  1082. throw e;
  1083. }
  1084. if(bSpecialPut)
  1085. {
  1086. return;
  1087. }
  1088. //
  1089. // Now, validate the keytype against the parent's container
  1090. // class list. The return cases below are the few times
  1091. // we actually won't do this validation.
  1092. //
  1093. METADATA_HANDLE hKey = NULL;
  1094. if( pWMIClass->pkt == &METABASE_KEYTYPE_DATA::s_TYPE_AdminACE ||
  1095. pWMIClass->pkt == &METABASE_KEYTYPE_DATA::s_TYPE_AdminACL ||
  1096. pWMIClass->pkt == &METABASE_KEYTYPE_DATA::s_TYPE_IPSecurity)
  1097. {
  1098. return;
  1099. }
  1100. if(((LPWSTR)bstrMbPath) && _wcsicmp(bstrMbPath, L"/LM") == 0)
  1101. {
  1102. return;
  1103. }
  1104. ULONG cch = wcslen(bstrMbPath);
  1105. CComBSTR sbstrMbParentPath(cch);
  1106. if(sbstrMbParentPath.m_str == NULL)
  1107. {
  1108. THROW_ON_ERROR(WBEM_E_OUT_OF_MEMORY);
  1109. }
  1110. hr = CUtils::GetParentMetabasePath(
  1111. bstrMbPath,
  1112. sbstrMbParentPath);
  1113. if(FAILED(hr))
  1114. {
  1115. //
  1116. // There is no parent node in the string specified
  1117. //
  1118. return;
  1119. }
  1120. //
  1121. // Get parent keytype from metabase
  1122. //
  1123. WMI_CLASS* pWMIParentClass = NULL;
  1124. CMetabase metabase;
  1125. _variant_t vt;
  1126. hKey = metabase.OpenKey(sbstrMbParentPath, false);
  1127. metabase.Get(hKey, &METABASE_PROPERTY_DATA::s_KeyType, m_pNamespace, vt, NULL, NULL);
  1128. metabase.CloseKey(hKey);
  1129. if( vt.vt != VT_BSTR)
  1130. {
  1131. CIIsProvException e;
  1132. e.SetMC(
  1133. WBEM_E_INVALID_OBJECT,
  1134. IISWMI_NO_PARENT_KEYTYPE,
  1135. NULL,
  1136. pWMIClass->pkt->m_pszName);
  1137. DBGPRINTF((DBG_CONTEXT, "No parent keytype.\n"));
  1138. throw e;
  1139. }
  1140. //
  1141. // Walk thru the current class's inverse container class list and see
  1142. // if the parent keytype is there.
  1143. //
  1144. if(!CUtils::GetClass(vt.bstrVal, &pWMIParentClass))
  1145. {
  1146. if( _wcsicmp(vt.bstrVal, L"IIs_ROOT") == 0 &&
  1147. pWMIClass->pkt == &METABASE_KEYTYPE_DATA::s_IIsComputer )
  1148. {
  1149. return;
  1150. }
  1151. else
  1152. {
  1153. CIIsProvException e;
  1154. e.SetMC(
  1155. WBEM_E_INVALID_OBJECT,
  1156. IISWMI_INVALID_PARENT_KEYTYPE,
  1157. NULL,
  1158. pWMIClass->pkt->m_pszName,
  1159. L"<NULL>");
  1160. DBGPRINTF((DBG_CONTEXT, "Invalid parent keytype.\n"));
  1161. throw e;
  1162. }
  1163. }
  1164. METABASE_KEYTYPE_NODE* pKtNode = pWMIClass->pkt->m_pKtListInverseCCL;
  1165. while(pKtNode != NULL)
  1166. {
  1167. if(pWMIParentClass->pkt == pKtNode->m_pKt)
  1168. {
  1169. break;
  1170. }
  1171. pKtNode = pKtNode->m_pKtNext;
  1172. }
  1173. if(pKtNode == NULL)
  1174. {
  1175. CIIsProvException e;
  1176. e.SetMC(
  1177. WBEM_E_INVALID_OBJECT,
  1178. IISWMI_INVALID_PARENT_KEYTYPE,
  1179. NULL,
  1180. pWMIClass->pkt->m_pszName,
  1181. pWMIParentClass->pkt->m_pszName);
  1182. DBGPRINTF((DBG_CONTEXT, "Invalid parent keytype.\n"));
  1183. throw e;
  1184. }
  1185. }
  1186. void CIISInstProvider::WorkerPutObjectAsync(
  1187. IWbemClassObject* i_pObj,
  1188. IWbemClassObject* i_pObjOld, // can be NULL
  1189. ParsedObjectPath* i_pParsedObject,
  1190. long i_lFlags,
  1191. bool i_bInstanceExists,
  1192. BSTR* o_pbstrObjPath
  1193. )
  1194. {
  1195. DBG_ASSERT(i_pObj != NULL);
  1196. DBG_ASSERT(i_pParsedObject != NULL);
  1197. DBG_ASSERT(m_pNamespace != NULL);
  1198. DBG_ASSERT(o_pbstrObjPath != NULL);
  1199. DBG_ASSERT(*o_pbstrObjPath == NULL);
  1200. *o_pbstrObjPath = NULL;
  1201. CComBSTR sbstrObjPath;
  1202. HRESULT hr = WBEM_S_NO_ERROR;
  1203. METABASE_PROPERTY** ppmbp;
  1204. _bstr_t bstrMbPath;
  1205. WMI_CLASS* pWMIClass;
  1206. METADATA_HANDLE hKey = NULL;
  1207. DWORD dwQuals = 0;
  1208. if (!CUtils::GetClass(i_pParsedObject->m_pClass,&pWMIClass))
  1209. throw (HRESULT)WBEM_E_INVALID_CLASS;
  1210. CUtils::GetMetabasePath(NULL,i_pParsedObject,pWMIClass,bstrMbPath);
  1211. //
  1212. // if AdminACL
  1213. //
  1214. if( pWMIClass->pkt == &METABASE_KEYTYPE_DATA::s_TYPE_AdminACL ||
  1215. pWMIClass->pkt == &METABASE_KEYTYPE_DATA::s_TYPE_AdminACE
  1216. )
  1217. {
  1218. CAdminACL objACL;
  1219. CMetabase metabase;
  1220. hr = objACL.OpenSD(bstrMbPath, metabase);
  1221. if( SUCCEEDED(hr) )
  1222. hr = objACL.PutObjectAsync(i_pObj, i_pParsedObject, pWMIClass);
  1223. THROW_ON_ERROR(hr);
  1224. return;
  1225. }
  1226. //
  1227. // IPSecurity
  1228. //
  1229. if( pWMIClass->pkt == &METABASE_KEYTYPE_DATA::s_TYPE_IPSecurity )
  1230. {
  1231. CIPSecurity objIPSec;
  1232. CMetabase metabase;
  1233. hr = objIPSec.OpenSD(bstrMbPath, metabase);
  1234. if( SUCCEEDED(hr) )
  1235. hr = objIPSec.PutObjectAsync(i_pObj);
  1236. THROW_ON_ERROR(hr);
  1237. return;
  1238. }
  1239. //
  1240. // Walk thru the properties
  1241. //
  1242. CMetabase metabase;
  1243. hKey = metabase.CreateKey(bstrMbPath);
  1244. _variant_t vt;
  1245. _variant_t vtOld;
  1246. _variant_t* pvtOld;
  1247. _bstr_t bstrPropName;
  1248. for (ppmbp=pWMIClass->ppmbp;*ppmbp && hr==WBEM_S_NO_ERROR; ppmbp++)
  1249. {
  1250. bstrPropName = (*ppmbp)->pszPropName;
  1251. hr = i_pObj->Get(bstrPropName, 0, &vt, NULL, NULL);
  1252. //
  1253. // Just ignore properties that are not in the repository.
  1254. //
  1255. if(FAILED(hr))
  1256. {
  1257. hr = WBEM_S_NO_ERROR;
  1258. continue;
  1259. }
  1260. //
  1261. // Get the property qualifiers
  1262. //
  1263. hr = CUtils::GetPropertyQualifiers(i_pObj, bstrPropName, &dwQuals);
  1264. THROW_E_ON_ERROR(hr,*ppmbp);
  1265. pvtOld = NULL;
  1266. if(i_pObjOld != NULL)
  1267. {
  1268. hr = i_pObjOld->Get(bstrPropName, 0, &vtOld, NULL, NULL);
  1269. pvtOld = &vtOld;
  1270. THROW_E_ON_ERROR(hr,*ppmbp);
  1271. }
  1272. THROW_E_ON_ERROR(hr,*ppmbp);
  1273. if (vt.vt == VT_NULL)
  1274. {
  1275. //
  1276. // Only delete non-flag properties.
  1277. //
  1278. if ((*ppmbp)->dwMDMask == 0 && vtOld.vt != VT_NULL)
  1279. {
  1280. if(i_bInstanceExists)
  1281. {
  1282. metabase.DeleteData(hKey, *ppmbp, true);
  1283. }
  1284. else
  1285. {
  1286. metabase.DeleteData(hKey, *ppmbp, false);
  1287. }
  1288. }
  1289. continue;
  1290. }
  1291. metabase.Put(
  1292. hKey,
  1293. *ppmbp,
  1294. m_pNamespace,
  1295. vt,
  1296. pvtOld,
  1297. dwQuals,
  1298. i_bInstanceExists);
  1299. vt.Clear();
  1300. vtOld.Clear();
  1301. }
  1302. if( pWMIClass->pkt != NULL &&
  1303. pWMIClass->pkt->m_pszName != NULL &&
  1304. pWMIClass->pkt != &METABASE_KEYTYPE_DATA::s_IIsObject )
  1305. {
  1306. vt = pWMIClass->pkt->m_pszName;
  1307. metabase.PutString(hKey, &METABASE_PROPERTY_DATA::s_KeyType, vt, NULL);
  1308. }
  1309. metabase.CloseKey(hKey);
  1310. hr = CUtils::ConstructObjectPath(bstrMbPath, pWMIClass, &sbstrObjPath);
  1311. THROW_ON_ERROR(hr);
  1312. //
  1313. // Set out parameters if everything succeeds
  1314. //
  1315. *o_pbstrObjPath = sbstrObjPath.Detach();
  1316. }
  1317. void CIISInstProvider::WorkerEnumObjectAsync(
  1318. BSTR i_bstrClassName,
  1319. IWbemObjectSink FAR* i_pHandler
  1320. )
  1321. {
  1322. WMI_CLASS* pClass;
  1323. WMI_ASSOCIATION* pAssociation = NULL;
  1324. ParsedObjectPath ParsedObject; //deconstructer frees memory
  1325. if (CUtils::GetAssociation(i_bstrClassName,&pAssociation))
  1326. {
  1327. CEnum EnumAssociation;
  1328. EnumAssociation.Init(
  1329. i_pHandler,
  1330. m_pNamespace,
  1331. &ParsedObject,
  1332. pAssociation->pcRight->pszMetabaseKey,
  1333. pAssociation
  1334. );
  1335. EnumAssociation.Recurse(
  1336. NULL,
  1337. &METABASE_KEYTYPE_DATA::s_IIsComputer,
  1338. NULL,
  1339. pAssociation->pcRight->pszKeyName,
  1340. pAssociation->pcRight->pkt
  1341. );
  1342. }
  1343. else if (CUtils::GetClass(i_bstrClassName,&pClass))
  1344. {
  1345. if (!ParsedObject.SetClassName(pClass->pszClassName))
  1346. throw (HRESULT)WBEM_E_FAILED;
  1347. CEnum EnumObject;
  1348. EnumObject.Init(
  1349. i_pHandler,
  1350. m_pNamespace,
  1351. &ParsedObject,
  1352. pClass->pszMetabaseKey,
  1353. NULL
  1354. );
  1355. EnumObject.Recurse(
  1356. NULL,
  1357. &METABASE_KEYTYPE_DATA::s_NO_TYPE,
  1358. NULL,
  1359. pClass->pszKeyName,
  1360. pClass->pkt
  1361. );
  1362. }
  1363. else
  1364. throw (HRESULT)WBEM_E_INVALID_CLASS;
  1365. }
  1366. void CIISInstProvider::WorkerExecWebAppMethod(
  1367. LPCWSTR i_wszMbPath,
  1368. LPCWSTR i_wszClassName,
  1369. WMI_METHOD* i_pMethod,
  1370. IWbemContext* i_pCtx,
  1371. IWbemClassObject* i_pInParams,
  1372. IWbemObjectSink* i_pHandler,
  1373. CWbemServices* i_pNameSpace
  1374. )
  1375. {
  1376. HRESULT hr = WBEM_S_NO_ERROR;
  1377. _variant_t vt; // stores the parameter value
  1378. _variant_t vt2; // stores the parameter value
  1379. _variant_t vt3; // stores the parameter value
  1380. CWebAppMethod obj; // encapsulates all the web app methods
  1381. if(i_pMethod == &METHODS::s_AppCreate)
  1382. {
  1383. if(i_pInParams == NULL)
  1384. {
  1385. THROW_ON_ERROR(WBEM_E_INVALID_METHOD_PARAMETERS);
  1386. }
  1387. hr = i_pInParams->Get(PARAMS::s_InProcFlag.pszParamName, 0, &vt, NULL, NULL);
  1388. THROW_ON_ERROR(hr);
  1389. hr = obj.AppCreate(i_wszMbPath, vt);
  1390. }
  1391. else if(i_pMethod == &METHODS::s_AppCreate2)
  1392. {
  1393. if(i_pInParams == NULL)
  1394. {
  1395. THROW_ON_ERROR(WBEM_E_INVALID_METHOD_PARAMETERS);
  1396. }
  1397. hr = i_pInParams->Get(PARAMS::s_AppMode.pszParamName, 0, &vt, NULL, NULL);
  1398. THROW_ON_ERROR(hr);
  1399. hr = obj.AppCreate2(i_wszMbPath, vt);
  1400. }
  1401. else if(i_pMethod == &METHODS::s_AppCreate3)
  1402. {
  1403. if(i_pInParams == NULL)
  1404. {
  1405. THROW_ON_ERROR(WBEM_E_INVALID_METHOD_PARAMETERS);
  1406. }
  1407. hr = i_pInParams->Get(PARAMS::s_AppMode.pszParamName, 0, &vt, NULL, NULL);
  1408. THROW_ON_ERROR(hr);
  1409. hr = i_pInParams->Get(PARAMS::s_AppPoolName.pszParamName, 0, &vt2, NULL, NULL);
  1410. THROW_ON_ERROR(hr);
  1411. hr = i_pInParams->Get(PARAMS::s_bCreate.pszParamName, 0, &vt3, NULL, NULL);
  1412. THROW_ON_ERROR(hr);
  1413. if (vt3.vt != VT_BOOL) {
  1414. hr = obj.AppCreate3(i_wszMbPath, vt,
  1415. CUtils::ExtractBstrFromVt(&vt2, PARAMS::s_AppPoolName.pszParamName),
  1416. false);
  1417. }
  1418. else {
  1419. hr = obj.AppCreate3(i_wszMbPath, vt,
  1420. CUtils::ExtractBstrFromVt(&vt2, PARAMS::s_AppPoolName.pszParamName),
  1421. vt3);
  1422. }
  1423. }
  1424. else if(i_pMethod == &METHODS::s_AppDelete)
  1425. {
  1426. if(i_pInParams == NULL)
  1427. {
  1428. THROW_ON_ERROR(WBEM_E_INVALID_METHOD_PARAMETERS);
  1429. }
  1430. hr = i_pInParams->Get(PARAMS::s_Recursive.pszParamName, 0, &vt, NULL, NULL);
  1431. THROW_ON_ERROR(hr);
  1432. hr = obj.AppDelete(i_wszMbPath, vt);
  1433. }
  1434. else if(i_pMethod == &METHODS::s_AppDisable)
  1435. {
  1436. if(i_pInParams == NULL)
  1437. {
  1438. THROW_ON_ERROR(WBEM_E_INVALID_METHOD_PARAMETERS);
  1439. }
  1440. hr = i_pInParams->Get(PARAMS::s_Recursive.pszParamName, 0, &vt, NULL, NULL);
  1441. THROW_ON_ERROR(hr);
  1442. hr = obj.AppDisable(i_wszMbPath, vt);
  1443. }
  1444. else if(i_pMethod == &METHODS::s_AppEnable)
  1445. {
  1446. if(i_pInParams == NULL)
  1447. {
  1448. THROW_ON_ERROR(WBEM_E_INVALID_METHOD_PARAMETERS);
  1449. }
  1450. hr = i_pInParams->Get(PARAMS::s_Recursive.pszParamName, 0, &vt, NULL, NULL);
  1451. THROW_ON_ERROR(hr);
  1452. hr = obj.AppEnable(i_wszMbPath, vt);
  1453. }
  1454. else if(i_pMethod == &METHODS::s_AppUnLoad)
  1455. {
  1456. if(i_pInParams == NULL)
  1457. {
  1458. THROW_ON_ERROR(WBEM_E_INVALID_METHOD_PARAMETERS);
  1459. }
  1460. hr = i_pInParams->Get(PARAMS::s_Recursive.pszParamName, 0, &vt, NULL, NULL);
  1461. THROW_ON_ERROR(hr);
  1462. hr = obj.AppUnLoad(i_wszMbPath, vt);
  1463. }
  1464. else if(i_pMethod == &METHODS::s_AppGetStatus)
  1465. {
  1466. //
  1467. // call method - AppGetStatus
  1468. //
  1469. DWORD dwStatus;
  1470. hr = obj.AppGetStatus(i_wszMbPath, &dwStatus);
  1471. THROW_ON_ERROR(hr);
  1472. CComPtr<IWbemClassObject> spOutParams = NULL;
  1473. hr = CUtils::CreateEmptyMethodInstance(
  1474. i_pNameSpace,
  1475. i_pCtx,
  1476. i_wszClassName,
  1477. i_pMethod->pszMethodName,
  1478. &spOutParams);
  1479. THROW_ON_ERROR(hr);
  1480. //
  1481. // put it into the output object
  1482. //
  1483. vt.vt = VT_I4;
  1484. vt.lVal = dwStatus;
  1485. hr = spOutParams->Put(L"ReturnValue", 0, &vt, 0);
  1486. THROW_ON_ERROR(hr);
  1487. //
  1488. // Send the output object back to the client via the sink. Then
  1489. // release the pointers and free the strings.
  1490. //
  1491. hr = i_pHandler->Indicate(1, &spOutParams);
  1492. }
  1493. else if(i_pMethod == &METHODS::s_AspAppRestart)
  1494. {
  1495. hr = obj.AspAppRestart(i_wszMbPath);
  1496. }
  1497. else
  1498. {
  1499. hr = WBEM_E_INVALID_METHOD;
  1500. }
  1501. THROW_ON_ERROR(hr);
  1502. }
  1503. void CIISInstProvider::WorkerExecFtpServiceMethod(
  1504. LPCWSTR i_wszMbPath,
  1505. WMI_CLASS* i_pClass,
  1506. WMI_METHOD* i_pMethod,
  1507. IWbemContext* i_pCtx,
  1508. IWbemClassObject* i_pInParams,
  1509. IWbemObjectSink* i_pHandler)
  1510. {
  1511. DBG_ASSERT(i_pClass != NULL);
  1512. DBG_ASSERT(i_pHandler != NULL);
  1513. DBG_ASSERT(m_pNamespace != NULL);
  1514. HRESULT hr = WBEM_S_NO_ERROR;
  1515. if(i_pMethod == &METHODS::s_ServiceCreateNewServer)
  1516. {
  1517. if(i_pInParams == NULL)
  1518. {
  1519. THROW_ON_ERROR(WBEM_E_INVALID_METHOD_PARAMETERS);
  1520. }
  1521. CServiceMethod ServiceMethod(SC_MSFTPSVC);
  1522. hr = ServiceMethod.Init();
  1523. THROW_ON_ERROR(hr);
  1524. CComPtr<IWbemClassObject> spOutParams;
  1525. hr = ServiceMethod.CreateNewSite(
  1526. m_pNamespace,
  1527. i_wszMbPath,
  1528. i_pCtx,
  1529. i_pClass,
  1530. i_pMethod,
  1531. i_pInParams,
  1532. &spOutParams);
  1533. THROW_ON_ERROR(hr);
  1534. hr = i_pHandler->Indicate(1, &spOutParams);
  1535. THROW_ON_ERROR(hr);
  1536. }
  1537. else
  1538. {
  1539. hr = WBEM_E_INVALID_METHOD;
  1540. }
  1541. THROW_ON_ERROR(hr);
  1542. }
  1543. void CIISInstProvider::WorkerExecWebServiceMethod(
  1544. LPCWSTR i_wszMbPath,
  1545. WMI_CLASS* i_pClass,
  1546. WMI_METHOD* i_pMethod,
  1547. IWbemContext* i_pCtx,
  1548. IWbemClassObject* i_pInParams,
  1549. IWbemObjectSink* i_pHandler
  1550. )
  1551. {
  1552. DBG_ASSERT(i_pHandler != NULL);
  1553. DBG_ASSERT(m_pNamespace != NULL);
  1554. HRESULT hr = WBEM_S_NO_ERROR;
  1555. _variant_t vt; // stores the parameter value
  1556. _variant_t vt2; // stores the parameter value
  1557. _variant_t vt3; // stores the parameter value
  1558. _variant_t vt4; // stores the parameter value
  1559. _variant_t vt5; // stores the parameter value
  1560. METADATA_HANDLE hKey = 0;
  1561. if(i_pMethod == &METHODS::s_GetCurrentMode)
  1562. {
  1563. _variant_t vtServerMode;
  1564. CAppPoolMethod obj;
  1565. obj.GetCurrentMode(&vtServerMode);
  1566. //
  1567. // Set out params
  1568. //
  1569. CComPtr<IWbemClassObject> spOutParams = NULL;
  1570. hr = CUtils::CreateEmptyMethodInstance(
  1571. m_pNamespace,
  1572. i_pCtx,
  1573. i_pClass->pszClassName,
  1574. i_pMethod->pszMethodName,
  1575. &spOutParams);
  1576. THROW_ON_ERROR(hr);
  1577. hr = spOutParams->Put(L"ReturnValue", 0, &vtServerMode, 0);
  1578. THROW_ON_ERROR(hr);
  1579. hr = i_pHandler->Indicate(1, &spOutParams);
  1580. THROW_ON_ERROR(hr);
  1581. }
  1582. else if(i_pMethod == &METHODS::s_ServiceCreateNewServer)
  1583. {
  1584. if(i_pInParams == NULL)
  1585. {
  1586. THROW_ON_ERROR(WBEM_E_INVALID_METHOD_PARAMETERS);
  1587. }
  1588. CServiceMethod ServiceMethod(SC_W3SVC);
  1589. hr = ServiceMethod.Init();
  1590. THROW_ON_ERROR(hr);
  1591. CComPtr<IWbemClassObject> spOutParams;
  1592. hr = ServiceMethod.CreateNewSite(
  1593. m_pNamespace,
  1594. i_wszMbPath,
  1595. i_pCtx,
  1596. i_pClass,
  1597. i_pMethod,
  1598. i_pInParams,
  1599. &spOutParams);
  1600. THROW_ON_ERROR(hr);
  1601. hr = i_pHandler->Indicate(1, &spOutParams);
  1602. THROW_ON_ERROR(hr);
  1603. }
  1604. else if (i_pMethod == &METHODS::s_ServiceEnableApplication)
  1605. {
  1606. if (i_pInParams == NULL)
  1607. {
  1608. THROW_ON_ERROR(WBEM_E_INVALID_METHOD_PARAMETERS);
  1609. }
  1610. hr = i_pInParams->Get(PARAMS::s_Application.pszParamName, 0, &vt, NULL, NULL);
  1611. THROW_ON_ERROR(hr);
  1612. CSecConLib consoleHelper;
  1613. _bstr_t bstrTemp(vt);
  1614. WCHAR* pTemp = bstrTemp;
  1615. if (!pTemp)
  1616. {
  1617. THROW_ON_ERROR(WBEM_E_INVALID_METHOD_PARAMETERS);
  1618. }
  1619. hr = consoleHelper.EnableApplication(pTemp, i_wszMbPath);
  1620. }
  1621. else if (i_pMethod == &METHODS::s_ServiceRemoveApplication)
  1622. {
  1623. if (i_pInParams == NULL)
  1624. {
  1625. THROW_ON_ERROR(WBEM_E_INVALID_METHOD_PARAMETERS);
  1626. }
  1627. hr = i_pInParams->Get(PARAMS::s_Application.pszParamName, 0, &vt, NULL, NULL);
  1628. THROW_ON_ERROR(hr);
  1629. CSecConLib consoleHelper;
  1630. hr = consoleHelper.RemoveApplication(_bstr_t(vt), i_wszMbPath);
  1631. }
  1632. else if (i_pMethod == &METHODS::s_ServiceListApplications)
  1633. {
  1634. WCHAR *pBuf = NULL;
  1635. DWORD dwBufLen;
  1636. CSecConLib consoleHelper;
  1637. hr = consoleHelper.ListApplications(i_wszMbPath, &pBuf, &dwBufLen);
  1638. THROW_ON_ERROR(hr);
  1639. CComVariant vBuf;
  1640. VariantInit(&vBuf);
  1641. CMultiSz MultiSz;
  1642. hr = MultiSz.ToWmiForm( pBuf, &vBuf );
  1643. if (pBuf)
  1644. {
  1645. delete [] pBuf;
  1646. }
  1647. THROW_ON_ERROR(hr);
  1648. CComPtr<IWbemClassObject> spOutParams = NULL;
  1649. hr = CUtils::CreateEmptyMethodInstance(
  1650. m_pNamespace,
  1651. i_pCtx,
  1652. i_pClass->pszClassName,
  1653. i_pMethod->pszMethodName,
  1654. &spOutParams);
  1655. THROW_ON_ERROR(hr);
  1656. hr = spOutParams->Put(PARAMS::s_Applications.pszParamName, 0, &vBuf, 0);
  1657. THROW_ON_ERROR(hr);
  1658. hr = i_pHandler->Indicate(1, &spOutParams);
  1659. THROW_ON_ERROR(hr);
  1660. }
  1661. else if (i_pMethod == &METHODS::s_ServiceQueryGroupIDStatus)
  1662. {
  1663. if (i_pInParams == NULL)
  1664. {
  1665. THROW_ON_ERROR(WBEM_E_INVALID_METHOD_PARAMETERS);
  1666. }
  1667. hr = i_pInParams->Get(PARAMS::s_GroupID.pszParamName, 0, &vt, NULL, NULL);
  1668. THROW_ON_ERROR(hr);
  1669. WCHAR *pBuf = NULL;
  1670. DWORD dwBufLen;
  1671. CSecConLib consoleHelper;
  1672. hr = consoleHelper.QueryGroupIDStatus(i_wszMbPath, _bstr_t(vt), &pBuf, &dwBufLen);
  1673. THROW_ON_ERROR(hr);
  1674. CComVariant vBuf;
  1675. VariantInit(&vBuf);
  1676. CMultiSz MultiSz;
  1677. hr = MultiSz.ToWmiForm( pBuf, &vBuf );
  1678. if (pBuf)
  1679. {
  1680. delete [] pBuf;
  1681. }
  1682. THROW_ON_ERROR(hr);
  1683. CComPtr<IWbemClassObject> spOutParams = NULL;
  1684. hr = CUtils::CreateEmptyMethodInstance(
  1685. m_pNamespace,
  1686. i_pCtx,
  1687. i_pClass->pszClassName,
  1688. i_pMethod->pszMethodName,
  1689. &spOutParams);
  1690. THROW_ON_ERROR(hr);
  1691. hr = spOutParams->Put(PARAMS::s_Applications.pszParamName, 0, &vBuf, 0);
  1692. THROW_ON_ERROR(hr);
  1693. hr = i_pHandler->Indicate(1, &spOutParams);
  1694. THROW_ON_ERROR(hr);
  1695. }
  1696. else if (i_pMethod == &METHODS::s_ServiceAddDependency)
  1697. {
  1698. if (i_pInParams == NULL)
  1699. {
  1700. THROW_ON_ERROR(WBEM_E_INVALID_METHOD_PARAMETERS);
  1701. }
  1702. hr = i_pInParams->Get(PARAMS::s_Application.pszParamName, 0, &vt, NULL, NULL);
  1703. THROW_ON_ERROR(hr);
  1704. hr = i_pInParams->Get(PARAMS::s_GroupID.pszParamName, 0, &vt2, NULL, NULL);
  1705. THROW_ON_ERROR(hr);
  1706. CSecConLib consoleHelper;
  1707. hr = consoleHelper.AddDependency(_bstr_t(vt), _bstr_t(vt2), i_wszMbPath);
  1708. }
  1709. else if (i_pMethod == &METHODS::s_ServiceRemoveDependency)
  1710. {
  1711. if (i_pInParams == NULL)
  1712. {
  1713. THROW_ON_ERROR(WBEM_E_INVALID_METHOD_PARAMETERS);
  1714. }
  1715. hr = i_pInParams->Get(PARAMS::s_Application.pszParamName, 0, &vt, NULL, NULL);
  1716. THROW_ON_ERROR(hr);
  1717. hr = i_pInParams->Get(PARAMS::s_GroupID.pszParamName, 0, &vt2, NULL, NULL);
  1718. THROW_ON_ERROR(hr);
  1719. CSecConLib consoleHelper;
  1720. hr = consoleHelper.RemoveDependency(_bstr_t(vt), _bstr_t(vt2), i_wszMbPath);
  1721. }
  1722. else if (i_pMethod == &METHODS::s_ServiceEnableWebServiceExtension)
  1723. {
  1724. if (i_pInParams == NULL)
  1725. {
  1726. THROW_ON_ERROR(WBEM_E_INVALID_METHOD_PARAMETERS);
  1727. }
  1728. hr = i_pInParams->Get(PARAMS::s_Extension.pszParamName, 0, &vt, NULL, NULL);
  1729. THROW_ON_ERROR(hr);
  1730. CSecConLib consoleHelper;
  1731. hr = consoleHelper.EnableWebServiceExtension(_bstr_t(vt), i_wszMbPath);
  1732. }
  1733. else if (i_pMethod == &METHODS::s_ServiceDisableWebServiceExtension)
  1734. {
  1735. if (i_pInParams == NULL)
  1736. {
  1737. THROW_ON_ERROR(WBEM_E_INVALID_METHOD_PARAMETERS);
  1738. }
  1739. hr = i_pInParams->Get(PARAMS::s_Extension.pszParamName, 0, &vt, NULL, NULL);
  1740. THROW_ON_ERROR(hr);
  1741. CSecConLib consoleHelper;
  1742. hr = consoleHelper.DisableWebServiceExtension(_bstr_t(vt), i_wszMbPath);
  1743. }
  1744. else if (i_pMethod == &METHODS::s_ServiceListWebServiceExtensions)
  1745. {
  1746. WCHAR *pBuf = NULL;
  1747. DWORD dwBufLen;
  1748. CSecConLib consoleHelper;
  1749. hr = consoleHelper.ListWebServiceExtensions(i_wszMbPath, &pBuf, &dwBufLen);
  1750. THROW_ON_ERROR(hr);
  1751. CComVariant vBuf;
  1752. VariantInit(&vBuf);
  1753. CMultiSz MultiSz;
  1754. hr = MultiSz.ToWmiForm( pBuf, &vBuf );
  1755. if (pBuf)
  1756. {
  1757. delete [] pBuf;
  1758. }
  1759. THROW_ON_ERROR(hr);
  1760. CComPtr<IWbemClassObject> spOutParams = NULL;
  1761. hr = CUtils::CreateEmptyMethodInstance(
  1762. m_pNamespace,
  1763. i_pCtx,
  1764. i_pClass->pszClassName,
  1765. i_pMethod->pszMethodName,
  1766. &spOutParams);
  1767. THROW_ON_ERROR(hr);
  1768. hr = spOutParams->Put(PARAMS::s_Extensions.pszParamName, 0, &vBuf, 0);
  1769. THROW_ON_ERROR(hr);
  1770. hr = i_pHandler->Indicate(1, &spOutParams);
  1771. THROW_ON_ERROR(hr);
  1772. }
  1773. else if (i_pMethod == &METHODS::s_ServiceEnableExtensionFile)
  1774. {
  1775. if (i_pInParams == NULL)
  1776. {
  1777. THROW_ON_ERROR(WBEM_E_INVALID_METHOD_PARAMETERS);
  1778. }
  1779. hr = i_pInParams->Get(PARAMS::s_ExtensionFile.pszParamName, 0, &vt, NULL, NULL);
  1780. THROW_ON_ERROR(hr);
  1781. CSecConLib consoleHelper;
  1782. hr = consoleHelper.EnableExtensionFile(_bstr_t(vt), i_wszMbPath);
  1783. }
  1784. else if (i_pMethod == &METHODS::s_ServiceDisableExtensionFile)
  1785. {
  1786. if (i_pInParams == NULL)
  1787. {
  1788. THROW_ON_ERROR(WBEM_E_INVALID_METHOD_PARAMETERS);
  1789. }
  1790. hr = i_pInParams->Get(PARAMS::s_ExtensionFile.pszParamName, 0, &vt, NULL, NULL);
  1791. THROW_ON_ERROR(hr);
  1792. CSecConLib consoleHelper;
  1793. hr = consoleHelper.DisableExtensionFile(_bstr_t(vt), i_wszMbPath);
  1794. }
  1795. else if (i_pMethod == &METHODS::s_ServiceAddExtensionFile)
  1796. {
  1797. if (i_pInParams == NULL)
  1798. {
  1799. THROW_ON_ERROR(WBEM_E_INVALID_METHOD_PARAMETERS);
  1800. }
  1801. hr = i_pInParams->Get(PARAMS::s_ExtensionFile.pszParamName, 0, &vt, NULL, NULL);
  1802. THROW_ON_ERROR(hr);
  1803. hr = i_pInParams->Get(PARAMS::s_bEnable.pszParamName, 0, &vt2, NULL, NULL);
  1804. THROW_ON_ERROR(hr);
  1805. hr = i_pInParams->Get(PARAMS::s_GroupID.pszParamName, 0, &vt3, NULL, NULL);
  1806. THROW_ON_ERROR(hr);
  1807. hr = i_pInParams->Get(PARAMS::s_bCanDelete.pszParamName, 0, &vt4, NULL, NULL);
  1808. THROW_ON_ERROR(hr);
  1809. hr = i_pInParams->Get(PARAMS::s_Description.pszParamName, 0, &vt5, NULL, NULL);
  1810. THROW_ON_ERROR(hr);
  1811. CSecConLib consoleHelper;
  1812. hr = consoleHelper.AddExtensionFile(_bstr_t(vt), bool(vt2),
  1813. _bstr_t(vt3), bool(vt4),
  1814. _bstr_t(vt5), i_wszMbPath);
  1815. }
  1816. else if (i_pMethod == &METHODS::s_ServiceDeleteExtensionFile)
  1817. {
  1818. if (i_pInParams == NULL)
  1819. {
  1820. THROW_ON_ERROR(WBEM_E_INVALID_METHOD_PARAMETERS);
  1821. }
  1822. hr = i_pInParams->Get(PARAMS::s_ExtensionFile.pszParamName, 0, &vt, NULL, NULL);
  1823. THROW_ON_ERROR(hr);
  1824. CSecConLib consoleHelper;
  1825. hr = consoleHelper.DeleteExtensionFileRecord(_bstr_t(vt), i_wszMbPath);
  1826. }
  1827. else if (i_pMethod == &METHODS::s_ServiceListExtensionFiles)
  1828. {
  1829. WCHAR *pBuf = NULL;
  1830. DWORD dwBufLen;
  1831. CSecConLib consoleHelper;
  1832. hr = consoleHelper.ListExtensionFiles(i_wszMbPath, &pBuf, &dwBufLen);
  1833. THROW_ON_ERROR(hr);
  1834. CComVariant vBuf;
  1835. VariantInit(&vBuf);
  1836. CMultiSz MultiSz;
  1837. hr = MultiSz.ToWmiForm( pBuf, &vBuf );
  1838. if (pBuf)
  1839. {
  1840. delete [] pBuf;
  1841. }
  1842. THROW_ON_ERROR(hr);
  1843. CComPtr<IWbemClassObject> spOutParams = NULL;
  1844. hr = CUtils::CreateEmptyMethodInstance(
  1845. m_pNamespace,
  1846. i_pCtx,
  1847. i_pClass->pszClassName,
  1848. i_pMethod->pszMethodName,
  1849. &spOutParams);
  1850. THROW_ON_ERROR(hr);
  1851. hr = spOutParams->Put(PARAMS::s_ExtensionFiles.pszParamName, 0, &vBuf, 0);
  1852. THROW_ON_ERROR(hr);
  1853. hr = i_pHandler->Indicate(1, &spOutParams);
  1854. THROW_ON_ERROR(hr);
  1855. }
  1856. else
  1857. {
  1858. hr = WBEM_E_INVALID_METHOD;
  1859. }
  1860. THROW_ON_ERROR(hr);
  1861. }
  1862. void CIISInstProvider::WorkerExecComputerMethod(
  1863. LPCWSTR i_wszMbPath,
  1864. LPCWSTR i_wszClassName,
  1865. WMI_METHOD* i_pMethod,
  1866. IWbemContext* i_pCtx,
  1867. IWbemClassObject* i_pInParams,
  1868. IWbemObjectSink* i_pHandler,
  1869. CWbemServices* i_pNameSpace
  1870. )
  1871. {
  1872. HRESULT hr;
  1873. _variant_t vt1, vt2, vt3, vt4, vt5, vt6;
  1874. CMetabase obj;
  1875. if(i_pMethod == &METHODS::s_SaveData)
  1876. {
  1877. hr = obj.SaveData();
  1878. THROW_ON_ERROR(hr);
  1879. }
  1880. else if(i_pMethod == &METHODS::s_EnumBackups)
  1881. {
  1882. if(i_pInParams == NULL)
  1883. {
  1884. THROW_ON_ERROR(WBEM_E_INVALID_METHOD_PARAMETERS);
  1885. }
  1886. //
  1887. // get in params
  1888. //
  1889. hr = i_pInParams->Get(PARAMS::s_BackupLocation.pszParamName, 0, &vt1, NULL, NULL);
  1890. THROW_ON_ERROR(hr);
  1891. hr = i_pInParams->Get(PARAMS::s_IndexIn.pszParamName, 0, &vt2, NULL, NULL);
  1892. THROW_ON_ERROR(hr);
  1893. //
  1894. // make in/out params
  1895. //
  1896. WCHAR BackupLocation[MD_BACKUP_MAX_LEN] = {0};
  1897. if(vt1.vt == VT_BSTR && vt1.bstrVal != NULL)
  1898. {
  1899. ULONG cchBackupLocation = wcslen(vt1.bstrVal);
  1900. if(cchBackupLocation < MD_BACKUP_MAX_LEN)
  1901. {
  1902. memcpy(
  1903. BackupLocation,
  1904. vt1.bstrVal,
  1905. sizeof(WCHAR)*(cchBackupLocation+1));
  1906. }
  1907. else
  1908. {
  1909. CIIsProvException e;
  1910. e.SetHR(
  1911. WBEM_E_INVALID_PARAMETER,
  1912. PARAMS::s_BackupLocation.pszParamName);
  1913. throw e;
  1914. }
  1915. }
  1916. //
  1917. // define out params
  1918. //
  1919. DWORD BackupVersionOut;
  1920. FILETIME BackupDateTimeOut;
  1921. //
  1922. // call method - EnumBackups.
  1923. //
  1924. hr = obj.EnumBackups(
  1925. BackupLocation,
  1926. &BackupVersionOut,
  1927. &BackupDateTimeOut,
  1928. CUtils::ExtractLongFromVt(&vt2, PARAMS::s_IndexIn.pszParamName));
  1929. THROW_ON_ERROR(hr);
  1930. CComPtr<IWbemClassObject> spOutParams;
  1931. hr = CUtils::CreateEmptyMethodInstance(
  1932. i_pNameSpace,
  1933. i_pCtx,
  1934. i_wszClassName,
  1935. i_pMethod->pszMethodName,
  1936. &spOutParams);
  1937. THROW_ON_ERROR(hr);
  1938. //
  1939. // put it into the output object
  1940. // out BackupLocation
  1941. //
  1942. vt1 = BackupLocation;
  1943. hr = spOutParams->Put(PARAMS::s_BackupLocation.pszParamName, 0, &vt1, 0);
  1944. THROW_ON_ERROR(hr);
  1945. //
  1946. // out BackupVersionOut
  1947. //
  1948. vt1.vt = VT_I4;
  1949. vt1.lVal = BackupVersionOut;
  1950. hr = spOutParams->Put(PARAMS::s_BackupVersionOut.pszParamName, 0, &vt1, 0);
  1951. THROW_ON_ERROR(hr);
  1952. //
  1953. // out BackupDateTimeOut (UTC time)
  1954. //
  1955. WCHAR datetime[30];
  1956. CUtils::FileTimeToWchar(&BackupDateTimeOut, datetime);
  1957. vt1 = datetime;
  1958. hr = spOutParams->Put(PARAMS::s_BackupDateTimeOut.pszParamName, 0, &vt1, 0);
  1959. THROW_ON_ERROR(hr);
  1960. //
  1961. // Send the output object back to the client via the sink. Then
  1962. // release the pointers and free the strings.
  1963. //
  1964. hr = i_pHandler->Indicate(1, &spOutParams);
  1965. }
  1966. else if(i_pMethod == &METHODS::s_BackupWithPasswd)
  1967. {
  1968. if(i_pInParams == NULL)
  1969. {
  1970. THROW_ON_ERROR(WBEM_E_INVALID_PARAMETER);
  1971. }
  1972. hr = i_pInParams->Get(PARAMS::s_BackupLocation.pszParamName, 0, &vt1, NULL, NULL);
  1973. THROW_ON_ERROR(hr);
  1974. hr = i_pInParams->Get(PARAMS::s_BackupVersion.pszParamName, 0, &vt2, NULL, NULL);
  1975. THROW_ON_ERROR(hr);
  1976. hr = i_pInParams->Get(PARAMS::s_BackupFlags.pszParamName, 0, &vt3, NULL, NULL);
  1977. THROW_ON_ERROR(hr);
  1978. hr = i_pInParams->Get(PARAMS::s_Password.pszParamName, 0, &vt4, NULL, NULL);
  1979. THROW_ON_ERROR(hr);
  1980. hr = obj.BackupWithPasswd(
  1981. CUtils::ExtractBstrFromVt(&vt1, PARAMS::s_BackupLocation.pszParamName),
  1982. CUtils::ExtractLongFromVt(&vt2, PARAMS::s_BackupVersion.pszParamName),
  1983. CUtils::ExtractLongFromVt(&vt3, PARAMS::s_BackupFlags.pszParamName),
  1984. CUtils::ExtractBstrFromVt(&vt4, PARAMS::s_Password.pszParamName));
  1985. }
  1986. else if(i_pMethod == &METHODS::s_DeleteBackup)
  1987. {
  1988. if(i_pInParams == NULL)
  1989. {
  1990. THROW_ON_ERROR(WBEM_E_INVALID_METHOD_PARAMETERS);
  1991. }
  1992. hr = i_pInParams->Get(PARAMS::s_BackupLocation.pszParamName, 0, &vt1, NULL, NULL);
  1993. THROW_ON_ERROR(hr);
  1994. hr = i_pInParams->Get(PARAMS::s_BackupVersion.pszParamName, 0, &vt2, NULL, NULL);
  1995. THROW_ON_ERROR(hr);
  1996. hr = obj.DeleteBackup(
  1997. CUtils::ExtractBstrFromVt(&vt1, PARAMS::s_BackupLocation.pszParamName),
  1998. CUtils::ExtractLongFromVt(&vt2, PARAMS::s_BackupVersion.pszParamName));
  1999. }
  2000. else if(i_pMethod == &METHODS::s_RestoreWithPasswd)
  2001. {
  2002. if(i_pInParams == NULL)
  2003. {
  2004. THROW_ON_ERROR(WBEM_E_INVALID_METHOD_PARAMETERS);
  2005. }
  2006. hr = i_pInParams->Get(PARAMS::s_BackupLocation.pszParamName, 0, &vt1, NULL, NULL);
  2007. THROW_ON_ERROR(hr);
  2008. hr = i_pInParams->Get(PARAMS::s_BackupVersion.pszParamName, 0, &vt2, NULL, NULL);
  2009. THROW_ON_ERROR(hr);
  2010. hr = i_pInParams->Get(PARAMS::s_BackupFlags.pszParamName, 0, &vt3, NULL, NULL);
  2011. THROW_ON_ERROR(hr);
  2012. hr = i_pInParams->Get(PARAMS::s_Password.pszParamName, 0, &vt4, NULL, NULL);
  2013. THROW_ON_ERROR(hr);
  2014. hr = obj.RestoreWithPasswd(
  2015. CUtils::ExtractBstrFromVt(&vt1, PARAMS::s_BackupLocation.pszParamName),
  2016. CUtils::ExtractLongFromVt(&vt2, PARAMS::s_BackupVersion.pszParamName),
  2017. CUtils::ExtractLongFromVt(&vt3, PARAMS::s_BackupFlags.pszParamName),
  2018. CUtils::ExtractBstrFromVt(&vt4, PARAMS::s_Password.pszParamName));
  2019. }
  2020. else if(i_pMethod == &METHODS::s_Export)
  2021. {
  2022. if(i_pInParams == NULL)
  2023. {
  2024. THROW_ON_ERROR(WBEM_E_INVALID_METHOD_PARAMETERS);
  2025. }
  2026. hr = i_pInParams->Get(PARAMS::s_Passwd.pszParamName, 0, &vt1, NULL, NULL);
  2027. THROW_ON_ERROR(hr);
  2028. hr = i_pInParams->Get(PARAMS::s_FileName.pszParamName, 0, &vt2, NULL, NULL);
  2029. THROW_ON_ERROR(hr);
  2030. hr = i_pInParams->Get(PARAMS::s_SourcePath.pszParamName, 0, &vt3, NULL, NULL);
  2031. THROW_ON_ERROR(hr);
  2032. hr = i_pInParams->Get(PARAMS::s_MDFlags.pszParamName, 0, &vt4, NULL, NULL);
  2033. THROW_ON_ERROR(hr);
  2034. hr = obj.Export(
  2035. CUtils::ExtractBstrFromVt(&vt1, PARAMS::s_Passwd.pszParamName),
  2036. CUtils::ExtractBstrFromVt(&vt2, PARAMS::s_FileName.pszParamName),
  2037. CUtils::ExtractBstrFromVt(&vt3, PARAMS::s_SourcePath.pszParamName),
  2038. CUtils::ExtractLongFromVt(&vt4, PARAMS::s_MDFlags.pszParamName));
  2039. }
  2040. else if(i_pMethod == &METHODS::s_Import)
  2041. {
  2042. if(i_pInParams == NULL)
  2043. {
  2044. THROW_ON_ERROR(WBEM_E_INVALID_METHOD_PARAMETERS);
  2045. }
  2046. hr = i_pInParams->Get(PARAMS::s_Passwd.pszParamName, 0, &vt1, NULL, NULL);
  2047. THROW_ON_ERROR(hr);
  2048. hr = i_pInParams->Get(PARAMS::s_FileName.pszParamName, 0, &vt2, NULL, NULL);
  2049. THROW_ON_ERROR(hr);
  2050. hr = i_pInParams->Get(PARAMS::s_SourcePath.pszParamName, 0, &vt3, NULL, NULL);
  2051. THROW_ON_ERROR(hr);
  2052. hr = i_pInParams->Get(PARAMS::s_DestPath.pszParamName, 0, &vt4, NULL, NULL);
  2053. THROW_ON_ERROR(hr);
  2054. hr = i_pInParams->Get(PARAMS::s_MDFlags.pszParamName, 0, &vt5, NULL, NULL);
  2055. THROW_ON_ERROR(hr);
  2056. hr = obj.Import(
  2057. CUtils::ExtractBstrFromVt(&vt1, PARAMS::s_Passwd.pszParamName),
  2058. CUtils::ExtractBstrFromVt(&vt2, PARAMS::s_FileName.pszParamName),
  2059. CUtils::ExtractBstrFromVt(&vt3, PARAMS::s_SourcePath.pszParamName),
  2060. CUtils::ExtractBstrFromVt(&vt4, PARAMS::s_DestPath.pszParamName),
  2061. CUtils::ExtractLongFromVt(&vt5, PARAMS::s_MDFlags.pszParamName));
  2062. }
  2063. else if(i_pMethod == &METHODS::s_RestoreHistory)
  2064. {
  2065. if(i_pInParams == NULL)
  2066. {
  2067. THROW_ON_ERROR(WBEM_E_INVALID_METHOD_PARAMETERS);
  2068. }
  2069. hr = i_pInParams->Get(PARAMS::s_MDHistoryLocation.pszParamName, 0, &vt1, NULL, NULL);
  2070. THROW_ON_ERROR(hr);
  2071. hr = i_pInParams->Get(PARAMS::s_MajorVersion.pszParamName, 0, &vt2, NULL, NULL);
  2072. THROW_ON_ERROR(hr);
  2073. hr = i_pInParams->Get(PARAMS::s_MinorVersion.pszParamName, 0, &vt3, NULL, NULL);
  2074. THROW_ON_ERROR(hr);
  2075. hr = i_pInParams->Get(PARAMS::s_MDFlags.pszParamName, 0, &vt4, NULL, NULL);
  2076. THROW_ON_ERROR(hr);
  2077. hr = obj.RestoreHistory(
  2078. CUtils::ExtractBstrFromVt(&vt1, PARAMS::s_MDHistoryLocation.pszParamName),
  2079. CUtils::ExtractLongFromVt(&vt2, PARAMS::s_MajorVersion.pszParamName),
  2080. CUtils::ExtractLongFromVt(&vt3, PARAMS::s_MinorVersion.pszParamName),
  2081. CUtils::ExtractLongFromVt(&vt4, PARAMS::s_MDFlags.pszParamName));
  2082. }
  2083. else if(i_pMethod == &METHODS::s_EnumHistory)
  2084. {
  2085. if(i_pInParams == NULL)
  2086. {
  2087. THROW_ON_ERROR(WBEM_E_INVALID_METHOD_PARAMETERS);
  2088. }
  2089. //
  2090. // get in params
  2091. //
  2092. hr = i_pInParams->Get(PARAMS::s_MDHistoryLocation.pszParamName, 0, &vt1, NULL, NULL);
  2093. THROW_ON_ERROR(hr);
  2094. hr = i_pInParams->Get(PARAMS::s_EnumIndex.pszParamName, 0, &vt2, NULL, NULL);
  2095. THROW_ON_ERROR(hr);
  2096. //
  2097. // make in/out params
  2098. //
  2099. WCHAR MDHistoryLocation[MD_BACKUP_MAX_LEN] = {0};
  2100. if(vt1.vt == VT_BSTR && vt1.bstrVal != NULL)
  2101. {
  2102. ULONG cchHistoryLocation = wcslen(vt1.bstrVal);
  2103. if(cchHistoryLocation < MD_BACKUP_MAX_LEN)
  2104. {
  2105. memcpy(
  2106. MDHistoryLocation,
  2107. vt1.bstrVal,
  2108. sizeof(WCHAR)*(cchHistoryLocation+1));
  2109. }
  2110. else
  2111. {
  2112. CIIsProvException e;
  2113. e.SetHR(
  2114. WBEM_E_INVALID_PARAMETER,
  2115. PARAMS::s_MDHistoryLocation.pszParamName);
  2116. throw e;
  2117. }
  2118. }
  2119. //
  2120. // define out params
  2121. //
  2122. DWORD HistoryMajorVersionOut;
  2123. DWORD HistoryMinorVersionOut;
  2124. FILETIME HistoryDateTimeOut;
  2125. //
  2126. // call method - EnumHistory.
  2127. //
  2128. hr = obj.EnumHistory(
  2129. MDHistoryLocation,
  2130. &HistoryMajorVersionOut,
  2131. &HistoryMinorVersionOut,
  2132. &HistoryDateTimeOut,
  2133. CUtils::ExtractLongFromVt(&vt2, PARAMS::s_EnumIndex.pszParamName));
  2134. THROW_ON_ERROR(hr);
  2135. CComPtr<IWbemClassObject> spOutParams;
  2136. hr = CUtils::CreateEmptyMethodInstance(
  2137. i_pNameSpace,
  2138. i_pCtx,
  2139. i_wszClassName,
  2140. i_pMethod->pszMethodName,
  2141. &spOutParams);
  2142. THROW_ON_ERROR(hr);
  2143. //
  2144. // put it into the output object
  2145. // out MDHistoryLocation
  2146. //
  2147. vt1 = MDHistoryLocation;
  2148. hr = spOutParams->Put(PARAMS::s_MDHistoryLocation.pszParamName, 0, &vt1, 0);
  2149. THROW_ON_ERROR(hr);
  2150. //
  2151. // out HistoryMajorVersionOut
  2152. //
  2153. vt1.vt = VT_I4;
  2154. vt1.lVal = HistoryMajorVersionOut;
  2155. hr = spOutParams->Put(PARAMS::s_MajorVersion.pszParamName, 0, &vt1, 0);
  2156. THROW_ON_ERROR(hr);
  2157. //
  2158. // out HistoryMinorVersionOut
  2159. //
  2160. vt1.vt = VT_I4;
  2161. vt1.lVal = HistoryMinorVersionOut;
  2162. hr = spOutParams->Put(PARAMS::s_MinorVersion.pszParamName, 0, &vt1, 0);
  2163. THROW_ON_ERROR(hr);
  2164. //
  2165. // out HistoryDateTimeOut (UTC time)
  2166. //
  2167. WCHAR datetime[30];
  2168. CUtils::FileTimeToWchar(&HistoryDateTimeOut, datetime);
  2169. vt1 = datetime;
  2170. hr = spOutParams->Put(PARAMS::s_HistoryTime.pszParamName, 0, &vt1, 0);
  2171. THROW_ON_ERROR(hr);
  2172. //
  2173. // Send the output object back to the client via the sink. Then
  2174. // release the pointers and free the strings.
  2175. //
  2176. hr = i_pHandler->Indicate(1, &spOutParams);
  2177. }
  2178. else
  2179. {
  2180. hr = WBEM_E_INVALID_METHOD;
  2181. }
  2182. THROW_ON_ERROR(hr);
  2183. }
  2184. void CIISInstProvider::WorkerExecAppPoolMethod(
  2185. LPCWSTR i_wszMbPath,
  2186. LPCWSTR i_wszClassName,
  2187. WMI_METHOD* i_pMethod,
  2188. IWbemContext* i_pCtx,
  2189. IWbemClassObject* i_pInParams,
  2190. IWbemObjectSink* i_pHandler,
  2191. CWbemServices* i_pNameSpace
  2192. )
  2193. {
  2194. DBG_ASSERT(i_wszMbPath != NULL);
  2195. DBG_ASSERT(i_pNameSpace != NULL);
  2196. DBG_ASSERT(i_pHandler != NULL);
  2197. HRESULT hr = WBEM_S_NO_ERROR;
  2198. CAppPoolMethod obj;
  2199. if(i_pMethod == &METHODS::s_EnumAppsInPool)
  2200. {
  2201. CComVariant vtApplications;
  2202. obj.EnumAppsInPool(i_wszMbPath, &vtApplications);
  2203. CComPtr<IWbemClassObject> spOutParams;
  2204. hr = CUtils::CreateEmptyMethodInstance(
  2205. i_pNameSpace,
  2206. i_pCtx,
  2207. i_wszClassName,
  2208. i_pMethod->pszMethodName,
  2209. &spOutParams);
  2210. THROW_ON_ERROR(hr);
  2211. hr = spOutParams->Put(PARAMS::s_Applications.pszParamName, 0, &vtApplications, 0);
  2212. THROW_ON_ERROR(hr);
  2213. hr = i_pHandler->Indicate(1, &spOutParams);
  2214. THROW_ON_ERROR(hr);
  2215. }
  2216. else if(i_pMethod == &METHODS::s_RecycleAppPool)
  2217. {
  2218. obj.RecycleAppPool(i_wszMbPath);
  2219. }
  2220. else if(i_pMethod == &METHODS::s_Start)
  2221. {
  2222. obj.Start(i_wszMbPath);
  2223. }
  2224. else if(i_pMethod == &METHODS::s_Stop)
  2225. {
  2226. obj.Stop(i_wszMbPath);
  2227. }
  2228. else
  2229. {
  2230. THROW_ON_ERROR(WBEM_E_INVALID_METHOD);
  2231. }
  2232. }
  2233. void CIISInstProvider::WorkerExecCertMapperMethod(
  2234. LPCWSTR i_wszMbPath,
  2235. LPCWSTR i_wszClassName,
  2236. WMI_METHOD* i_pMethod,
  2237. IWbemContext* i_pCtx,
  2238. IWbemClassObject* i_pInParams,
  2239. IWbemObjectSink* i_pHandler,
  2240. CWbemServices* i_pNameSpace
  2241. )
  2242. {
  2243. HRESULT hr;
  2244. _variant_t vt1, vt2, vt3=L"1", vt4=L"1", vt5=L"1", vt6=L"1", vt7=L"1";
  2245. CCertMapperMethod obj(i_wszMbPath);
  2246. if(i_pMethod == &METHODS::s_CreateMapping)
  2247. {
  2248. if(i_pInParams == NULL)
  2249. {
  2250. THROW_ON_ERROR(WBEM_E_INVALID_METHOD_PARAMETERS)
  2251. }
  2252. hr = i_pInParams->Get(PARAMS::s_vCert.pszParamName, 0, &vt1, NULL, NULL);
  2253. THROW_ON_ERROR(hr);
  2254. hr = i_pInParams->Get(PARAMS::s_NtAcct.pszParamName, 0, &vt2, NULL, NULL);
  2255. THROW_ON_ERROR(hr);
  2256. hr = i_pInParams->Get(PARAMS::s_NtPwd.pszParamName, 0, &vt3, NULL, NULL);
  2257. THROW_ON_ERROR(hr);
  2258. hr = i_pInParams->Get(PARAMS::s_strName.pszParamName, 0, &vt4, NULL, NULL);
  2259. THROW_ON_ERROR(hr);
  2260. hr = i_pInParams->Get(PARAMS::s_IEnabled.pszParamName, 0, &vt5, NULL, NULL);
  2261. THROW_ON_ERROR(hr);
  2262. //
  2263. // call method - CreateMapping.
  2264. //
  2265. hr = obj.CreateMapping(vt1, vt2.bstrVal, vt3.bstrVal, vt4.bstrVal, vt5);
  2266. }
  2267. else if(i_pMethod == &METHODS::s_DeleteMapping)
  2268. {
  2269. if(i_pInParams == NULL)
  2270. {
  2271. THROW_ON_ERROR(WBEM_E_INVALID_METHOD_PARAMETERS);
  2272. }
  2273. hr = i_pInParams->Get(PARAMS::s_IMethod.pszParamName, 0, &vt1, NULL, NULL);
  2274. THROW_ON_ERROR(hr);
  2275. hr = i_pInParams->Get(PARAMS::s_vKey.pszParamName, 0, &vt2, NULL, NULL);
  2276. THROW_ON_ERROR(hr);
  2277. //
  2278. // call method - DeleteMapping.
  2279. //
  2280. hr = obj.DeleteMapping(vt1, vt2);
  2281. }
  2282. else if(i_pMethod == &METHODS::s_GetMapping)
  2283. {
  2284. if(i_pInParams == NULL)
  2285. {
  2286. THROW_ON_ERROR(WBEM_E_INVALID_METHOD_PARAMETERS);
  2287. }
  2288. //
  2289. // get in params
  2290. //
  2291. hr = i_pInParams->Get(PARAMS::s_IMethod.pszParamName, 0, &vt1, NULL, NULL);
  2292. THROW_ON_ERROR(hr);
  2293. hr = i_pInParams->Get(PARAMS::s_vKey.pszParamName, 0, &vt2, NULL, NULL);
  2294. THROW_ON_ERROR(hr);
  2295. //
  2296. // call method - GetMapping.
  2297. //
  2298. hr = obj.GetMapping(vt1, vt2, &vt3, &vt4, &vt5, &vt6, &vt7);
  2299. THROW_ON_ERROR(hr);
  2300. CComPtr<IWbemClassObject> spOutParams;
  2301. hr = CUtils::CreateEmptyMethodInstance(
  2302. i_pNameSpace,
  2303. i_pCtx,
  2304. i_wszClassName,
  2305. i_pMethod->pszMethodName,
  2306. &spOutParams);
  2307. THROW_ON_ERROR(hr);
  2308. //
  2309. // put them into the output object
  2310. //
  2311. hr = spOutParams->Put(PARAMS::s_vCert.pszParamName, 0, &vt3, 0);
  2312. THROW_ON_ERROR(hr);
  2313. hr = spOutParams->Put(PARAMS::s_NtAcct.pszParamName, 0, &vt4, 0);
  2314. THROW_ON_ERROR(hr);
  2315. hr = spOutParams->Put(PARAMS::s_NtPwd.pszParamName, 0, &vt5, 0);
  2316. THROW_ON_ERROR(hr);
  2317. hr = spOutParams->Put(PARAMS::s_strName.pszParamName, 0, &vt6, 0);
  2318. THROW_ON_ERROR(hr);
  2319. hr = spOutParams->Put(PARAMS::s_IEnabled.pszParamName, 0, &vt7, 0);
  2320. THROW_ON_ERROR(hr);
  2321. //
  2322. // Send the output object back to the client via the sink. Then
  2323. // release the pointers and free the strings.
  2324. //
  2325. hr = i_pHandler->Indicate(1, &spOutParams);
  2326. }
  2327. else if(i_pMethod == &METHODS::s_SetAcct)
  2328. {
  2329. if(i_pInParams == NULL)
  2330. {
  2331. THROW_ON_ERROR(WBEM_E_INVALID_METHOD_PARAMETERS);
  2332. }
  2333. hr = i_pInParams->Get(PARAMS::s_IMethod.pszParamName, 0, &vt1, NULL, NULL);
  2334. THROW_ON_ERROR(hr);
  2335. hr = i_pInParams->Get(PARAMS::s_vKey.pszParamName, 0, &vt2, NULL, NULL);
  2336. THROW_ON_ERROR(hr);
  2337. hr = i_pInParams->Get(PARAMS::s_NtAcct.pszParamName, 0, &vt3, NULL, NULL);
  2338. THROW_ON_ERROR(hr);
  2339. //
  2340. // call method - SetAcct.
  2341. //
  2342. hr = obj.SetAcct(vt1, vt2, vt3.bstrVal);
  2343. }
  2344. else if(i_pMethod == &METHODS::s_SetEnabled)
  2345. {
  2346. if(i_pInParams == NULL)
  2347. {
  2348. THROW_ON_ERROR(WBEM_E_INVALID_METHOD_PARAMETERS);
  2349. }
  2350. hr = i_pInParams->Get(PARAMS::s_IMethod.pszParamName, 0, &vt1, NULL, NULL);
  2351. THROW_ON_ERROR(hr);
  2352. hr = i_pInParams->Get(PARAMS::s_vKey.pszParamName, 0, &vt2, NULL, NULL);
  2353. THROW_ON_ERROR(hr);
  2354. hr = i_pInParams->Get(PARAMS::s_IEnabled.pszParamName, 0, &vt3, NULL, NULL);
  2355. THROW_ON_ERROR(hr);
  2356. //
  2357. // call method - SetEnabled.
  2358. //
  2359. hr = obj.SetEnabled(vt1, vt2, vt3);
  2360. }
  2361. else if(i_pMethod == &METHODS::s_SetName)
  2362. {
  2363. if(i_pInParams == NULL)
  2364. {
  2365. THROW_ON_ERROR(WBEM_E_INVALID_METHOD_PARAMETERS);
  2366. }
  2367. hr = i_pInParams->Get(PARAMS::s_IMethod.pszParamName, 0, &vt1, NULL, NULL);
  2368. THROW_ON_ERROR(hr);
  2369. hr = i_pInParams->Get(PARAMS::s_vKey.pszParamName, 0, &vt2, NULL, NULL);
  2370. THROW_ON_ERROR(hr);
  2371. hr = i_pInParams->Get(PARAMS::s_strName.pszParamName, 0, &vt3, NULL, NULL);
  2372. THROW_ON_ERROR(hr);
  2373. //
  2374. // call method - SetName.
  2375. //
  2376. hr = obj.SetName(vt1, vt2, vt3.bstrVal);
  2377. }
  2378. else if(i_pMethod == &METHODS::s_SetPwd)
  2379. {
  2380. if(i_pInParams == NULL)
  2381. {
  2382. THROW_ON_ERROR(WBEM_E_INVALID_METHOD_PARAMETERS);
  2383. }
  2384. hr = i_pInParams->Get(PARAMS::s_IMethod.pszParamName, 0, &vt1, NULL, NULL);
  2385. THROW_ON_ERROR(hr);
  2386. hr = i_pInParams->Get(PARAMS::s_vKey.pszParamName, 0, &vt2, NULL, NULL);
  2387. THROW_ON_ERROR(hr);
  2388. hr = i_pInParams->Get(PARAMS::s_NtPwd.pszParamName, 0, &vt3, NULL, NULL);
  2389. THROW_ON_ERROR(hr);
  2390. //
  2391. // call method - SetPwd.
  2392. //
  2393. hr = obj.SetPwd(vt1, vt2, vt3.bstrVal);
  2394. }
  2395. else
  2396. {
  2397. hr = WBEM_E_INVALID_METHOD;
  2398. }
  2399. THROW_ON_ERROR(hr);
  2400. }