// ProfMig.cpp : Implementation of CExtendProfileMigration #include "stdafx.h" #import "\bin\McsVarSetMin.tlb" no_namespace #include "ProfExt.h" #include "ProfMig.h" #include "TReg.hpp" #include "ErrDct.hpp" #define LEN_Path 255 TErrorDct err; TError& errCommon = err; ///////////////////////////////////////////////////////////////////////////// // CExtendProfileMigration STDMETHODIMP CExtendProfileMigration::GetRequiredFiles(SAFEARRAY **pArray) { SAFEARRAYBOUND bound[1] = { 1, 0 }; LONG ndx[1] = { 0 }; (*pArray) = SafeArrayCreate(VT_BSTR,1,bound); SafeArrayPutElement(*pArray,ndx,SysAllocString(L"ProfExt.DLL")); return S_OK; } STDMETHODIMP CExtendProfileMigration::GetRegisterableFiles(SAFEARRAY **pArray) { SAFEARRAYBOUND bound[1] = { 1, 0 }; LONG ndx[1] = { 0 }; (*pArray) = SafeArrayCreate(VT_BSTR,1,bound); SafeArrayPutElement(*pArray,ndx,SysAllocString(L"ProfExt.DLL")); return S_OK; } STDMETHODIMP CExtendProfileMigration::UpdateProfile(IUnknown *pVarSet) { HRESULT hr = S_OK; _variant_t varSourceSam; _variant_t varSourceDom; _variant_t varRegKey; IVarSetPtr pVs = pVarSet; varSourceSam = pVs->get(L"Account.SourceSam"); varSourceDom = pVs->get(L"SourceDomain"); varRegKey = pVs->get(L"Profile.RegKey"); hr = UpdateMappedDrives( V_BSTR(&varSourceSam), V_BSTR(&varSourceDom), V_BSTR(&varRegKey) ); return hr; } // UpdateMappedDrives : This function looks in the Network key to find all the mapped drives and for the drives that have // sourceDomain\sourceAccount as the user account we set it to "". HRESULT CExtendProfileMigration::UpdateMappedDrives(BSTR sSourceSam, BSTR sSourceDomain, BSTR sRegistryKey) { TRegKey reg; TRegKey regDrive; DWORD rc = 0; WCHAR netKey[LEN_Path]; int len = LEN_Path; int ndx = 0; HRESULT hr = S_OK; WCHAR sValue[LEN_Path]; WCHAR sAcct[LEN_Path]; WCHAR keyname[LEN_Path]; // Build the account name string that we need to check for wsprintf(sAcct, L"%s\\%s", (WCHAR*) sSourceDomain, (WCHAR*) sSourceSam); // Get the path to the Network subkey for this users profile. wsprintf(netKey, L"%s\\%s", (WCHAR*) sRegistryKey, L"Network"); rc = reg.Open(netKey, HKEY_USERS); if ( !rc ) { while ( !reg.SubKeyEnum(ndx, keyname, len) ) { rc = regDrive.Open(keyname, reg.KeyGet()); if ( !rc ) { // Get the user name value that we need to check. rc = regDrive.ValueGetStr(L"UserName", sValue, LEN_Path); if ( !rc ) { if ( !wcsicmp(sAcct, sValue) ) { // Found this account name in the mapped drive user name.so we will set the key to "" regDrive.ValueSetStr(L"UserName", L""); } } else hr = HRESULT_FROM_WIN32(GetLastError()); } else hr = HRESULT_FROM_WIN32(GetLastError()); ndx++; } reg.Close(); } else hr = HRESULT_FROM_WIN32(GetLastError()); return hr; }