Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

106 lines
3.4 KiB

// 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;
}