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.

426 lines
10 KiB

  1. #include "StdAfx.h"
  2. #include "ADMTScript.h"
  3. #include "ComputerMigration.h"
  4. #include "Error.h"
  5. #include "VarSetOptions.h"
  6. #include "VarSetAccountOptions.h"
  7. #include "VarSetSecurity.h"
  8. //---------------------------------------------------------------------------
  9. // Computer Migration Class
  10. //---------------------------------------------------------------------------
  11. CComputerMigration::CComputerMigration() :
  12. m_lTranslationOption(admtTranslateReplace),
  13. m_bTranslateFilesAndFolders(false),
  14. m_bTranslateLocalGroups(false),
  15. m_bTranslatePrinters(false),
  16. m_bTranslateRegistry(false),
  17. m_bTranslateShares(false),
  18. m_bTranslateUserProfiles(false),
  19. m_bTranslateUserRights(false),
  20. m_lRestartDelay(5)
  21. {
  22. }
  23. CComputerMigration::~CComputerMigration()
  24. {
  25. }
  26. // IComputerMigration Implementation ----------------------------------------
  27. // TranslationOption Property
  28. STDMETHODIMP CComputerMigration::put_TranslationOption(long lOption)
  29. {
  30. HRESULT hr = S_OK;
  31. if (IsTranslationOptionValid(lOption))
  32. {
  33. m_lTranslationOption = lOption;
  34. }
  35. else
  36. {
  37. hr = AdmtSetError(CLSID_Migration, IID_IComputerMigration, E_INVALIDARG, IDS_E_TRANSLATION_OPTION_INVALID);
  38. }
  39. return hr;
  40. }
  41. STDMETHODIMP CComputerMigration::get_TranslationOption(long* plOption)
  42. {
  43. *plOption = m_lTranslationOption;
  44. return S_OK;
  45. }
  46. // TranslateFilesAndFolders Property
  47. STDMETHODIMP CComputerMigration::put_TranslateFilesAndFolders(VARIANT_BOOL bTranslate)
  48. {
  49. m_bTranslateFilesAndFolders = bTranslate ? true : false;
  50. return S_OK;
  51. }
  52. STDMETHODIMP CComputerMigration::get_TranslateFilesAndFolders(VARIANT_BOOL* pbTranslate)
  53. {
  54. *pbTranslate = m_bTranslateFilesAndFolders ? VARIANT_TRUE : VARIANT_FALSE;
  55. return S_OK;
  56. }
  57. // TranslateLocalGroups Property
  58. STDMETHODIMP CComputerMigration::put_TranslateLocalGroups(VARIANT_BOOL bTranslate)
  59. {
  60. m_bTranslateLocalGroups = bTranslate ? true : false;
  61. return S_OK;
  62. }
  63. STDMETHODIMP CComputerMigration::get_TranslateLocalGroups(VARIANT_BOOL* pbTranslate)
  64. {
  65. *pbTranslate = m_bTranslateLocalGroups ? VARIANT_TRUE : VARIANT_FALSE;
  66. return S_OK;
  67. }
  68. // TranslatePrinters Property
  69. STDMETHODIMP CComputerMigration::put_TranslatePrinters(VARIANT_BOOL bTranslate)
  70. {
  71. m_bTranslatePrinters = bTranslate ? true : false;
  72. return S_OK;
  73. }
  74. STDMETHODIMP CComputerMigration::get_TranslatePrinters(VARIANT_BOOL* pbTranslate)
  75. {
  76. *pbTranslate = m_bTranslatePrinters ? VARIANT_TRUE : VARIANT_FALSE;
  77. return S_OK;
  78. }
  79. // TranslateRegistry Property
  80. STDMETHODIMP CComputerMigration::put_TranslateRegistry(VARIANT_BOOL bTranslate)
  81. {
  82. m_bTranslateRegistry = bTranslate ? true : false;
  83. return S_OK;
  84. }
  85. STDMETHODIMP CComputerMigration::get_TranslateRegistry(VARIANT_BOOL* pbTranslate)
  86. {
  87. *pbTranslate = m_bTranslateRegistry ? VARIANT_TRUE : VARIANT_FALSE;
  88. return S_OK;
  89. }
  90. // TranslateShares Property
  91. STDMETHODIMP CComputerMigration::put_TranslateShares(VARIANT_BOOL bTranslate)
  92. {
  93. m_bTranslateShares = bTranslate ? true : false;
  94. return S_OK;
  95. }
  96. STDMETHODIMP CComputerMigration::get_TranslateShares(VARIANT_BOOL* pbTranslate)
  97. {
  98. *pbTranslate = m_bTranslateShares ? VARIANT_TRUE : VARIANT_FALSE;
  99. return S_OK;
  100. }
  101. // TranslateUserProfiles Property
  102. STDMETHODIMP CComputerMigration::put_TranslateUserProfiles(VARIANT_BOOL bTranslate)
  103. {
  104. m_bTranslateUserProfiles = bTranslate ? true : false;
  105. return S_OK;
  106. }
  107. STDMETHODIMP CComputerMigration::get_TranslateUserProfiles(VARIANT_BOOL* pbTranslate)
  108. {
  109. *pbTranslate = m_bTranslateUserProfiles ? VARIANT_TRUE : VARIANT_FALSE;
  110. return S_OK;
  111. }
  112. // TranslateUserRights Property
  113. STDMETHODIMP CComputerMigration::put_TranslateUserRights(VARIANT_BOOL bTranslate)
  114. {
  115. m_bTranslateUserRights = bTranslate ? true : false;
  116. return S_OK;
  117. }
  118. STDMETHODIMP CComputerMigration::get_TranslateUserRights(VARIANT_BOOL* pbTranslate)
  119. {
  120. *pbTranslate = m_bTranslateUserRights ? VARIANT_TRUE : VARIANT_FALSE;
  121. return S_OK;
  122. }
  123. // RestartDelay Property
  124. STDMETHODIMP CComputerMigration::put_RestartDelay(long lTime)
  125. {
  126. HRESULT hr = S_OK;
  127. if ((lTime >= 1) && (lTime <= 10))
  128. {
  129. m_lRestartDelay = lTime;
  130. }
  131. else
  132. {
  133. hr = AdmtSetError(CLSID_Migration, IID_IComputerMigration, E_INVALIDARG, IDS_E_RESTART_DELAY_INVALID);
  134. }
  135. return hr;
  136. }
  137. STDMETHODIMP CComputerMigration::get_RestartDelay(long* plTime)
  138. {
  139. *plTime = m_lRestartDelay;
  140. return S_OK;
  141. }
  142. // Migrate Method
  143. STDMETHODIMP CComputerMigration::Migrate(long lOptions, VARIANT vntInclude, VARIANT vntExclude)
  144. {
  145. HRESULT hr = S_OK;
  146. MutexWait();
  147. bool bLogOpen = _Module.OpenLog();
  148. try
  149. {
  150. _Module.Log(ErrI, IDS_STARTED_COMPUTER_MIGRATION);
  151. InitSourceDomainAndContainer();
  152. InitTargetDomainAndContainer();
  153. SetDefaultExcludedSystemProperties();
  154. VerifyInterIntraForest();
  155. VerifyCallerDelegated();
  156. ValidateMigrationParameters();
  157. DoOption(lOptions, vntInclude, vntExclude);
  158. }
  159. catch (_com_error& ce)
  160. {
  161. _Module.Log(ErrE, IDS_E_CANT_MIGRATE_COMPUTERS, ce);
  162. hr = AdmtSetError(CLSID_Migration, IID_IComputerMigration, ce, IDS_E_CANT_MIGRATE_COMPUTERS);
  163. }
  164. catch (...)
  165. {
  166. _Module.Log(ErrE, IDS_E_CANT_MIGRATE_COMPUTERS, _com_error(E_FAIL));
  167. hr = AdmtSetError(CLSID_Migration, IID_IComputerMigration, E_FAIL, IDS_E_CANT_MIGRATE_COMPUTERS);
  168. }
  169. if (bLogOpen)
  170. {
  171. _Module.CloseLog();
  172. }
  173. MutexRelease();
  174. return hr;
  175. }
  176. // Implementation -----------------------------------------------------------
  177. // ValidateMigrationParameters Method
  178. void CComputerMigration::ValidateMigrationParameters()
  179. {
  180. bool bIntraForest = m_spInternal->IntraForest ? true : false;
  181. if (bIntraForest)
  182. {
  183. // validate conflict option
  184. long lConflictOptions = m_spInternal->ConflictOptions;
  185. long lConflictOption = lConflictOptions & 0x0F;
  186. if (lConflictOption == admtReplaceConflicting)
  187. {
  188. AdmtThrowError(GUID_NULL, GUID_NULL, E_INVALIDARG, IDS_E_INTRA_FOREST_REPLACE);
  189. }
  190. }
  191. }
  192. // DoNames Method
  193. void CComputerMigration::DoNames()
  194. {
  195. CDomainAccounts aComputers;
  196. m_SourceDomain.QueryComputers(GetSourceContainer(), false, m_setIncludeNames, m_setExcludeNames, aComputers);
  197. DoComputers(aComputers, GetTargetContainer());
  198. }
  199. // DoDomain Method
  200. void CComputerMigration::DoDomain()
  201. {
  202. CContainer& rSource = GetSourceContainer();
  203. CContainer& rTarget = GetTargetContainer();
  204. if (m_nRecurseMaintain == 2)
  205. {
  206. rTarget.CreateContainerHierarchy(rSource);
  207. }
  208. DoContainers(rSource, rTarget);
  209. }
  210. // DoContainers Method
  211. void CComputerMigration::DoContainers(CContainer& rSource, CContainer& rTarget)
  212. {
  213. DoComputers(rSource, rTarget);
  214. if (m_nRecurseMaintain == 2)
  215. {
  216. ContainerVector aContainers;
  217. rSource.QueryContainers(aContainers);
  218. for (ContainerVector::iterator it = aContainers.begin(); it != aContainers.end(); it++)
  219. {
  220. DoContainers(*it, rTarget.GetContainer(it->GetName()));
  221. }
  222. }
  223. }
  224. // DoComputers Method
  225. void CComputerMigration::DoComputers(CContainer& rSource, CContainer& rTarget)
  226. {
  227. CDomainAccounts aComputers;
  228. rSource.QueryComputers(false, m_nRecurseMaintain == 1, m_setExcludeNames, aComputers);
  229. DoComputers(aComputers, rTarget);
  230. }
  231. // DoComputers Method
  232. void CComputerMigration::DoComputers(CDomainAccounts& rComputers, CContainer& rTarget)
  233. {
  234. if (rComputers.size() > 0)
  235. {
  236. CVarSet aVarSet;
  237. SetOptions(rTarget.GetPath(), aVarSet);
  238. SetAccountOptions(aVarSet);
  239. SetSecurity(aVarSet);
  240. VerifyRenameConflictPrefixSuffixValid();
  241. FillInVarSetForComputers(rComputers, false, true, true, m_lRestartDelay, aVarSet);
  242. rComputers.clear();
  243. aVarSet.Put(_T("PlugIn.%ld"), 0, _T("None"));
  244. #ifdef _DEBUG
  245. aVarSet.Dump();
  246. #endif
  247. PerformMigration(aVarSet);
  248. SaveSettings(aVarSet);
  249. }
  250. }
  251. // SetOptions Method
  252. void CComputerMigration::SetOptions(_bstr_t strTargetOu, CVarSet& rVarSet)
  253. {
  254. CVarSetOptions aOptions(rVarSet);
  255. aOptions.SetTest(m_spInternal->TestMigration ? true : false);
  256. aOptions.SetUndo(false);
  257. aOptions.SetWizard(_T("computer"));
  258. aOptions.SetIntraForest(m_spInternal->IntraForest ? true : false);
  259. aOptions.SetSourceDomain(m_SourceDomain.NameFlat(), m_SourceDomain.NameDns(), m_SourceDomain.Sid());
  260. aOptions.SetTargetDomain(m_TargetDomain.NameFlat(), m_TargetDomain.NameDns());
  261. aOptions.SetTargetOu(strTargetOu);
  262. aOptions.SetRenameOptions(m_spInternal->RenameOption, m_spInternal->RenamePrefixOrSuffix);
  263. aOptions.SetRestartDelay(m_lRestartDelay);
  264. }
  265. // SetAccountOptions Method
  266. void CComputerMigration::SetAccountOptions(CVarSet& rVarSet)
  267. {
  268. CVarSetAccountOptions aOptions(rVarSet);
  269. // naming conflict options
  270. // removing existing members of groups being replaced is not applicable
  271. aOptions.SetConflictOptions(
  272. m_spInternal->ConflictOptions & ~admtRemoveExistingMembers,
  273. m_spInternal->ConflictPrefixOrSuffix
  274. );
  275. aOptions.SetMigrateSids(false);
  276. aOptions.SetComputerMigrationOptions();
  277. aOptions.SetExcludedComputerProps(m_spInternal->ComputerPropertiesToExclude);
  278. }
  279. // SetSecurity Method
  280. void CComputerMigration::SetSecurity(CVarSet& rVarSet)
  281. {
  282. CVarSetSecurity aSecurity(rVarSet);
  283. aSecurity.SetTranslationOption(m_lTranslationOption);
  284. aSecurity.SetTranslateContainers(false);
  285. aSecurity.SetTranslateFiles(m_bTranslateFilesAndFolders);
  286. aSecurity.SetTranslateLocalGroups(m_bTranslateLocalGroups);
  287. aSecurity.SetTranslatePrinters(m_bTranslatePrinters);
  288. aSecurity.SetTranslateRegistry(m_bTranslateRegistry);
  289. aSecurity.SetTranslateShares(m_bTranslateShares);
  290. aSecurity.SetTranslateUserProfiles(m_bTranslateUserProfiles);
  291. aSecurity.SetTranslateUserRights(m_bTranslateUserRights);
  292. }