#include "stdafx.h" #include "GuiUtils.h" #include "TxtSid.h" #include "LSAUtils.h" #include "ErrDct.hpp" #include #include // LDAP_MATCHING_RULE_BIT_AND_W #include #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif typedef UINT (CALLBACK* DSBINDFUNC)(TCHAR*, TCHAR*, HANDLE*); typedef UINT (CALLBACK* DSUNBINDFUNC)(HANDLE*); typedef NTDSAPI DWORD WINAPI DSCRACKNAMES( HANDLE hDS, // in DS_NAME_FLAGS flags, // in DS_NAME_FORMAT formatOffered, // in DS_NAME_FORMAT formatDesired, // in DWORD cNames, // in const LPCWSTR *rpNames, // in PDS_NAME_RESULTW *ppResult); // out typedef NTDSAPI void WINAPI DSFREENAMERESULT( DS_NAME_RESULTW *pResult ); #ifndef IADsPtr _COM_SMARTPTR_TYPEDEF(IADs, IID_IADs); #endif #ifndef IADsUserPtr _COM_SMARTPTR_TYPEDEF(IADsUser, IID_IADsUser); #endif #ifndef IADsContainerPtr _COM_SMARTPTR_TYPEDEF(IADsContainer, IID_IADsContainer); #endif BOOL CanSkipVerification() { DWORD rc = 0; BOOL bFound = FALSE; TRegKey key; DWORD val = 0; rc = key.OpenRead(GET_STRING(IDS_HKLM_DomainAdmin_Key),HKEY_LOCAL_MACHINE); if (! rc ) { rc = key.ValueGetDWORD(L"SkipGUIValidation",&val); if ( ! rc && ( val != 0 ) ) { bFound = TRUE; } } return !bFound; } BOOL // ret - TRUE if directory found GetDirectory( WCHAR * filename // out - string buffer to store directory name ) { DWORD rc = 0; BOOL bFound = FALSE; TRegKey key; rc = key.OpenRead(GET_STRING(IDS_HKLM_DomainAdmin_Key),HKEY_LOCAL_MACHINE); if ( ! rc ) { rc = key.ValueGetStr(L"Directory",filename,MAX_PATH); if ( ! rc ) { if ( *filename ) bFound = TRUE; } } return bFound; } void OnTOGGLE() { int nItem; CString c,computer,account,service; // POSITION pos = m_serviceBox.GetFirstSelectedItemPosition(); CString skip,include; skip.LoadString(IDS_SKIP); include.LoadString(IDS_INCLUDE); // while (pos) // { // nItem = m_serviceBox.GetNextSelectedItem(pos); nItem = m_serviceBox.GetNextItem(-1, LVNI_SELECTED);//PRT while (nItem != -1)//PRT { computer = m_serviceBox.GetItemText(nItem,0); service = m_serviceBox.GetItemText(nItem,1); account = m_serviceBox.GetItemText(nItem,2); c = m_serviceBox.GetItemText(nItem,3); if (c==skip) { c = include; // db->SetServiceAcctEntryStatus(_bstr_t(computer), _bstr_t(service), _bstr_t(account),SvcAcctStatus_NotMigratedYet); } else if (c== include) { c = skip; // db->SetServiceAcctEntryStatus(_bstr_t(computer), _bstr_t(service), _bstr_t(account), SvcAcctStatus_DoNotUpdate); } SetItemText(m_serviceBox,nItem,3,c); nItem = m_serviceBox.GetNextItem(nItem, LVNI_SELECTED);//PRT } } void OnRetryToggle() { int nItem; CString c; // POSITION pos = m_cancelBox.GetFirstSelectedItemPosition(); CString skip,include; skip.LoadString(IDS_SKIP); include.LoadString(IDS_INCLUDE); // while (pos) // { // nItem = m_cancelBox.GetNextSelectedItem(pos); nItem = m_cancelBox.GetNextItem(-1, LVNI_SELECTED);//PRT while (nItem != -1)//PRT { c = m_cancelBox.GetItemText(nItem,5); if (c== skip) { c = include; } else if (c== include) { c = skip; } SetItemText(m_cancelBox,nItem,5,c); nItem = m_cancelBox.GetNextItem(nItem, LVNI_SELECTED);//PRT } } void OnUPDATE(HWND hwndDlg) { ISvcMgrPtr svcMgr; HRESULT hr = svcMgr.CreateInstance(CLSID_ServMigr); int nItem; CString updated,updatefailed; updated.LoadString(IDS_UPDATED);updatefailed.LoadString(IDS_UPDATEFAILED); CString computer,service,account,status; // POSITION pos = m_serviceBox.GetFirstSelectedItemPosition(); // while (pos) // { // nItem = m_serviceBox.GetNextSelectedItem(pos); nItem = m_serviceBox.GetNextItem(-1, LVNI_SELECTED);//PRT while (nItem != -1)//PRT { status = m_serviceBox.GetItemText(nItem,3); if (status == updatefailed) { computer = m_serviceBox.GetItemText(nItem,0); account= m_serviceBox.GetItemText(nItem,2); service = m_serviceBox.GetItemText(nItem,1); hr = svcMgr->raw_TryUpdateSam(_bstr_t(computer),_bstr_t(service),_bstr_t(account)); if (! SUCCEEDED(hr)) { db->SetServiceAcctEntryStatus(_bstr_t(computer), _bstr_t(service), _bstr_t(account), SvcAcctStatus_UpdateFailed); SetItemText(m_serviceBox,nItem,3,updatefailed); ErrorWrapper(hwndDlg,hr); } else { db->SetServiceAcctEntryStatus(_bstr_t(computer), _bstr_t(service), _bstr_t(account), SvcAcctStatus_Updated); SetItemText(m_serviceBox,nItem,3,updated); } } nItem = m_serviceBox.GetNextItem(nItem, LVNI_SELECTED);//PRT } } DWORD VerifyPassword(WCHAR * sUserName, WCHAR * sPassword, WCHAR * sDomain) { CWaitCursor wait; DWORD retVal = 0; CString strDomainUserName; CString localIPC; WCHAR localMachine[MAX_PATH]; WCHAR * computer = NULL; DWORD len = DIM(localMachine); NETRESOURCE nr; CString error=L"no error"; USER_INFO_3 * pInfo = NULL; NET_API_STATUS rc; memset(&nr,0,(sizeof nr)); if ( ! gbNeedToVerify ) return 0; /* see if this domain exists and get a DC name */ //get the domain controller name if (!GetDomainDCName(sDomain,&computer)) return ERROR_LOGON_FAILURE; /* see if this user is a member of the given domain */ rc = NetUserGetInfo(computer, sUserName, 3, (LPBYTE *)&pInfo); NetApiBufferFree(computer); if (rc != NERR_Success) return ERROR_LOGON_FAILURE; NetApiBufferFree(pInfo); /* see if the password allows us to connect to a local resource */ strDomainUserName.Format(L"%s\\%s",sDomain,sUserName); // get the name of the local machine if ( GetComputerName(localMachine,&len) ) { localIPC.Format(L"\\\\%s",localMachine); nr.dwType = RESOURCETYPE_ANY; nr.lpRemoteName = localIPC.GetBuffer(0); retVal = WNetAddConnection2(&nr,sPassword,strDomainUserName,0); error.Format(L"WNetAddConnection returned%u",retVal); if ( ! retVal ) { error.Format(L"WNetAddConnection2 succeeded"); retVal = WNetCancelConnection2(localIPC.GetBuffer(0),0,TRUE); if ( retVal ) retVal = 0; } else if ( retVal == ERROR_SESSION_CREDENTIAL_CONFLICT ) { // skip the password check in this case retVal = 0; } } else { retVal = GetLastError(); } return retVal; } void activateTrustButton(HWND hwndDlg) { // int i = m_trustBox.GetSelectionMark(); int i = m_trustBox.GetNextItem(-1, LVNI_SELECTED);//PRT CString c; if (i==-1) { disable(hwndDlg,IDC_MIGRATE) ; return; } else if ((c = m_trustBox.GetItemText(i,3)) == (WCHAR const *) yes) { disable(hwndDlg,IDC_MIGRATE) ; return; } enable(hwndDlg,IDC_MIGRATE); } void activateServiceButtons(HWND hwndDlg) { int nItem; CString checker; bool enableUpdate=false; bool enableToggle=false; CString skip,include,updated,updatefailed; skip.LoadString(IDS_SKIP); include.LoadString(IDS_INCLUDE); updated.LoadString(IDS_UPDATED);updatefailed.LoadString(IDS_UPDATEFAILED); // POSITION pos = m_serviceBox.GetFirstSelectedItemPosition(); // while (pos) // { // nItem = m_serviceBox.GetNextSelectedItem(pos); nItem = m_serviceBox.GetNextItem(-1, LVNI_SELECTED);//PRT while (nItem != -1)//PRT { checker = m_serviceBox.GetItemText(nItem,3); enableToggle = enableToggle || (checker==skip|| checker==include); enableUpdate = enableUpdate || (checker==updatefailed); nItem = m_serviceBox.GetNextItem(nItem, LVNI_SELECTED);//PRT } enableToggle ? enable(hwndDlg,IDC_TOGGLE) : disable(hwndDlg,IDC_TOGGLE); enableUpdate ? enable(hwndDlg,IDC_UPDATE) : disable(hwndDlg,IDC_UPDATE); } void activateServiceButtons2(HWND hwndDlg) { int nItem; CString checker; bool enableToggle=false; CString skip,include; skip.LoadString(IDS_SKIP); include.LoadString(IDS_INCLUDE); // POSITION pos = m_serviceBox.GetFirstSelectedItemPosition(); // while (pos) // { // nItem = m_serviceBox.GetNextSelectedItem(pos); nItem = m_serviceBox.GetNextItem(-1, LVNI_SELECTED);//PRT while (nItem != -1)//PRT { checker = m_serviceBox.GetItemText(nItem,3); enableToggle = enableToggle || (checker==skip || checker==include); nItem = m_serviceBox.GetNextItem(nItem, LVNI_SELECTED);//PRT } enableToggle ? enable(hwndDlg,IDC_TOGGLE) : disable(hwndDlg,IDC_TOGGLE); } void removeService(CString name) { name = name.Right((name.GetLength()-name.ReverseFind(L'\\')) -1); name.TrimLeft();name.TrimRight(); _bstr_t text=get(DCTVS_Accounts_NumItems); CString base,base2,tocompare; int count = _ttoi((WCHAR * const) text); for (int i=0;iget(_bstr_t(base)); tocompare = (WCHAR * const) text; tocompare.TrimLeft();tocompare.TrimRight(); if (!name.CompareNoCase(tocompare)) { count--; base.Format(L"Accounts.%d",count); base2.Format(L"Accounts.%d",i); pVarSet->put(_bstr_t(base2),pVarSet->get(_bstr_t(base))); pVarSet->put(_bstr_t(base2+L".Name"),pVarSet->get(_bstr_t(base+L".Name"))); pVarSet->put(_bstr_t(base2+L".Type"),pVarSet->get(_bstr_t(base+L".Type"))); pVarSet->put(_bstr_t(base2+L".TargetName"),pVarSet->get(_bstr_t(base+L".TargetName"))); pVarSet->put(_bstr_t(base),L""); pVarSet->put(_bstr_t(base+L".Name"),L""); pVarSet->put(_bstr_t(base+L".Type"),L""); pVarSet->put(_bstr_t(base+L".TargetName"),L""); put(DCTVS_Accounts_NumItems,(long) count); return; } } } void setDBStatusSkip() { CString computer,account,service; for (int i=0;iSetServiceAcctEntryStatus(_bstr_t(computer), _bstr_t(service), _bstr_t(account),SvcAcctStatus_DoNotUpdate); removeService(account); } } bool setDBStatusInclude(HWND hwndDlg) { CString c,computer,account,service; CString skip,include; skip.LoadString(IDS_SKIP); include.LoadString(IDS_INCLUDE); bool messageDisplayed=false; for (int i=0;iSetServiceAcctEntryStatus(_bstr_t(computer), _bstr_t(service), _bstr_t(account),SvcAcctStatus_DoNotUpdate); } else if (c==include) { messageDisplayed=true; db->SetServiceAcctEntryStatus(_bstr_t(computer), _bstr_t(service), _bstr_t(account), SvcAcctStatus_NotMigratedYet); } } return messageDisplayed; } void getService() { IUnknown * pUnk; CString skip,include,updated,updatefailed,cannotMigrate; skip.LoadString(IDS_SKIP); include.LoadString(IDS_INCLUDE); updated.LoadString(IDS_UPDATED); updatefailed.LoadString(IDS_UPDATEFAILED); cannotMigrate.LoadString(IDS_CANNOT); m_serviceBox.DeleteAllItems(); if (migration!=w_account) { pVarSetService->QueryInterface(IID_IUnknown, (void**) &pUnk); db->GetServiceAccount(L"",&pUnk); pUnk->Release(); } // pVarSetService is now containing all service acct information. _bstr_t text; text = pVarSetService->get(L"ServiceAccountEntries"); int numItems=_ttoi((WCHAR const *)text); CString toLoad,temp; toLoad = (WCHAR const *)text; for (int i = 0; i< numItems;i++) { toLoad.Format(L"Computer.%d",i); text = pVarSetService->get(_bstr_t(toLoad)); m_serviceBox.InsertItem(0,(WCHAR const *)text); toLoad.Format(L"Service.%d",i); text = pVarSetService->get(_bstr_t(toLoad)); SetItemText(m_serviceBox,0,1,(WCHAR const *)text); toLoad.Format(L"ServiceAccount.%d",i); text = pVarSetService->get(_bstr_t(toLoad)); SetItemText(m_serviceBox,0,2,(WCHAR const *)text); toLoad.Format(L"ServiceAccountStatus.%d",i); text = pVarSetService->get(_bstr_t(toLoad)); if (!UStrCmp(text,L"0")) temp = include; else if (!UStrCmp(text,L"1")) temp = skip; else if (!UStrCmp(text,L"4")) temp = updatefailed; else if (!UStrCmp(text,L"2")) temp = updated; else if (!UStrCmp(text,L"8")) temp = cannotMigrate; else temp =L"~"; SetItemText(m_serviceBox,0,3,temp); //new toLoad.Format(L"ServiceDisplayName.%d",i); text = pVarSetService->get(_bstr_t(toLoad)); SetItemText(m_serviceBox,0,4,(WCHAR const *)text); } } void refreshDB(HWND hwndDlg) { _variant_t varX = L"{9CC87460-461D-11D3-99F3-0010A4F77383}"; pVarSet->put(L"PlugIn.0",varX); IPerformMigrationTaskPtr w; IUnknown * pUnk = NULL; HRESULT hr = w.CreateInstance(CLSID_Migrator); pVarSet->QueryInterface(IID_IUnknown,(void**)&pUnk); try { w->PerformMigrationTask(pUnk,(LONG_PTR)hwndDlg); } catch (const _com_error &e) { if (e.Error() == MIGRATOR_E_PROCESSES_STILL_RUNNING) { CString str; str.LoadString(IDS_ADMT_PROCESSES_STILL_RUNNING); ::AfxMessageBox(str); } else { ::AfxMessageBox(e.ErrorMessage()); } } pUnk->Release(); varX = L""; pVarSet->put(L"PlugIn.0",varX); } void initnoncollisionrename(HWND hwndDlg) { _bstr_t pre; _bstr_t suf; pre = get(DCTVS_Options_Prefix); suf = get(DCTVS_Options_Suffix); if (UStrICmp(pre,L"")) { CheckRadioButton(hwndDlg,IDC_RADIO_NONE,IDC_RADIO_PRE,IDC_RADIO_PRE); enable(hwndDlg,IDC_PRE); disable(hwndDlg,IDC_SUF); } else if (UStrICmp(suf,L"")) { CheckRadioButton(hwndDlg,IDC_RADIO_NONE,IDC_RADIO_SUF,IDC_RADIO_SUF); enable(hwndDlg,IDC_SUF); disable(hwndDlg,IDC_PRE); } else { CheckRadioButton(hwndDlg,IDC_RADIO_NONE,IDC_RADIO_SUF,IDC_RADIO_NONE); disable(hwndDlg,IDC_SUF); disable(hwndDlg,IDC_PRE); } initeditbox(hwndDlg,IDC_PRE,DCTVS_Options_Prefix); initeditbox(hwndDlg,IDC_SUF,DCTVS_Options_Suffix); } bool noncollisionrename(HWND hwndDlg) { CString P; CString S; if (IsDlgButtonChecked(hwndDlg,IDC_RADIO_SUF)) { if (!validString(hwndDlg,IDC_SUF)) return false; if (IsDlgItemEmpty(hwndDlg,IDC_SUF)) return false; GetDlgItemText(hwndDlg,IDC_SUF,S.GetBuffer(1000),1000); S.ReleaseBuffer(); P=L""; } else if (IsDlgButtonChecked(hwndDlg,IDC_RADIO_PRE)) { if (!validString(hwndDlg,IDC_PRE)) return false; if (IsDlgItemEmpty(hwndDlg,IDC_PRE)) return false; GetDlgItemText(hwndDlg,IDC_PRE,P.GetBuffer(1000),1000); P.ReleaseBuffer(); S=L""; } else { P=L""; S=L""; } if (P.GetLength() > 8 || S.GetLength() >8) return false; put(DCTVS_Options_Prefix,_bstr_t(P)); put(DCTVS_Options_Suffix,_bstr_t(S)); return true; } bool tooManyChars(HWND hwndDlg,int id) { _bstr_t text; CString temp; _variant_t varX; int i; GetDlgItemText( hwndDlg, id, temp.GetBuffer(1000),1000); temp.ReleaseBuffer(); i=temp.GetLength(); text = get(DCTVS_Options_Prefix); temp=(WCHAR const *) text; i+= temp.GetLength(); text = get(DCTVS_Options_Suffix); temp=(WCHAR const *) text; i+= temp.GetLength(); return (i>8); } bool someServiceAccounts(int accounts,HWND hwndDlg) { CWaitCursor c; if (migration==w_group) return false; IVarSetPtr pVarSetMerge(__uuidof(VarSet)); IUnknown * pUnk; int count=0; pVarSetMerge->QueryInterface(IID_IUnknown, (void**) &pUnk); _bstr_t nameToCheck,text; CString parameterToCheck; bool some= false; pVarSetService->Clear(); for (int i = 0;iClear(); parameterToCheck.Format(L"Accounts.%d",i); nameToCheck = pVarSet->get(_bstr_t(parameterToCheck)); // Get the DOMAIN\Account form of the name WCHAR domAcct[500]; WCHAR domAcctUPN[5000]; domAcct[0] = 0; if ( ! wcsncmp(nameToCheck,L"WinNT://",UStrLen(L"WinNT://")) ) { // the name is in the format: WinNT://DOMAIN/Account safecopy(domAcct,((WCHAR*)nameToCheck)+UStrLen(L"WinNT://")); // convert the / to a \ . WCHAR * slash = wcschr(domAcct,L'/'); if ( slash ) { (*slash) = L'\\'; } } else { // this is the LDAP form of the name. IADsUserPtr pUser; HRESULT hr = ADsGetObject(nameToCheck,IID_IADsUser,(void**)&pUser); if ( SUCCEEDED(hr) ) { VARIANT v; VariantInit(&v); hr = pUser->Get(_bstr_t(L"sAMAccountName"),&v); if ( SUCCEEDED(hr) ) { if ( v.vt == VT_BSTR ) { // we got the account name! swprintf(domAcct,L"%ls\\%ls",sourceNetbios,(WCHAR*)v.bstrVal); } VariantClear(&v); } } else { CString toload,title;toload.LoadString(IDS_MSG_SA_FAILED); title.LoadString(IDS_MSG_ERROR); MessageBox(hwndDlg,toload,title,MB_OK|MB_ICONSTOP); return false; } } if ( *domAcct ) // if we weren't able to get the account name, just skip the DB check { HRESULT hr=db->raw_GetServiceAccount(domAcct,&pUnk); if (FAILED(hr)) { CString toload,title;toload.LoadString(IDS_MSG_SA_FAILED); title.LoadString(IDS_MSG_ERROR); MessageBox(hwndDlg,toload,title,MB_OK|MB_ICONSTOP); return false; } text = pVarSetMerge->get(L"ServiceAccountEntries"); //adding code to handle service accounts in the database that //may be listed by their UPN name if ((!UStrCmp(text,L"0")) || (!UStrCmp(text,L""))) { PDS_NAME_RESULT pNamesOut = NULL; WCHAR * pNamesIn[1]; HINSTANCE hLibrary = NULL; DSCRACKNAMES * DsCrackNames = NULL; DSFREENAMERESULT * DsFreeNameResult = NULL; DSBINDFUNC DsBind = NULL; DSUNBINDFUNC DsUnBind = NULL; HANDLE hDs = NULL; pNamesIn[0] = (WCHAR*)domAcct; hLibrary = LoadLibrary(L"NTDSAPI.DLL"); if ( hLibrary ) { DsBind = (DSBINDFUNC)GetProcAddress(hLibrary,"DsBindW"); DsUnBind = (DSUNBINDFUNC)GetProcAddress(hLibrary,"DsUnBindW"); DsCrackNames = (DSCRACKNAMES *)GetProcAddress(hLibrary,"DsCrackNamesW"); DsFreeNameResult = (DSFREENAMERESULT *)GetProcAddress(hLibrary,"DsFreeNameResultW"); } if ( DsBind && DsUnBind && DsCrackNames && DsFreeNameResult) { //bind to that source domain hr = (*DsBind)(NULL,sourceDNS.GetBuffer(1000),&hDs); sourceDNS.ReleaseBuffer(); if ( !hr ) { //get UPN name of this account from DSCrackNames hr = (*DsCrackNames)(hDs,DS_NAME_NO_FLAGS,DS_NT4_ACCOUNT_NAME,DS_USER_PRINCIPAL_NAME,1,pNamesIn,&pNamesOut); if ( !hr ) { //if got the UPN name, retry DB query for that account in the //service account database if ( pNamesOut->rItems[0].status == DS_NAME_NO_ERROR ) { wcscpy(domAcctUPN, pNamesOut->rItems[0].pName); //see if account in database by its UPN name hr=db->raw_GetServiceAccount(domAcctUPN,&pUnk); if (!SUCCEEDED (hr)) { CString toload,title;toload.LoadString(IDS_MSG_SA_FAILED); title.LoadString(IDS_MSG_ERROR); MessageBox(hwndDlg,toload,title,MB_OK|MB_ICONSTOP); return false; } text = pVarSetMerge->get(L"ServiceAccountEntries"); } (*DsFreeNameResult)(pNamesOut); } (*DsUnBind)(&hDs); } } if ( hLibrary ) { FreeLibrary(hLibrary); } } if (UStrCmp(text,L"0") && UStrCmp(text,L"")) { int number=_ttoi((WCHAR * const) text); CString base,loader; _bstr_t text; for (int i=0;iget(_bstr_t(base)); loader.Format(L"Computer.%d",count); pVarSetService->put(_bstr_t(loader),text); base.Format(L"Service.%d",i); text= pVarSetMerge->get(_bstr_t(base)); loader.Format(L"Service.%d",count); pVarSetService->put(_bstr_t(loader),text); base.Format(L"ServiceAccount.%d",i); text= pVarSetMerge->get(_bstr_t(base)); //store the sAMAccountName in the varset and database rather //than the UPN name wcscpy((WCHAR*)text, domAcct); loader.Format(L"ServiceAccount.%d",count); pVarSetService->put(_bstr_t(loader),text); base.Format(L"ServiceAccountStatus.%d",i); text= pVarSetMerge->get(_bstr_t(base)); loader.Format(L"ServiceAccountStatus.%d",count); pVarSetService->put(_bstr_t(loader),text); base.Format(L"ServiceDisplayName.%d",i); text= pVarSetMerge->get(_bstr_t(base)); loader.Format(L"ServiceDisplayName.%d",count); pVarSetService->put(_bstr_t(loader),text); count++; pVarSetService->put(L"ServiceAccountEntries",(long) count); } } } } pUnk->Release(); return some; } CString timeToCString(int varsetKey) { _bstr_t text; time_t t; CString s; CString t2; text = pVarSet->get(GET_BSTR(varsetKey)); t2 = (WCHAR * ) text; t2.TrimLeft();t2.TrimRight(); if ((t2.IsEmpty() != FALSE) || (!t2.CompareNoCase(L"0"))) { s.LoadString(IDS_NOT_CREATED); } else { //* t = _ttoi((WCHAR const *)text); //* CTime T(t); //* s = T.Format( "%c" ); t = _ttoi((WCHAR const *)text); SYSTEMTIME stime; CTime ctime; ctime = t; stime.wYear = (WORD) ctime.GetYear(); stime.wMonth = (WORD) ctime.GetMonth(); stime.wDayOfWeek = (WORD) ctime.GetDayOfWeek(); stime.wDay = (WORD) ctime.GetDay(); stime.wHour = (WORD) ctime.GetHour(); stime.wMinute = (WORD) ctime.GetMinute(); stime.wSecond = (WORD) ctime.GetSecond(); stime.wMilliseconds = 0; //* if ( ctime.GetAsSystemTime(stime) ) //* { CString t1; CString t2; GetTimeFormat(LOCALE_USER_DEFAULT,0,&stime,NULL,t1.GetBuffer(500),500); GetDateFormat(LOCALE_USER_DEFAULT,0,&stime,NULL,t2.GetBuffer(500),500); t1.ReleaseBuffer(); t2.ReleaseBuffer(); s = t2 + " " + t1; //* } } return s; } _variant_t get(int i) { return pVarSet->get(GET_BSTR(i)); } void put(int i,_variant_t v) { pVarSet->put(GET_BSTR(i),v); } void getReporting() { _bstr_t temp; CString c; c.LoadString(IDS_COLUMN_NAMECONFLICTS); m_reportingBox.InsertItem(0,c); SetItemText(m_reportingBox,0, 1, timeToCString(DCTVS_Reports_NameConflicts_TimeGenerated)); c.LoadString(IDS_COLUMN_ACCOUNTREFERENCES); m_reportingBox.InsertItem(0,c); SetItemText(m_reportingBox,0, 1, timeToCString(DCTVS_Reports_AccountReferences_TimeGenerated)); c.LoadString(IDS_COLUMN_EXPIREDCOMPUTERS); m_reportingBox.InsertItem(0,c); SetItemText(m_reportingBox,0, 1, timeToCString(DCTVS_Reports_ExpiredComputers_TimeGenerated)); c.LoadString(IDS_COLUMN_MIGRATEDCOMPUTERS); m_reportingBox.InsertItem(0,c); SetItemText(m_reportingBox,0, 1, timeToCString(DCTVS_Reports_MigratedComputers_TimeGenerated)); c.LoadString(IDS_COLUMN_MIGRATEDACCOUNTS); m_reportingBox.InsertItem(0,c); SetItemText(m_reportingBox,0, 1, timeToCString(DCTVS_Reports_MigratedAccounts_TimeGenerated)); } void putReporting() { _variant_t varX; int nItem; bool atleast1 =false; // POSITION pos = m_reportingBox.GetFirstSelectedItemPosition(); // while (pos) // { // atleast1 = true; // nItem = m_reportingBox.GetNextSelectedItem(pos); nItem = m_reportingBox.GetNextItem(-1, LVNI_SELECTED);//PRT while (nItem != -1)//PRT { atleast1 = true; SetCheck(m_reportingBox,nItem,false); nItem = m_reportingBox.GetNextItem(nItem, LVNI_SELECTED);//PRT } varX = (!GetCheck(m_reportingBox,0)) ? yes : no; put(DCTVS_Reports_MigratedAccounts,varX); varX = (!GetCheck(m_reportingBox,1)) ? yes : no; put(DCTVS_Reports_MigratedComputers,varX); varX = (!GetCheck(m_reportingBox,2)) ? yes : no; put(DCTVS_Reports_ExpiredComputers,varX); varX = (!GetCheck(m_reportingBox,3)) ? yes : no; put(DCTVS_Reports_AccountReferences,varX); varX = (!GetCheck(m_reportingBox,4)) ? yes : no; put(DCTVS_Reports_NameConflicts,varX); varX = atleast1 ? yes : no; put(DCTVS_Reports_Generate,varX); for (int i = 0; i< m_reportingBox.GetItemCount();i++) SetCheck(m_reportingBox,i,true); } void populateReportingTime() { _variant_t varX; _bstr_t text; CString temp; time_t ltime; time(<ime); temp.Format(L"%d",ltime); varX = temp; if (!UStrICmp((text = get(DCTVS_Reports_MigratedAccounts)),(WCHAR const *) yes)) put(DCTVS_Reports_MigratedAccounts_TimeGenerated,varX); if (!UStrICmp((text = get(DCTVS_Reports_MigratedComputers)),(WCHAR const *) yes)) put(DCTVS_Reports_MigratedComputers_TimeGenerated,varX); if (!UStrICmp((text = get(DCTVS_Reports_ExpiredComputers)),(WCHAR const *) yes)) put(DCTVS_Reports_ExpiredComputers_TimeGenerated,varX); if (!UStrICmp((text = get(DCTVS_Reports_AccountReferences)),(WCHAR const *) yes)) put(DCTVS_Reports_AccountReferences_TimeGenerated,varX); if (!UStrICmp((text = get(DCTVS_Reports_NameConflicts)),(WCHAR const *) yes)) put(DCTVS_Reports_NameConflicts_TimeGenerated,varX); } void getFailed(HWND hwndDlg) { IVarSetPtr pVarSetFailed(__uuidof(VarSet)); IUnknown * pUnk; pVarSetFailed->QueryInterface(IID_IUnknown, (void**) &pUnk); HRESULT hr = db->GetFailedDistributedActions(-1, &pUnk); pUnk->Release(); if (FAILED(hr)) MessageBoxWrapper(hwndDlg,IDS_MSG_FAILED,IDS_MSG_ERROR); else { CString toLoad; CString holder; _bstr_t text; CString skip; skip.LoadString(IDS_SKIP); int i=0; _bstr_t numItemsText = pVarSetFailed->get(L"DA"); CString jobHelper; if (UStrCmp(numItemsText,L"0") && UStrCmp(numItemsText,L"")) { int numItems = _ttoi( (WCHAR const *) numItemsText); while (iget(_bstr_t(toLoad)); m_cancelBox.InsertItem(0,(WCHAR const *)text); toLoad = holder + L".JobFile"; text = pVarSetFailed->get(_bstr_t(toLoad)); SetItemText(m_cancelBox,0,1,(WCHAR const *)text); JobFileGetActionText((WCHAR * const) text,jobHelper); SetItemText(m_cancelBox,0,3,jobHelper); toLoad = holder + L".StatusText"; text = pVarSetFailed->get(_bstr_t(toLoad)); SetItemText(m_cancelBox,0,2,(WCHAR const *)text); toLoad = holder + L".ActionID"; text = pVarSetFailed->get(_bstr_t(toLoad)); SetItemText(m_cancelBox,0,4,(WCHAR const *)text); SetItemText(m_cancelBox,0,5,skip); i++; } } } } void handleCancel(HWND hwndDlg) { int nItem; HRESULT hr=S_OK; long lActionID; CString computer; CString actionID; // POSITION pos = m_cancelBox.GetFirstSelectedItemPosition(); // while (pos) // { // nItem = m_cancelBox.GetNextSelectedItem(pos); nItem = m_cancelBox.GetNextItem(-1, LVNI_SELECTED);//PRT while (nItem != -1)//PRT { SetCheck(m_cancelBox,nItem,false); nItem = m_cancelBox.GetNextItem(nItem, LVNI_SELECTED);//PRT } for (int i=(m_cancelBox.GetItemCount()-1);i>=0;i--) { if (!GetCheck(m_cancelBox,i)) { computer = m_cancelBox.GetItemText(i,0); actionID = m_cancelBox.GetItemText(i,4); lActionID = _ttol(actionID.GetBuffer(500)); actionID.ReleaseBuffer(); hr = db->CancelDistributedAction(lActionID, _bstr_t(computer)); if (FAILED(hr)) MessageBoxWrapper(hwndDlg,IDC_MSG_CANCEL,IDS_MSG_ERROR); else m_cancelBox.DeleteItem(i); } } } void OnRETRY() { int count =0; CString holder,c; _variant_t varX; CString include; include.LoadString(IDS_INCLUDE); for (int i=0;iput(_bstr_t(holder),_bstr_t(sName)); varX = m_cancelBox.GetItemText(i,1); holder = holder + L".JobFile"; pVarSet->put(_bstr_t(holder),varX); count++; } } holder = L"Servers.NumItems"; pVarSet->put(_bstr_t(holder),(long)count); } void JobFileGetActionText(WCHAR const * filename // in - job file name ,CString & text // in/out - text describing the action ) { // load the varset into a file // Read the varset data from the file IVarSetPtr pVarSet; IStorage * store = NULL; HRESULT hr; // Try to create the COM objects hr = pVarSet.CreateInstance(CLSID_VarSet); if ( SUCCEEDED(hr) ) { // Read the VarSet from the data file hr = StgOpenStorage(filename,NULL,STGM_DIRECT | STGM_READ | STGM_SHARE_EXCLUSIVE,NULL,0,&store); if ( SUCCEEDED(hr) ) { // Load the data into a new varset hr = OleLoad(store,IID_IUnknown,NULL,(void **)&pVarSet); if ( SUCCEEDED(hr) ) { _bstr_t wizard = pVarSet->get(GET_BSTR(DCTVS_Options_Wizard)); //* if ( !UStrICmp(wizard,(WCHAR const *) GET_BSTR1(IDS_WIZARD_COMPUTER) )) if ( !UStrICmp(wizard, L"computer")) { text = GET_CSTRING(IDS_MIGRATE_COMPUTER); } //* else if ( !UStrICmp(wizard,(WCHAR const *)GET_BSTR1(IDS_WIZARD_SERVICE) )) else if ( !UStrICmp(wizard, L"service")) { text = GET_CSTRING(IDS_GATHER_SERVICEACCOUNT); } //* else if ( ! UStrICmp(wizard,(WCHAR const *)GET_BSTR1(IDS_WIZARD_SECURITY) )) else if ( ! UStrICmp(wizard, L"security")) { text = GET_CSTRING(IDS_TRANSLATE_SECURITY); } //* else if (! UStrICmp(wizard,(WCHAR const *) GET_BSTR1(IDS_WIZARD_REPORTING)) ) else if (! UStrICmp(wizard, L"reporting") ) { text = GET_CSTRING(IDS_GATHER_INFORMATION); } else { text = (WCHAR*)wizard; } } store->Release(); } } } _bstr_t GET_BSTR1(int id) { CString yo; yo.LoadString(id); return (LPCTSTR)yo; } void activateCancelIfNecessary(HWND hwndDlg) { // POSITION pos = m_cancelBox.GetFirstSelectedItemPosition(); // if (pos) int nItem = m_cancelBox.GetNextItem(-1, LVNI_SELECTED);//PRT if (nItem != -1)//PRT { enable(hwndDlg,IDC_CANCEL); enable(hwndDlg,IDC_TOGGLE); } else { disable(hwndDlg,IDC_CANCEL); disable(hwndDlg,IDC_TOGGLE); } } bool SomethingToRetry() { if (m_cancelBox.GetItemCount()==0) return false; int count =0; CString include; include.LoadString(IDS_INCLUDE); CString c; for (int i=0;iraw_GetPasswordPolicy(_bstr_t(targetDNS),&length); if ( !SUCCEEDED(hr) ) { ErrorWrapper2(hwndDlg,hr); } else { if (length>0) { base.Format(L"%lu",length); warning.LoadString(IDS_MSG_WARNING_LENGTH); base+=warning; title.LoadString(IDS_MSG_WARNING); MessageBox(hwndDlg,base,title,MB_OK|MB_ICONINFORMATION); } } } bool obtainTrustCredentials(HWND hwndDlg,int spot, CString & domain, CString & account, CString & password) { bool toreturn; CWnd yo; yo.Attach(hwndDlg); CTrusterDlg truster(&yo); truster.m_strDomain= m_trustBox.GetItemText(spot,0); truster.len = MAX_PATH; truster.m_strDomain= m_trustBox.GetItemText(spot,0); truster.DoModal(); toreturn = truster.toreturn; if ( toreturn ) { domain = truster.m_strDomain; account = truster.m_strUser; password = truster.m_strPassword; } yo.Detach(); return toreturn; } CString GET_CSTRING(int id) { CString c; c.LoadString(id); return c; } HRESULT MigrateTrusts(HWND hwndDlg,bool& atleast1succeeded) { ITrustPtr pTrusts; IUnknown * pUnk = NULL; // int i=m_trustBox.GetSelectionMark(); int i=m_trustBox.GetNextItem(-1, LVNI_SELECTED);//PRT CString trusted,trusting,direction; HRESULT hr = pTrusts.CreateInstance(CLSID_Trust); CString strDomain,strAccount,strPassword; atleast1succeeded=false; if ( SUCCEEDED(hr) ) { CWaitCursor s; direction = m_trustBox.GetItemText(i,1); direction.TrimLeft(); direction.TrimRight(); if (direction == GET_CSTRING(IDS_OUTBOUND)) { trusting = targetNetbios; trusted = m_trustBox.GetItemText(i,0); hr = pTrusts->raw_CreateTrust(_bstr_t(trusting),_bstr_t(trusted),FALSE); if (HRESULT_CODE(hr) == ERROR_ACCESS_DENIED) if (obtainTrustCredentials(hwndDlg,i,strDomain, strAccount, strPassword)) hr = pTrusts->raw_CreateTrustWithCreds(_bstr_t(trusting),_bstr_t(trusted), NULL,NULL,NULL,_bstr_t(strDomain),_bstr_t(strAccount), _bstr_t(strPassword),FALSE); } else if (direction == GET_CSTRING(IDS_INBOUND)) { trusting = m_trustBox.GetItemText(i,0); trusted = targetNetbios; hr = pTrusts->raw_CreateTrust(_bstr_t(trusting),_bstr_t(trusted),FALSE); if (HRESULT_CODE(hr) == ERROR_ACCESS_DENIED) if (obtainTrustCredentials(hwndDlg,i,strDomain, strAccount, strPassword)) hr = pTrusts->raw_CreateTrustWithCreds(_bstr_t(trusting),_bstr_t(trusted), _bstr_t(strDomain),_bstr_t(strAccount), _bstr_t(strPassword),NULL,NULL,NULL,FALSE); } else if (direction == GET_CSTRING(IDS_BIDIRECTIONAL)) { trusting = m_trustBox.GetItemText(i,0); trusted = targetNetbios; hr = pTrusts->raw_CreateTrust(_bstr_t(trusting),_bstr_t(trusted),TRUE); if (HRESULT_CODE(hr) == ERROR_ACCESS_DENIED) if (obtainTrustCredentials(hwndDlg,i,strDomain, strAccount, strPassword)) hr = pTrusts->raw_CreateTrustWithCreds(_bstr_t(trusting),_bstr_t(trusted), _bstr_t(strDomain),_bstr_t(strAccount), _bstr_t(strPassword),NULL,NULL,NULL,TRUE); } if (direction == GET_CSTRING(IDS_DISABLED)) { MessageBoxWrapper(hwndDlg,IDS_MSG_DISABLED_TRUST,IDS_MSG_ERROR); } else if (direction.IsEmpty() != FALSE) { MessageBoxWrapper(hwndDlg,IDS_MSG_DIRECTION_TRUST,IDS_MSG_ERROR); } else { if ( SUCCEEDED(hr) ) { // update the UI to reflect that the trust now exists m_trustBox.SetItemText(i,3,GET_BSTR(IDS_YES)); atleast1succeeded=true; } } } return hr; } void getTrust() { // get the trust relationship data ITrustPtr pTrusts; // CWaitCursor wait; HRESULT hr = pTrusts.CreateInstance(CLSID_Trust); if ( SUCCEEDED(hr) ) { IUnknown * pUnk = NULL; CString dirname; GetDirectory(dirname.GetBuffer(1000)); dirname.ReleaseBuffer(); dirname+= L"Logs\\trust.log"; hr = pTrusts->raw_QueryTrusts(_bstr_t(sourceNetbios),_bstr_t(targetNetbios),_bstr_t(dirname),&pUnk); if ( SUCCEEDED(hr) ) { IVarSetPtr pVsTrusts; pVsTrusts = pUnk; pUnk->Release(); long nTrusts = pVsTrusts->get(L"Trusts"); for ( long i = 0 ; i < nTrusts ; i++ ) { CString base; CString sub; base.Format(L"Trusts.%ld",i); _bstr_t value = pVsTrusts->get(_bstr_t(base)); m_trustBox.InsertItem(0,value); sub = base + L".Direction"; value = pVsTrusts->get(_bstr_t(sub)); SetItemText(m_trustBox,0,1,value); sub = base + L".Type"; value = pVsTrusts->get(_bstr_t(sub)); SetItemText(m_trustBox,0,2,value); sub = base + L".ExistsForTarget"; value = pVsTrusts->get(_bstr_t(sub)); SetItemText(m_trustBox,0,3,value); } } } } bool number(CString num) { if (num.GetLength()==0) return false; CString checker; checker.LoadString(IDS_VALID_DIGITS); for (int i=0;i THREE_YEARS || num < 1) return false; DWORD nDays = num; DWORD oneDay = 24 * 60 * 60; // number of seconds in 1 day time_t currentTime = time(NULL); time_t expireTime; expireTime = currentTime + nDays * oneDay; //expireTime-=currentTime%86400; t= expireTime; return true; } HRESULT GetHelpFileFullPath( BSTR *bstrHelp ) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); CString strPath, strName; HRESULT hr = S_OK; TCHAR szModule[2*_MAX_PATH]; DWORD dwReturn = 0; GetDirectory(szModule); strPath = szModule; strPath += _T("\\"); strName.LoadString(IDS_HELPFILE); strPath += strName; *bstrHelp = SysAllocString(LPCTSTR(strPath)); return hr; } void helpWrapper(HWND hwndDlg, int t) { CComBSTR bstrTopic; HRESULT hr = GetHelpFileFullPath( &bstrTopic); if ( SUCCEEDED(hr) ) { HWND h = HtmlHelp(hwndDlg, bstrTopic, HH_HELP_CONTEXT, t ); } else { CString r,e; r.LoadString(IDS_MSG_HELP); e.LoadString(IDS_MSG_ERROR); MessageBox(hwndDlg,r,e,MB_OK|MB_ICONSTOP); } } bool IsDlgItemEmpty(HWND hwndDlg, int id) { CString temp; GetDlgItemText( hwndDlg, id, temp.GetBuffer(1000),1000); temp.ReleaseBuffer(); temp.TrimLeft(); temp.TrimRight(); return (temp.IsEmpty()!= FALSE); } void calculateDate(HWND hwndDlg,CString s) { s.TrimLeft();s.TrimRight(); if (!number(s)) return; long nDays=_ttol((LPTSTR const) s.GetBuffer(1000)); s.ReleaseBuffer(); long oneDay = 24 * 60 * 60; // number of seconds in 1 day time_t currentTime = time(NULL); time_t expireTime; CTime ctime; SYSTEMTIME stime; CString strDate; expireTime = currentTime + nDays * oneDay; ctime = expireTime; stime.wYear = (WORD) ctime.GetYear(); stime.wMonth = (WORD) ctime.GetMonth(); stime.wDayOfWeek = (WORD) ctime.GetDayOfWeek(); stime.wDay = (WORD) ctime.GetDay(); stime.wHour = (WORD) ctime.GetHour(); stime.wMinute = (WORD) ctime.GetMinute(); stime.wSecond = (WORD) ctime.GetSecond(); stime.wMilliseconds = 0; GetDateFormat(LOCALE_USER_DEFAULT,0,&stime,NULL,strDate.GetBuffer(500),500); strDate.ReleaseBuffer(); SetDlgItemText(hwndDlg,IDC_DATE,strDate); } void ErrorWrapper(HWND hwndDlg,HRESULT returncode) { CString y,e,text,title; if (HRESULT_FACILITY(returncode)==FACILITY_WIN32) { returncode=HRESULT_CODE(returncode); err.ErrorCodeToText(returncode,1000,y.GetBuffer(1000)); y.ReleaseBuffer(); text.LoadString(IDS_MSG_ERRORBUF); e.Format(text,y,returncode); title.LoadString(IDS_MSG_ERROR); MessageBox(hwndDlg,e,title,MB_OK|MB_ICONSTOP); } else { err.ErrorCodeToText(returncode,1000,y.GetBuffer(1000)); y.ReleaseBuffer(); text.LoadString(IDS_MSG_ERRORBUF); // text.Replace(L"%u",L"%x"); int index = text.Find(L"%u"); //PRT text.SetAt(index+1, L'x'); //PRT e.Format(text,y,returncode); title.LoadString(IDS_MSG_ERROR); MessageBox(hwndDlg,e,title,MB_OK|MB_ICONSTOP); } } void ErrorWrapper2(HWND hwndDlg,HRESULT returncode) { CString y,e,text,title,message; if (HRESULT_FACILITY(returncode)==FACILITY_WIN32) { returncode=HRESULT_CODE(returncode); err.ErrorCodeToText(returncode,1000,y.GetBuffer(1000)); y.ReleaseBuffer(); message.LoadString(IDS_MSG_PASSWORD_POLICY); text.LoadString(IDS_MSG_ERRORBUF20); e.Format(text,message,y,returncode); title.LoadString(IDS_MSG_WARNING); MessageBox(hwndDlg,e,title,MB_OK|MB_ICONSTOP); } else { err.ErrorCodeToText(returncode,1000,y.GetBuffer(1000)); y.ReleaseBuffer(); message.LoadString(IDS_MSG_PASSWORD_POLICY); text.LoadString(IDS_MSG_ERRORBUF20); // text.Replace(L"%u",L"%x"); int index = text.Find(L"%u"); //PRT text.SetAt(index+1, L'x'); //PRT e.Format(text,message,y,returncode); title.LoadString(IDS_MSG_WARNING); MessageBox(hwndDlg,e,title,MB_OK|MB_ICONSTOP); } } void ErrorWrapper3(HWND hwndDlg,HRESULT returncode,CString domainName) { CString y,e,text,title,formatter; if (HRESULT_FACILITY(returncode)==FACILITY_WIN32) { returncode=HRESULT_CODE(returncode); err.ErrorCodeToText(returncode,1000,e.GetBuffer(1000)); e.ReleaseBuffer(); formatter.LoadString(IDS_MSG_ERRORBUF3); text.Format(formatter,e,returncode,domainName); title.LoadString(IDS_MSG_ERROR); MessageBox(hwndDlg,text,title,MB_OK|MB_ICONSTOP); } else { err.ErrorCodeToText(returncode,1000,e.GetBuffer(1000)); e.ReleaseBuffer(); formatter.LoadString(IDS_MSG_ERRORBUF3); // formatter.Replace(L"%u",L"%x"); int index = formatter.Find(L"%u"); //PRT formatter.SetAt(index+1, L'x'); //PRT text.Format(formatter,e,returncode,domainName); title.LoadString(IDS_MSG_ERROR); MessageBox(hwndDlg,text,title,MB_OK|MB_ICONSTOP); } } void ErrorWrapper4(HWND hwndDlg,HRESULT returncode,CString domainName) { CString y,e,text,title,formatter; if (HRESULT_FACILITY(returncode)==FACILITY_WIN32) { returncode=HRESULT_CODE(returncode); err.ErrorCodeToText(returncode,1000,e.GetBuffer(1000)); e.ReleaseBuffer(); formatter.LoadString(IDS_MSG_ERRORBUF2); text.Format(formatter,e,returncode,domainName); title.LoadString(IDS_MSG_ERROR); MessageBox(hwndDlg,text,title,MB_OK|MB_ICONSTOP); } else { err.ErrorCodeToText(returncode,1000,e.GetBuffer(1000)); e.ReleaseBuffer(); formatter.LoadString(IDS_MSG_ERRORBUF2); // formatter.Replace(L"%u",L"%x"); int index = formatter.Find(L"%u"); //PRT formatter.SetAt(index+1, L'x'); //PRT text.Format(formatter,e,returncode,domainName); title.LoadString(IDS_MSG_ERROR); MessageBox(hwndDlg,text,title,MB_OK|MB_ICONSTOP); } } bool validDir(CString str) { CFileFind finder; // build a string with wildcards str += _T("\\*.*"); // start working for files BOOL bWorking = finder.FindFile(str); if (bWorking==0) { finder.Close(); return false; } bWorking = finder.FindNextFile(); bool toreturn = (finder.IsDirectory()? true:false); //some root drives do not have the directory flag set, so convert to //the root path and use it if (!toreturn) { str = finder.GetRoot(); if (str.GetLength()) toreturn = true; } finder.Close(); return toreturn; } bool validDirectoryString(HWND hwndDlg,int id) { CString str; GetDlgItemText(hwndDlg,id,str.GetBuffer(1000),1000); str.ReleaseBuffer(); CString sResult = CreatePath(str); if (sResult.GetLength()) { SetDlgItemText(hwndDlg, id, (LPCTSTR)sResult); return true; } else return false; } bool validString(HWND hwndDlg,int id) { //characters with ASCII values 1-31 are not allowed in addition to //the characters in IDS_INVALID_STRING. ASCII characters, whose //value is 1-31, are hardcoded here since Visual C++ improperly //converts some of these // WCHAR InvalidDownLevelChars[] = //TEXT("\"/\\[]:|<>+=;,?,*") // TEXT("\001\002\003\004\005\006\007") // TEXT("\010\011\012\013\014\015\016\017") // TEXT("\020\021\022\023\024\025\026\027") // TEXT("\030\031\032\033\034\035\036\037"); bool bValid; CHAR ANSIStr[1000]; int numConverted; CString c; GetDlgItemText(hwndDlg,id,c.GetBuffer(1000),1000); c.ReleaseBuffer(); //we now use the validation function in the common library that we share //with the scripting code bValid = IsValidPrefixOrSuffix(c); /* CString check; CHAR ANSIStr[1000]; //* check.LoadString(IDS_VALID_STRING); check.LoadString(IDS_INVALID_STRING); //load viewable invalid characters if (c.GetLength() > 8) return false; for (int i=0;i1 //- 31, which cause problems in ADMT if (bValid) { numConverted = WideCharToMultiByte(CP_OEMCP, WC_COMPOSITECHECK, (LPCTSTR)c, -1, ANSIStr, 1000, NULL, NULL); if (numConverted) { WCHAR sUnicodeStr[1000]; UStrCpy(sUnicodeStr, ANSIStr); bValid = IsValidPrefixOrSuffix(sUnicodeStr); } } return bValid; } bool validReboot(HWND hwndDlg,int id) { const int REBOOT_MAX = 15; //MAX minutes before computer reboot on migration CString c; GetDlgItemText(hwndDlg,id,c.GetBuffer(1000),1000); c.ReleaseBuffer(); CString check; check.LoadString(IDS_VALID_REBOOT); for (int i=0;i= 0) && (num > REBOOT_MAX)) return false; return true; } bool findInVarSet(HWND hwndDlg,int id, BSTR bstr) { _bstr_t text; CString temp; _variant_t varX; GetDlgItemText( hwndDlg, id, temp.GetBuffer(1000),1000); temp.ReleaseBuffer(); text = pVarSet->get(bstr); return (!UStrICmp(temp.GetBuffer(1000),(WCHAR * const) text) ? true : false); } void enableRemoveIfNecessary(HWND hwndDlg) { // POSITION pos = m_listBox.GetFirstSelectedItemPosition(); // pos ? enable(hwndDlg,IDC_REMOVE_BUTTON) : disable(hwndDlg,IDC_REMOVE_BUTTON) ; int nItem = m_listBox.GetNextItem(-1, LVNI_SELECTED);//PRT (nItem != -1) ? enable(hwndDlg,IDC_REMOVE_BUTTON) : disable(hwndDlg,IDC_REMOVE_BUTTON) ;//PRT } bool enableNextIfNecessary(HWND hwndDlg,int id) { if (IsDlgItemEmpty(hwndDlg,id)) { PostMessage(GetParent(hwndDlg), PSM_SETWIZBUTTONS, 0, PSWIZB_BACK); return false; } else { PostMessage(GetParent(hwndDlg), PSM_SETWIZBUTTONS, 0, PSWIZB_BACK|PSWIZB_NEXT); return true; } } void enableNextIfObjectsSelected(HWND hwndDlg) { if (m_listBox.GetItemCount()==0) { PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK); } else { PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK | PSWIZB_NEXT); } } void setupColumns(bool sourceIsNT4) { CString column; column.LoadString(IDS_COLUMN_NAME); m_listBox.InsertColumn( 1, column,LVCFMT_LEFT,125,1); column.LoadString(IDS_COLUMN_OBJECTPATH); m_listBox.InsertColumn( 2, column,LVCFMT_LEFT,0,1); if (sourceIsNT4) { if (migration==w_computer || (migration==w_security || (migration==w_service || migration==w_reporting))) { m_listBox.SetColumnWidth(0,455); } else if (migration==w_account) { column.LoadString(IDS_COLUMN_FULLNAME); m_listBox.InsertColumn( 3, column,LVCFMT_LEFT,125,1); column.LoadString(IDS_COLUMN_DESCRIPTION); m_listBox.InsertColumn( 4, column,LVCFMT_LEFT,125,1); } else if (migration==w_group || migration==w_groupmapping) { column.LoadString(IDS_COLUMN_DESCRIPTION); m_listBox.InsertColumn( 3, column,LVCFMT_LEFT,320,1); } } else { if (migration==w_computer || (migration==w_security || (migration==w_service || migration==w_reporting))) { column.LoadString(IDS_COLUMN_DESCRIPTION); m_listBox.InsertColumn( 3, column,LVCFMT_LEFT,125,1); } else if (migration==w_account) { column.LoadString(IDS_COLUMN_SAMNAME); m_listBox.InsertColumn( 3, column,LVCFMT_LEFT,125,1); column.LoadString(IDS_COLUMN_DESCRIPTION); m_listBox.InsertColumn( 4, column,LVCFMT_LEFT,125,1); column.LoadString(IDS_COLUMN_UPN); m_listBox.InsertColumn( 5, column,LVCFMT_LEFT,0,1); } else if (migration==w_group || migration==w_groupmapping) { column.LoadString(IDS_COLUMN_SAMNAME); m_listBox.InsertColumn( 3, column,LVCFMT_LEFT,125,1); column.LoadString(IDS_COLUMN_DESCRIPTION); m_listBox.InsertColumn( 4, column,LVCFMT_LEFT,205,1); } } } void sort(CListCtrl & listbox,int col,bool order) { CWaitCursor w; LV_ITEM lvItem; ZeroMemory(&lvItem, sizeof(lvItem)); LV_ITEM lvItem2; ZeroMemory(&lvItem2, sizeof(lvItem2)); bool ahead; CString temp1,temp2,temp3,temp4,temp5; int numItems = listbox.GetItemCount(); for (int i = 0;i 0); if ((order && ahead) || (!order && !ahead)) { temp1 = listbox.GetItemText(i,0); temp2 = listbox.GetItemText(i,1); temp3 = listbox.GetItemText(i,2); temp4 = listbox.GetItemText(i,3); temp5 = listbox.GetItemText(i,4); SetItemText(listbox,i,0,listbox.GetItemText(j,0)); SetItemText(listbox,i,1,listbox.GetItemText(j,1)); SetItemText(listbox,i,2,listbox.GetItemText(j,2)); SetItemText(listbox,i,3,listbox.GetItemText(j,3)); SetItemText(listbox,i,4,listbox.GetItemText(j,4)); SetItemText(listbox,j,0,temp1); SetItemText(listbox,j,1,temp2); SetItemText(listbox,j,2,temp3); SetItemText(listbox,j,3,temp4); SetItemText(listbox,j,4,temp5); } } } } /* void changePlaces(CListCtrl&listBox,int i,int j) { CString temp1,temp2,temp3,temp4,temp5; temp1 = listbox.GetItemText(i,0); temp2 = listbox.GetItemText(i,1); temp3 = listbox.GetItemText(i,2); temp4 = listbox.GetItemText(i,3); temp5 = listbox.GetItemText(i,4); SetItemText(listbox,i,0,listbox.GetItemText(j,0)); SetItemText(listbox,i,1,listbox.GetItemText(j,1)); SetItemText(listbox,i,2,listbox.GetItemText(j,2)); SetItemText(listbox,i,3,listbox.GetItemText(j,3)); SetItemText(listbox,i,4,listbox.GetItemText(j,4)); SetItemText(listbox,j,0,temp1); SetItemText(listbox,j,1,temp2); SetItemText(listbox,j,2,temp3); SetItemText(listbox,j,3,temp4); SetItemText(listbox,j,4,temp5); } int Partition(CListCtrl & listbox,int col,bool order,int p,int r) { CString x=listbox.GetItemText(p,col) int i=p-1; int j=r+1; while (true) { do { j--; }while(x.CompareNoCase(listBox.GetItemText(j,col) ) >= 0); do { i++; }while(x.CompareNoCase(listBox.GetItemText(i,col) ) <=0); if (i 0); if ((order && ahead) || (!order && !ahead)) { temp1 = listbox.GetItemText(i,0); temp2 = listbox.GetItemText(i,1); temp3 = listbox.GetItemText(i,2); temp4 = listbox.GetItemText(i,3); temp5 = listbox.GetItemText(i,4); SetItemText(listbox,i,0,listbox.GetItemText(j,0)); SetItemText(listbox,i,1,listbox.GetItemText(j,1)); SetItemText(listbox,i,2,listbox.GetItemText(j,2)); SetItemText(listbox,i,3,listbox.GetItemText(j,3)); SetItemText(listbox,i,4,listbox.GetItemText(j,4)); SetItemText(listbox,j,0,temp1); SetItemText(listbox,j,1,temp2); SetItemText(listbox,j,2,temp3); SetItemText(listbox,j,3,temp4); SetItemText(listbox,j,4,temp5); } } } } void QuickSort(CListCtrl & listbox,int col,bool order,int p,int r) { int q; if (praw_IsAdmin(NULL,_bstr_t(m_Computer),&bIs); if ( SUCCEEDED(hr) ) { if ( bIs == 0 ) return false; } else return false; return true; } HRESULT validDomain(CString m_Computer,bool& isNt4) { IAccessCheckerPtr pAccess; HRESULT hr; unsigned long maj,min,sp; hr = pAccess.CreateInstance(CLSID_AccessChecker); hr = pAccess->raw_GetOsVersion(_bstr_t(m_Computer),&maj,&min,&sp); maj<5 ? isNt4=true :isNt4=false; return hr; } bool targetNativeMode(_bstr_t b,HRESULT& hr) { IAccessCheckerPtr pAccess; hr = pAccess.CreateInstance(CLSID_AccessChecker); BOOL bTgtNative=FALSE; hr=pAccess->raw_IsNativeMode(b, (long*)&bTgtNative); return ( bTgtNative != FALSE); } bool CheckSameForest(CString& domain1,CString& domain2,HRESULT& hr) { IAccessCheckerPtr pAccess; hr = pAccess.CreateInstance(CLSID_AccessChecker); BOOL pbIsSame=FALSE; hr = pAccess->raw_IsInSameForest(_bstr_t(domain1), _bstr_t(domain2), (long *) &pbIsSame); return (pbIsSame!=FALSE); } HRESULT doSidHistory(HWND hwndDlg) { CWaitCursor c; IAccessCheckerPtr pAC; HRESULT hr; CString info=L""; long bIs=0; PDOMAIN_CONTROLLER_INFOW pdomc; hr = pAC.CreateInstance(CLSID_AccessChecker); if (FAILED(hr)) { return hr; } hr = pAC->raw_CanUseAddSidHistory(_bstr_t((LPCTSTR)sourceNetbios), _bstr_t((LPCTSTR)targetNetbios), &bIs); if ( SUCCEEDED(hr) ) { if ( bIs == 0 ) { return S_OK; } else { // get primary domain controller in source domain hr = DsGetDcNameW(NULL, (LPCTSTR)sourceNetbios, NULL, NULL, DS_PDC_REQUIRED, &pdomc); if (FAILED(hr)) { return hr; } _bstr_t sourceDomainController = pdomc->DomainControllerName; NetApiBufferFree(pdomc); if ( bIs & F_NO_AUDITING_SOURCE ) { info.LoadString(IDS_MSG_ENABLE_SOURCE); if (MessageBox(hwndDlg,info,0,MB_YESNOCANCEL|MB_ICONQUESTION) ==IDYES) { hr = pAC->raw_EnableAuditing(sourceDomainController); if(FAILED(hr)) return hr; } else return E_ABORT; } if ( bIs & F_NO_AUDITING_TARGET ) { info.LoadString(IDS_MSG_ENABLE_TARGET); if (MessageBox(hwndDlg,info,0,MB_YESNOCANCEL|MB_ICONQUESTION) ==IDYES) { hr = DsGetDcNameW(NULL,(LPCTSTR)targetNetbios, NULL, NULL, 0, &pdomc); if (FAILED(hr)) { return hr; } _bstr_t targetDomainController = pdomc->DomainControllerName; NetApiBufferFree(pdomc); hr = pAC->raw_EnableAuditing(targetDomainController); if(FAILED(hr)) return hr; } else return E_ABORT; } if ( bIs & F_NO_LOCAL_GROUP ) { CString info2; info2.LoadString(IDS_MSG_LOCAL_GROUP); info.Format(info2,sourceNetbios,sourceNetbios); if (MessageBox(hwndDlg,info,0,MB_YESNOCANCEL|MB_ICONQUESTION) ==IDYES) { hr = pAC->raw_AddLocalGroup(_bstr_t((LPCTSTR)sourceNetbios), sourceDomainController); if(FAILED(hr)) return hr; } else return E_ABORT; } if ( bIs & F_NO_REG_KEY ) { info.LoadString(IDS_MSG_REGKEY); int bReboot=0; if (MessageBox(hwndDlg,info,0,MB_YESNOCANCEL|MB_ICONQUESTION) ==IDYES) { info.LoadString(IDS_MSG_REBOOT_SID); int answer = MessageBox(hwndDlg,info,0,MB_YESNOCANCEL|MB_ICONQUESTION) ; if (answer==IDYES) bReboot=1; else if (answer==IDNO) bReboot=0; else return E_ABORT; hr = pAC->raw_AddRegKey(sourceDomainController,bReboot); if(FAILED(hr)) return hr; } else return E_ABORT; } return S_OK; } } else { info.LoadString(IDS_MSG_SID_HISTORY); MessageBox(hwndDlg,info,0,MB_ICONSTOP); return hr; } } void GetDnsAndNetbiosFromName(WCHAR const * name,WCHAR * netBios, WCHAR * dns) { IADsPtr pDomain; WCHAR strText[1000]; _bstr_t distinguishedName; _bstr_t sNBName = name; DOMAIN_CONTROLLER_INFO * pDomCtrlInfo = NULL; bool bDNS = false; //try to get the dns name for this given domain name if (DsGetDcName(NULL, name, NULL, NULL, DS_RETURN_DNS_NAME, &pDomCtrlInfo) == NO_ERROR) { //if we got the domain anme back in DNS format, use it if (pDomCtrlInfo->Flags & DS_DNS_DOMAIN_FLAG) { swprintf(strText,L"LDAP://%ls",pDomCtrlInfo->DomainName); bDNS = true; } else { sNBName = pDomCtrlInfo->DomainName; swprintf(strText,L"LDAP://%ls",pDomCtrlInfo->DomainName); } NetApiBufferFree(pDomCtrlInfo); } //else try to get the real NetBios name of this domain else if (DsGetDcName(NULL, name, NULL, NULL, 0, &pDomCtrlInfo) == NO_ERROR) { sNBName = pDomCtrlInfo->DomainName; // swprintf(strText,L"LDAP://%ls",pDomCtrlInfo->DomainName); NetApiBufferFree(pDomCtrlInfo); } // else //else use the given name // swprintf(strText,L"LDAP://%ls",name); netBios[0] = 0; dns[0] = 0; // if we couldn't get the DNS name for the domain, use the specified // name as both DNS and NETBIOS. This will work for NT 4 domains if (!bDNS) { UStrCpy(netBios,(WCHAR*)sNBName); UStrCpy(dns,(WCHAR*)sNBName); return; } HRESULT hr = ADsGetObject(strText,IID_IADs,(void**)&pDomain); if ( SUCCEEDED(hr) ) { _variant_t var; // get the DNS name from the LDAP provider hr = pDomain->Get(L"distinguishedName",&var); if ( SUCCEEDED(hr) ) { WCHAR * dn = (WCHAR*)var.bstrVal; WCHAR * curr = dns; distinguishedName = dn; if ( !UStrICmp(dn,L"DC=",3) ) { // for each ",DC=" in the name, replace it with a . for ( curr = dns, dn = dn+3 ; // skip the leading "DC=" *dn ; // until the end of the string is reached curr++ // ) { if ( (L',' == *dn) && (L'D' == *(dn+1)) && (L'C' == *(dn+2)) && (L'=' == *(dn+3)) ) { (*curr) = L'.'; dn+=4; } else { // just copy the character (*curr) = (*dn); dn++; } } *(curr) = 0; } // get the NETBIOS name from the LDAP provider hr = pDomain->Get(L"nETBIOSName",&var); if ( SUCCEEDED(hr) ) { UStrCpy(netBios,(WCHAR*)var.bstrVal); } else { // currently, the netbiosName property is not filled in // so we will use a different method to get the flat-name for the domain // Here is our strategy to get the netbios name: // Enumerate the partitions container under the configuration container // look for a CrossRef object whose nCName property matches the distinguished name // we have for the domain. This object's CN property is the flat-name for the domain // get the name of the configuration container IADsPtr pDSE; _bstr_t domainName = strText; // swprintf(strText,L"LDAP://%ls/RootDSE",name); swprintf(strText,L"%ls/RootDSE",(WCHAR*)domainName); hr = ADsGetObject(strText,IID_IADs,(void**)&pDSE); if ( SUCCEEDED(hr) ) { hr = pDSE->Get(L"configurationNamingContext",&var); if ( SUCCEEDED(hr) ) { IADsContainerPtr pPart; // swprintf(strText,L"LDAP://%ls/CN=Partitions,%ls",name,var.bstrVal); swprintf(strText,L"%ls/CN=Partitions,%ls",(WCHAR*)domainName,var.bstrVal); hr = ADsGetObject(strText,IID_IADsContainer,(void**)&pPart); if ( SUCCEEDED(hr) ) { IUnknownPtr pUnk; IEnumVARIANTPtr pEnum; IADsPtr pItem; ULONG lFetch = 0; // enumerate the contents of the Partitions container hr = pPart->get__NewEnum(&pUnk); if ( SUCCEEDED(hr) ) { pEnum = pUnk; } if ( SUCCEEDED(hr) ) { var.Clear(); hr = pEnum->Next(1,&var,&lFetch); } while ( hr == S_OK ) { if (lFetch == 1 ) { IDispatchPtr pDisp = var; if ( pDisp ) { pItem = pDisp; if ( pItem ) { BSTR bstr = NULL; hr = pItem->get_Class(&bstr); if (SUCCEEDED(hr)) { _bstr_t strClass(bstr, false); if ( !UStrICmp(strClass,L"crossRef") ) { // see if this is the one we are looking for var.Clear(); hr = pItem->Get(L"nCName",&var); if ( SUCCEEDED(hr) ) { if ( !UStrICmp(var.bstrVal,(WCHAR*)distinguishedName) ) { // this is the one we want! var.Clear(); hr = pItem->Get(L"cn",&var); if ( SUCCEEDED(hr) ) { UStrCpy(netBios,var.bstrVal); break; } } } } } } } } var.Clear(); hr = pEnum->Next(1, &var, &lFetch); } } } } } } } else { // default to using the specified name as both DNS and NETBIOS // this will work for NT 4 domains UStrCpy(netBios,(WCHAR*)sNBName); UStrCpy(dns,(WCHAR*)sNBName); } if ( ! (*netBios) ) { UStrCpy(netBios,(WCHAR*)sNBName); WCHAR * temp = wcschr(netBios,L'.'); if ( temp ) *temp = 0; } if (! (*dns) ) { UStrCpy(dns,(WCHAR*)sNBName); } } void GetDomainInfoFromActionHistory(WCHAR const * name, WCHAR * netBios, WCHAR * dns, CString targetDomainDns, bool * bSetForest, bool * bSetSrcOS, LPSHAREDWIZDATA& pdata) { IVarSetPtr pVsAH(__uuidof(VarSet)); IUnknown * pUnk = NULL; HRESULT hr; _bstr_t srcNB, srcDNS; WCHAR key[MAX_PATH]; long lActionID, ldx = 1; bool bID = false; bool bFound = false; *bSetForest = false; *bSetSrcOS = false; //get current Action ID so we know how many action history entries are in the table hr = db->raw_GetCurrentActionID(&lActionID); if ( SUCCEEDED(hr) ) bID = true; //get the varset for all action ids until we find what we are looking for while ( (!bFound) && ( ((bID) && (ldx <= lActionID)) || (!bID) ) ) { hr = pVsAH->QueryInterface(IID_IUnknown, (void**)&pUnk); //fill a varset with the next action from the Action History table if ( SUCCEEDED(hr) ) hr = db->raw_GetActionHistory(ldx, &pUnk); pUnk->Release(); if ( SUCCEEDED(hr) ) { srcNB = pVsAH->get(GET_BSTR(DCTVS_Options_SourceDomain)); srcDNS = pVsAH->get(GET_BSTR(DCTVS_Options_SourceDomainDns)); //if we have a match of with the source domain netbios or dns, continue, //else, move to the next action history entry if ((!UStrICmp(srcNB,name)) || (!UStrICmp(srcDNS,name))) { //save the netbios and dns names wcscpy(netBios, (WCHAR*)srcNB); wcscpy(dns, (WCHAR*)srcDNS); //if we haven't been able to set the forest, do so if (!(*bSetForest)) { //if the target domain also matches then set whether they are intra-forest _bstr_t tgtDNS = pVsAH->get(GET_BSTR(DCTVS_Options_TargetDomainDns)); if (!UStrICmp(tgtDNS, (LPCTSTR)targetDomainDns)) { *bSetForest = true; //set flag indicating intraforest flag set in pdata //if this is intra-forest, then set all the fields and leave _bstr_t sIntraforest = pVsAH->get(GET_BSTR(DCTVS_Options_IsIntraforest)); if (!UStrICmp(sIntraforest,GET_STRING(IDS_YES))) { pdata->sameForest = true; pdata->sourceIsNT4 = false; *bSetSrcOS = true; //set flag indicating Src OS set in pdata bFound = true; //set flag to leave this function } else //else we still need to figure out if the source domain is NT4 or W2K { pdata->sameForest = false; //we can figure this out if this operation was not a computer migration _bstr_t sWizard = pVsAH->get(GET_BSTR(DCTVS_Options_Wizard)); if (UStrICmp((WCHAR *)text, L"computer")) { //get the name of an object migrated and see if it starts with //"WinNT://", which indicates an NT 4.0 source swprintf(key,GET_STRING(DCTVSFmt_Accounts_D),0); _bstr_t sName = pVsAH->get(key); if (!wcsncmp(L"WinNT://", (WCHAR*)sName, 8)) pdata->sourceIsNT4 = true; else pdata->sourceIsNT4 = false; *bSetSrcOS = true; //set flag indicating Src OS set in pdata bFound = true; //set flag to leave this function }//end if not computer migration }//end else inter-forest migration }//end if target domain match else if (!(*bSetSrcOS)) //else if need to, try to find out if the source { //domain is NT4.0 or W2K //we can figure this out if this operation was not a computer migration _bstr_t sWizard = pVsAH->get(GET_BSTR(DCTVS_Options_Wizard)); if (UStrICmp((WCHAR *)text, L"computer")) { //get the name of an object migrated and see if it starts with //"WinNT://", which indicates an NT 4.0 source swprintf(key,GET_STRING(DCTVSFmt_Accounts_D),0); _bstr_t sName = pVsAH->get(key); if (!wcsncmp(L"WinNT://", (WCHAR*)sName, 8)) pdata->sourceIsNT4 = true; else pdata->sourceIsNT4 = false; *bSetSrcOS = true; //set flag indicating Src OS set in pdata }//end if not computer migration }//end if not set OS flag yet }//end if forest not set else if (!(*bSetSrcOS)) //else if need to, try to find out if the source { //domain is NT4.0 or W2K //we can figure this out if this operation was not a computer migration _bstr_t sWizard = pVsAH->get(GET_BSTR(DCTVS_Options_Wizard)); if (UStrICmp((WCHAR *)text, L"computer")) { //get the name of an object migrated and see if it starts with //"WinNT://", which indicates an NT 4.0 source swprintf(key,GET_STRING(DCTVSFmt_Accounts_D),0); _bstr_t sName = pVsAH->get(key); if (!wcsncmp(L"WinNT://", (WCHAR*)sName, 8)) pdata->sourceIsNT4 = true; else pdata->sourceIsNT4 = false; *bSetSrcOS = true; //set flag indicating Src OS set in pdata bFound = true; //set flag to leave this function }//end if not computer migration }//end if not set OS flag yet }//end if source domain match }//end if got next varset else //else if could not retrieve the varset, leave bFound = true; ldx++; }//end while not done } bool GetDomainSidFromMigratedObjects(WCHAR const * sDomainNetBios, WCHAR * sSrcSid) { IVarSetPtr pVsMO(__uuidof(VarSet)); IUnknown * pUnk = NULL; HRESULT hr; WCHAR text[MAX_PATH]; _bstr_t srcDom; _bstr_t txtSid; long numObjects, ndx = 0; bool bFound = false; hr = pVsMO->QueryInterface(IID_IUnknown, (void**)&pUnk); if ( SUCCEEDED(hr) ) { //fill a varset with migrated objects from the Migrated Objects table hr = db->raw_GetMigratedObjectsWithSSid(-1,&pUnk); if ( SUCCEEDED(hr) ) { pUnk->Release(); //get the num of objects in the varset numObjects = pVsMO->get(L"MigratedObjects"); //while not found and more objects, search for source domain match //and see if its Sid was stored while ((!bFound) && (ndx < numObjects)) { //get this object's source domain swprintf(text,L"MigratedObjects.%ld.%s",ndx,GET_STRING(DB_SourceDomain)); srcDom = pVsMO->get(text); //if source domain matches, see if the sid was stored if (!UStrICmp((WCHAR*)srcDom, sDomainNetBios)) { //get the source domain Sid swprintf(text,L"MigratedObjects.%ld.%s",ndx,GET_STRING(DB_SourceDomainSid)); txtSid = pVsMO->get(text); //if source sid retrieved, convert to PSID and set found flag if (UStrICmp((WCHAR*)txtSid, L"")) { UStrCpy(sSrcSid, (WCHAR*)txtSid); bFound = true; } }//end if source domain match ndx++; }//end while not done }//end if got migrated objects }//end if got IUnknown return bFound; } void cleanNames() { sourceDNS=L""; sourceNetbios=L""; targetNetbios=L""; targetDNS=L""; } bool verifyprivs(HWND hwndDlg,CString& sourceDomainController,CString& targetDomainController,LPSHAREDWIZDATA& pdata) { CWaitCursor wait; CString temp,temp2; HRESULT hr; bool result; GetDlgItemText( hwndDlg, IDC_EDIT_DOMAIN, temp.GetBuffer(1000),1000); GetDlgItemText( hwndDlg, IDC_EDIT_DOMAIN2, temp2.GetBuffer(1000),1000); temp.ReleaseBuffer(); temp2.ReleaseBuffer(); temp.TrimLeft();temp.TrimRight(); temp2.TrimLeft();temp2.TrimRight(); // if the source domain has changed... if ( temp.CompareNoCase(sourceDNS) && temp.CompareNoCase(sourceNetbios) ) { pdata->newSource = true; // Get the DNS and Netbios names for the domain name the user has entered } else { pdata->newSource = false; } GetDnsAndNetbiosFromName(&*temp,sourceNetbios.GetBuffer(1000),sourceDNS.GetBuffer(1000)); sourceNetbios.ReleaseBuffer(); sourceDNS.ReleaseBuffer(); sourceNetbios.TrimLeft();sourceDNS.TrimRight(); GetDnsAndNetbiosFromName(&*temp2,targetNetbios.GetBuffer(1000),targetDNS.GetBuffer(1000)); targetNetbios.ReleaseBuffer(); targetDNS.ReleaseBuffer(); targetNetbios.TrimLeft();targetDNS.TrimRight(); if (!sourceNetbios.CompareNoCase(targetNetbios) || !sourceDNS.CompareNoCase(targetDNS)) { MessageBoxWrapper3(hwndDlg,IDS_MSG_UNIQUE,IDS_MSG_ERROR,temp); cleanNames(); return false; } _bstr_t text =get(DCTVS_Options_TargetDomain); CString tocheck = (WCHAR * const) text; tocheck.TrimLeft();tocheck.TrimRight(); pdata->resetOUPATH = !tocheck.CompareNoCase(targetNetbios) ? false: true; PDOMAIN_CONTROLLER_INFOW pdomc; HRESULT res = DsGetDcNameW(NULL,(LPCTSTR const)sourceNetbios,NULL,NULL, DS_DIRECTORY_SERVICE_PREFERRED,&pdomc); if (res!=NO_ERROR) { ErrorWrapper3(hwndDlg,res,temp); if ( gbNeedToVerify ) { cleanNames(); return false; } } else { sourceDomainController = pdomc->DomainControllerName; NetApiBufferFree(pdomc); } res = DsGetDcNameW(NULL,(LPCTSTR const) targetNetbios,NULL,NULL, DS_DIRECTORY_SERVICE_PREFERRED,&pdomc); if (res!=NO_ERROR) { ErrorWrapper3(hwndDlg,res,temp2); if ( gbNeedToVerify ) { cleanNames(); return false; } } else { targetDomainController = pdomc->DomainControllerName; NetApiBufferFree(pdomc); } /////////////////////////////////////////////////////////////////////////////////////////// bool nothing; hr =validDomain(sourceDomainController,pdata->sourceIsNT4); if (!SUCCEEDED(hr)) { ErrorWrapper3(hwndDlg,hr,temp); if ( gbNeedToVerify ) { cleanNames(); return false; } } hr =validDomain(targetDomainController,nothing); if (!SUCCEEDED(hr)) { ErrorWrapper3(hwndDlg,hr,temp2); if ( gbNeedToVerify ) { cleanNames(); return false; } } result = administrator(sourceDomainController,hr); if (!SUCCEEDED(hr)) { ErrorWrapper3(hwndDlg,hr,temp); if ( gbNeedToVerify ) { cleanNames(); return false; } } else if (!result) { MessageBoxWrapper3(hwndDlg,IDS_MSG_SOURCE_ADMIN,IDS_MSG_ERROR,temp); if ( gbNeedToVerify ) { cleanNames(); return false; } } result=administrator(targetDomainController,hr); if (!SUCCEEDED(hr)) { ErrorWrapper3(hwndDlg,hr,temp2); if ( gbNeedToVerify ) { cleanNames(); return false; } } else if (!result) { MessageBoxWrapper3(hwndDlg,IDS_MSG_TARGET_ADMIN,IDS_MSG_ERROR,temp2); if ( gbNeedToVerify ) { cleanNames(); return false; } } TCHAR szBuf[800]; swprintf(szBuf,L"%s",targetDNS); result=targetNativeMode(szBuf,hr); if (!SUCCEEDED(hr)) { ErrorWrapper3(hwndDlg,hr,temp2); if ( gbNeedToVerify ) { cleanNames(); return false; } } else if (!result) { MessageBoxWrapper3(hwndDlg,IDS_MSG_TARGET_NATIVE,IDS_MSG_ERROR,temp2); if ( gbNeedToVerify ) { cleanNames(); return false; } } if (pdata->sourceIsNT4) { pdata->sameForest=false; } else { pdata->sameForest=CheckSameForest(sourceDNS,targetDNS,hr); if (!SUCCEEDED(hr)) { ErrorWrapper3(hwndDlg,hr,temp); if ( gbNeedToVerify ) { cleanNames(); return false; } } } pdata->sameForest ? put(DCTVS_Options_IsIntraforest,yes) : put(DCTVS_Options_IsIntraforest,no); return true; } bool verifyprivs2(HWND hwndDlg,CString& additionalDomainController,CString domainName) { CWaitCursor w; CString domainNetbios,domainDNS; GetDnsAndNetbiosFromName(&*domainName,domainNetbios.GetBuffer(1000),domainDNS.GetBuffer(1000)); domainNetbios.ReleaseBuffer(); domainDNS.ReleaseBuffer(); PDOMAIN_CONTROLLER_INFOW pdomc; HRESULT res = DsGetDcNameW(NULL,(LPCTSTR const)domainNetbios,NULL,NULL, DS_DIRECTORY_SERVICE_PREFERRED,&pdomc); if (res!=NO_ERROR) { ErrorWrapper3(hwndDlg,res,domainNetbios); if ( gbNeedToVerify ) return false; } else { additionalDomainController = pdomc->DomainControllerName; NetApiBufferFree(pdomc); } bool nothing; HRESULT hr =validDomain(additionalDomainController,nothing); if (!SUCCEEDED(hr)) { ErrorWrapper3(hwndDlg,hr,domainNetbios); if ( gbNeedToVerify ) return false; } HRESULT result = administrator(additionalDomainController,hr); if (!SUCCEEDED(hr)) { ErrorWrapper3(hwndDlg,hr,domainNetbios); if ( gbNeedToVerify ) return false; } else if (!result) { MessageBoxWrapper3(hwndDlg,IDS_MSG_SOURCE_ADMIN,IDS_MSG_ERROR,domainNetbios); if ( gbNeedToVerify ) return false; } return true; } bool verifyprivsSTW(HWND hwndDlg,CString& sourceDomainController,CString& targetDomainController,LPSHAREDWIZDATA& pdata) { CWaitCursor wait; CString temp,temp2; HRESULT hr; bool result, bSetSrcOS, bSetForest; GetDlgItemText( hwndDlg, IDC_EDIT_DOMAIN, temp.GetBuffer(1000),1000); GetDlgItemText( hwndDlg, IDC_EDIT_DOMAIN2, temp2.GetBuffer(1000),1000); temp.ReleaseBuffer(); temp2.ReleaseBuffer(); temp.TrimLeft();temp.TrimRight(); temp2.TrimLeft();temp2.TrimRight(); // if the source domain has changed... if ( temp.CompareNoCase(sourceDNS) && temp.CompareNoCase(sourceNetbios) ) { pdata->newSource = true; // Get the DNS and Netbios names for the domain name the user has entered } else { pdata->newSource = false; } GetDnsAndNetbiosFromName(&*temp2,targetNetbios.GetBuffer(1000),targetDNS.GetBuffer(1000)); targetNetbios.ReleaseBuffer(); targetDNS.ReleaseBuffer(); targetNetbios.TrimLeft();targetDNS.TrimRight(); //for Security Translation Wizard, get source domain info from the Action History table and //also use the table to fill in the info about whether the source domain is NT 4.0 and in //the same forest as the target domain. GetDomainInfoFromActionHistory(&*temp,sourceNetbios.GetBuffer(1000),sourceDNS.GetBuffer(1000), targetDNS, &bSetForest, &bSetSrcOS, pdata); sourceNetbios.ReleaseBuffer(); sourceDNS.ReleaseBuffer(); sourceNetbios.TrimLeft();sourceDNS.TrimRight(); if ((sourceNetbios.IsEmpty()) || (sourceDNS.IsEmpty())) { MessageBoxWrapper3(hwndDlg,IDS_MSG_NOOBJECTS,IDS_MSG_ERROR,temp); cleanNames(); return false; } if (!sourceNetbios.CompareNoCase(targetNetbios) || !sourceDNS.CompareNoCase(targetDNS)) { MessageBoxWrapper3(hwndDlg,IDS_MSG_UNIQUE,IDS_MSG_ERROR,temp); cleanNames(); return false; } //get the source domain's sid from a previous migration, display //message if no sid WCHAR txtSid[MAX_PATH] = L""; if (GetDomainSidFromMigratedObjects((LPCTSTR)sourceNetbios, txtSid)) pVarSet->put(GET_BSTR(DCTVS_Options_SourceDomainSid),txtSid); else { PSID pSid = NULL; WCHAR * domctrl = NULL; DWORD lenTxt = DIM(txtSid); BOOL bFailed = TRUE; //try to get it from the source domain directly if (!NetGetDCName(NULL,(LPCTSTR)sourceNetbios,(LPBYTE*)&domctrl)) { if(GetDomainSid(domctrl,&pSid)) { if (GetTextualSid(pSid,txtSid,&lenTxt)) { //add the sid to the varset pVarSet->put(GET_BSTR(DCTVS_Options_SourceDomainSid),txtSid); //populate the MigratedObjects table with this sid db->PopulateSrcSidColumnByDomain((LPCTSTR)sourceNetbios, _bstr_t(txtSid)); bFailed = FALSE; } if (pSid) FreeSid(pSid); } NetApiBufferFree(domctrl); } if (bFailed) { MessageBoxWrapper3(hwndDlg,IDS_MSG_NOSOURCESID,IDS_MSG_ERROR,temp); cleanNames(); return false; } } _bstr_t text =get(DCTVS_Options_TargetDomain); CString tocheck = (WCHAR * const) text; tocheck.TrimLeft();tocheck.TrimRight(); pdata->resetOUPATH = !tocheck.CompareNoCase(targetNetbios) ? false: true; PDOMAIN_CONTROLLER_INFOW pdomc; HRESULT res = DsGetDcNameW(NULL,(LPCTSTR const)sourceNetbios,NULL,NULL, DS_DIRECTORY_SERVICE_PREFERRED,&pdomc); if (res==NO_ERROR) { sourceDomainController = pdomc->DomainControllerName; NetApiBufferFree(pdomc); } res = DsGetDcNameW(NULL,(LPCTSTR const) targetNetbios,NULL,NULL,DS_DIRECTORY_SERVICE_PREFERRED,&pdomc); if (res!=NO_ERROR) { ErrorWrapper3(hwndDlg,res,temp2); if ( gbNeedToVerify ) { cleanNames(); return false; } } else { targetDomainController = pdomc->DomainControllerName; NetApiBufferFree(pdomc); } /////////////////////////////////////////////////////////////////////////////////////////// bool nothing; //if we were not able to determine the source domain's OS from the //Action History table and we did get the source DC name, try to do //it here. This will work if the source domain still exists. If //the source domain no longer exists, set default. if ((!bSetSrcOS) && (!sourceDomainController.IsEmpty())) { hr =validDomain(sourceDomainController,pdata->sourceIsNT4); if (!SUCCEEDED(hr)) pdata->sourceIsNT4 = true; } hr =validDomain(targetDomainController,nothing); if (!SUCCEEDED(hr)) { ErrorWrapper3(hwndDlg,hr,temp2); if ( gbNeedToVerify ) { cleanNames(); return false; } } result=administrator(targetDomainController,hr); if (!SUCCEEDED(hr)) { ErrorWrapper3(hwndDlg,hr,temp2); if ( gbNeedToVerify ) { cleanNames(); return false; } } else if (!result) { MessageBoxWrapper3(hwndDlg,IDS_MSG_TARGET_ADMIN,IDS_MSG_ERROR,temp2); if ( gbNeedToVerify ) { cleanNames(); return false; } } TCHAR szBuf[800]; swprintf(szBuf,L"%s",targetDNS); result=targetNativeMode(szBuf,hr); if (!SUCCEEDED(hr)) { ErrorWrapper3(hwndDlg,hr,temp2); if ( gbNeedToVerify ) { cleanNames(); return false; } } else if (!result) { MessageBoxWrapper3(hwndDlg,IDS_MSG_TARGET_NATIVE,IDS_MSG_ERROR,temp2); if ( gbNeedToVerify ) { cleanNames(); return false; } } //if we were not able to set the intraforest boolean variable by looking at //the Action History table, then try to find out here. This will not work //if the source domain no longer exists, in which case we set it to a default //value. if (!bSetForest) { if (pdata->sourceIsNT4) { pdata->sameForest=false; } else { pdata->sameForest=CheckSameForest(sourceDNS,targetDNS,hr); if (!SUCCEEDED(hr)) { //if we cannot figure it out, assume it is intra-forest so we //will prompt for target domain credentials pdata->sameForest=true; } } } pdata->sameForest ? put(DCTVS_Options_IsIntraforest,yes) : put(DCTVS_Options_IsIntraforest,no); return true; } void OnADD(HWND hwndDlg,bool sourceIsNT4) { HRESULT hr = pDsObjectPicker->InvokeDialog(hwndDlg, &pdo); if (FAILED(hr)) return; if (hr == S_OK) { ProcessSelectedObjects(pdo,hwndDlg,sourceIsNT4); pdo->Release(); } } bool GetCheck(CListCtrl & yo,int nItem) { UINT nState = yo.GetItemState(nItem,LVIS_CUT); return (nState ? false: true); } void SetCheck(CListCtrl & yo,int nItem,bool checkit) { !checkit ? yo.SetItemState(nItem,LVIS_CUT,LVIS_CUT) : yo.SetItemState(nItem,0,LVIS_CUT); } void SetItemText(CListCtrl& yo, int nItem, int subItem,CString& text) { CString f; LV_ITEM lvItem; ZeroMemory(&lvItem, sizeof(lvItem)); lvItem.mask = LVIF_TEXT; lvItem.iItem = nItem; lvItem.iSubItem= subItem; f= text; lvItem.pszText = f.GetBuffer(1000); f.ReleaseBuffer(); yo.SetItem(&lvItem); } void SetItemText(CListCtrl& yo, int nItem, int subItem,TCHAR * text) { CString temp = text; SetItemText(yo,nItem,subItem,temp); } void SetItemText(CListCtrl& yo, int nItem, int subItem,TCHAR const * text) { CString temp = text; SetItemText(yo,nItem,subItem,temp); } void SetItemText(CListCtrl& yo, int nItem, int subItem,_bstr_t text) { CString temp = (WCHAR * const) text; SetItemText(yo,nItem,subItem,temp); } void OnREMOVE(HWND hwndDlg) { int nItem; // POSITION pos = m_listBox.GetFirstSelectedItemPosition(); // while (pos) // { // nItem = m_listBox.GetNextSelectedItem(pos); nItem = m_listBox.GetNextItem(-1, LVNI_SELECTED);//PRT while (nItem != -1)//PRT { SetCheck(m_listBox,nItem,false); nItem = m_listBox.GetNextItem(nItem, LVNI_SELECTED);//PRT } for (int i=(m_listBox.GetItemCount()-1);i>=0;i--) if (!GetCheck(m_listBox,i)) m_listBox.DeleteItem(i); } void OnMIGRATE(HWND hwndDlg,int& accounts,int&servers) { CString name,spruced_name,varset_1,upnName; accounts=0,servers=0; int intCount=m_listBox.GetItemCount(); CString n; for (int i=0;iput(_bstr_t(varset_1),_bstr_t(spruced_name)); pVarSet->put(_bstr_t(varset_1 + ".MigrateOnly"),no); if (migration==w_computer) pVarSet->put(_bstr_t(varset_1 + ".MoveToTarget"),yes); else if (migration==w_security) { pVarSet->put(_bstr_t(varset_1 + ".Reboot"),no); pVarSet->put(_bstr_t(varset_1 + ".MoveToTarget"),no); } servers++; } else { name= m_listBox.GetItemText(i,1); upnName = m_listBox.GetItemText(i,4); } if (name.IsEmpty()) { MessageBoxWrapper(hwndDlg,IDS_MSG_PATH,IDS_MSG_ERROR); } varset_1.Format(L"Accounts.%d",accounts); pVarSet->put(_bstr_t(varset_1),_bstr_t(name)); pVarSet->put(_bstr_t(varset_1+".TargetName"),L""); switch(migration) { case w_account: pVarSet->put(_bstr_t(varset_1+".Type"),L"user"); pVarSet->put(_bstr_t(varset_1+".UPNName"),_bstr_t(upnName)); break; case w_group:pVarSet->put(_bstr_t(varset_1+".Type"),L"group");break; case w_groupmapping: { pVarSet->put(_bstr_t(varset_1+".Type"),L"group"); _bstr_t temp = GET_BSTR(DCTVS_Accounts_D_OperationMask); CString holder = (WCHAR * const) temp; CString toenter; toenter.Format(holder,i); pVarSet->put(_bstr_t(toenter),(LONG)0x1d); break; } case w_computer:pVarSet->put(_bstr_t(varset_1+".Type"),L"computer");break; case w_security:pVarSet->put(_bstr_t(varset_1+".Type"),L"computer");break; case w_reporting:pVarSet->put(_bstr_t(varset_1+".Type"),L"computer");break; case w_service:pVarSet->put(_bstr_t(varset_1+".Type"),L"computer");break; default: break; } n=m_listBox.GetItemText(i,0); if (migration==w_account) pVarSet->put(_bstr_t(varset_1+L".Name"), _bstr_t(n)); accounts++; } put(DCTVS_Accounts_NumItems,(LONG)accounts); put(DCTVS_Servers_NumItems,(LONG)servers); } HRESULT InitObjectPicker2(IDsObjectPicker *pDsObjectPicker,bool multiselect,CString targetComputer,bool sourceIsNT4) { static const int SCOPE_INIT_COUNT = 2; DSOP_SCOPE_INIT_INFO aScopeInit[SCOPE_INIT_COUNT]; DSOP_INIT_INFO InitInfo; ZeroMemory(aScopeInit, sizeof(DSOP_SCOPE_INIT_INFO) * SCOPE_INIT_COUNT); ZeroMemory(&InitInfo, sizeof(InitInfo)); aScopeInit[0].cbSize = sizeof(DSOP_SCOPE_INIT_INFO); aScopeInit[1].cbSize = sizeof(DSOP_SCOPE_INIT_INFO); InitInfo.cbSize = sizeof(InitInfo); aScopeInit[0].FilterFlags.Uplevel.flBothModes = DSOP_FILTER_COMPUTERS; aScopeInit[0].FilterFlags.flDownlevel = DSOP_DOWNLEVEL_FILTER_COMPUTERS; aScopeInit[1].FilterFlags.Uplevel.flBothModes = DSOP_FILTER_COMPUTERS; aScopeInit[1].FilterFlags.flDownlevel = DSOP_DOWNLEVEL_FILTER_COMPUTERS; aScopeInit[0].flScope = DSOP_SCOPE_FLAG_WANT_PROVIDER_LDAP |DSOP_SCOPE_FLAG_WANT_PROVIDER_WINNT |DSOP_SCOPE_FLAG_STARTING_SCOPE; aScopeInit[1].flScope = DSOP_SCOPE_FLAG_WANT_PROVIDER_LDAP |DSOP_SCOPE_FLAG_WANT_PROVIDER_WINNT; aScopeInit[0].flType = DSOP_SCOPE_TYPE_UPLEVEL_JOINED_DOMAIN | DSOP_SCOPE_TYPE_DOWNLEVEL_JOINED_DOMAIN; aScopeInit[1].flType = DSOP_SCOPE_TYPE_ENTERPRISE_DOMAIN | DSOP_SCOPE_TYPE_EXTERNAL_UPLEVEL_DOMAIN | DSOP_SCOPE_TYPE_EXTERNAL_DOWNLEVEL_DOMAIN | DSOP_SCOPE_TYPE_USER_ENTERED_DOWNLEVEL_SCOPE | DSOP_SCOPE_TYPE_USER_ENTERED_UPLEVEL_SCOPE; InitInfo.pwzTargetComputer = targetComputer.GetBuffer(1000);// Target is the local computer. targetComputer.ReleaseBuffer(); InitInfo.cDsScopeInfos = SCOPE_INIT_COUNT; InitInfo.aDsScopeInfos = aScopeInit; if (sourceIsNT4) { } else { InitInfo.cAttributesToFetch = 1; InitInfo.apwzAttributeNames = new PCWSTR[1]; InitInfo.apwzAttributeNames[0] =L"Description"; } if (multiselect) InitInfo.flOptions = DSOP_FLAG_MULTISELECT; HRESULT hr= pDsObjectPicker->Initialize(&InitInfo); delete [] InitInfo.apwzAttributeNames; return hr; } HRESULT ReInitializeObjectPicker(IDsObjectPicker *pDsObjectPicker,bool multiselect,CString additionalDomainController,bool sourceIsNT4) {CWaitCursor c; // static const int SCOPE_INIT_COUNT = 3; static const int SCOPE_INIT_COUNT = 2; DSOP_SCOPE_INIT_INFO aScopeInit[SCOPE_INIT_COUNT]; DSOP_INIT_INFO InitInfo; ZeroMemory(aScopeInit, sizeof(DSOP_SCOPE_INIT_INFO) * SCOPE_INIT_COUNT); ZeroMemory(&InitInfo, sizeof(InitInfo)); aScopeInit[0].cbSize = sizeof(DSOP_SCOPE_INIT_INFO); aScopeInit[1].cbSize = sizeof(DSOP_SCOPE_INIT_INFO); // aScopeInit[2].cbSize = sizeof(DSOP_SCOPE_INIT_INFO); InitInfo.cbSize = sizeof(InitInfo); aScopeInit[0].FilterFlags.Uplevel.flBothModes = DSOP_FILTER_COMPUTERS; aScopeInit[0].FilterFlags.flDownlevel = DSOP_DOWNLEVEL_FILTER_COMPUTERS; aScopeInit[1].FilterFlags.Uplevel.flBothModes = DSOP_FILTER_COMPUTERS; aScopeInit[1].FilterFlags.flDownlevel = DSOP_DOWNLEVEL_FILTER_COMPUTERS; // aScopeInit[2].FilterFlags.Uplevel.flBothModes = DSOP_FILTER_COMPUTERS; // aScopeInit[2].FilterFlags.flDownlevel = DSOP_DOWNLEVEL_FILTER_COMPUTERS; aScopeInit[0].flScope = DSOP_SCOPE_FLAG_WANT_PROVIDER_LDAP |DSOP_SCOPE_FLAG_WANT_PROVIDER_WINNT |DSOP_SCOPE_FLAG_STARTING_SCOPE; aScopeInit[1].flScope = DSOP_SCOPE_FLAG_WANT_PROVIDER_LDAP |DSOP_SCOPE_FLAG_WANT_PROVIDER_WINNT; // aScopeInit[2].flScope = DSOP_SCOPE_FLAG_WANT_PROVIDER_LDAP |DSOP_SCOPE_FLAG_WANT_PROVIDER_WINNT; aScopeInit[0].flType = DSOP_SCOPE_TYPE_UPLEVEL_JOINED_DOMAIN | DSOP_SCOPE_TYPE_DOWNLEVEL_JOINED_DOMAIN; aScopeInit[1].flType = DSOP_SCOPE_TYPE_ENTERPRISE_DOMAIN | DSOP_SCOPE_TYPE_EXTERNAL_UPLEVEL_DOMAIN | DSOP_SCOPE_TYPE_EXTERNAL_DOWNLEVEL_DOMAIN | DSOP_SCOPE_TYPE_USER_ENTERED_DOWNLEVEL_SCOPE | DSOP_SCOPE_TYPE_USER_ENTERED_UPLEVEL_SCOPE; // aScopeInit[2].flType = DSOP_SCOPE_TYPE_UPLEVEL_JOINED_DOMAIN | DSOP_SCOPE_TYPE_DOWNLEVEL_JOINED_DOMAIN; InitInfo.pwzTargetComputer = additionalDomainController.GetBuffer(1000);// Target is the local computer. additionalDomainController.ReleaseBuffer(); InitInfo.cDsScopeInfos = SCOPE_INIT_COUNT; InitInfo.aDsScopeInfos = aScopeInit; if (sourceIsNT4) { } else { InitInfo.cAttributesToFetch = 1; InitInfo.apwzAttributeNames = new PCWSTR[1]; InitInfo.apwzAttributeNames[0] =L"Description"; } if (multiselect) InitInfo.flOptions = DSOP_FLAG_MULTISELECT; HRESULT hr= pDsObjectPicker->Initialize(&InitInfo); return hr; } HRESULT InitObjectPicker(IDsObjectPicker *pDsObjectPicker,bool multiselect,CString targetComputer,bool sourceIsNT4) { static const int SCOPE_INIT_COUNT = 1; DSOP_SCOPE_INIT_INFO aScopeInit[SCOPE_INIT_COUNT]; DSOP_INIT_INFO InitInfo; ZeroMemory(aScopeInit, sizeof(DSOP_SCOPE_INIT_INFO) * SCOPE_INIT_COUNT); ZeroMemory(&InitInfo, sizeof(InitInfo)); aScopeInit[0].cbSize = sizeof(DSOP_SCOPE_INIT_INFO); InitInfo.cbSize = sizeof(InitInfo); aScopeInit[0].flType = DSOP_SCOPE_TYPE_UPLEVEL_JOINED_DOMAIN | DSOP_SCOPE_TYPE_DOWNLEVEL_JOINED_DOMAIN; aScopeInit[0].flScope = DSOP_SCOPE_FLAG_WANT_PROVIDER_LDAP |DSOP_SCOPE_FLAG_WANT_PROVIDER_WINNT; if (migration==w_computer || (migration==w_security || (migration==w_service || migration==w_reporting))) { aScopeInit[0].FilterFlags.Uplevel.flBothModes = DSOP_FILTER_COMPUTERS; aScopeInit[0].FilterFlags.flDownlevel = DSOP_DOWNLEVEL_FILTER_COMPUTERS; } else if (migration==w_account) { aScopeInit[0].FilterFlags.Uplevel.flBothModes = DSOP_FILTER_USERS; aScopeInit[0].FilterFlags.flDownlevel = DSOP_DOWNLEVEL_FILTER_USERS; } else if (migration==w_group || migration==w_groupmapping) { aScopeInit[0].FilterFlags.Uplevel.flBothModes = DSOP_FILTER_BUILTIN_GROUPS | DSOP_FILTER_UNIVERSAL_GROUPS_SE | DSOP_FILTER_UNIVERSAL_GROUPS_DL | DSOP_FILTER_GLOBAL_GROUPS_SE | DSOP_FILTER_GLOBAL_GROUPS_DL | DSOP_FILTER_DOMAIN_LOCAL_GROUPS_SE | DSOP_FILTER_DOMAIN_LOCAL_GROUPS_DL; aScopeInit[0].FilterFlags.flDownlevel = DSOP_DOWNLEVEL_FILTER_LOCAL_GROUPS | DSOP_DOWNLEVEL_FILTER_GLOBAL_GROUPS; } if (migration==w_security || (migration==w_reporting || migration==w_service)) { aScopeInit[0].flType |= DSOP_SCOPE_TYPE_ENTERPRISE_DOMAIN | DSOP_SCOPE_TYPE_EXTERNAL_UPLEVEL_DOMAIN | DSOP_SCOPE_TYPE_EXTERNAL_DOWNLEVEL_DOMAIN | DSOP_SCOPE_TYPE_USER_ENTERED_DOWNLEVEL_SCOPE | DSOP_SCOPE_TYPE_USER_ENTERED_UPLEVEL_SCOPE /*| DSOP_SCOPE_TYPE_GLOBAL_CATALOG*/; } InitInfo.pwzTargetComputer = targetComputer.GetBuffer(1000);// Target is the local computer. targetComputer.ReleaseBuffer(); InitInfo.cDsScopeInfos = SCOPE_INIT_COUNT; InitInfo.aDsScopeInfos = aScopeInit; if (sourceIsNT4) { if (migration==w_computer || (migration==w_security || (migration==w_service || migration==w_reporting))) { } else if (migration==w_account) { InitInfo.cAttributesToFetch = 2; InitInfo.apwzAttributeNames = new PCWSTR[3]; InitInfo.apwzAttributeNames[0] =L"FullName"; InitInfo.apwzAttributeNames[1] =L"Description"; } else if (migration==w_group || migration==w_groupmapping) { InitInfo.cAttributesToFetch = 1; InitInfo.apwzAttributeNames = new PCWSTR[1]; InitInfo.apwzAttributeNames[0] =L"Description"; } } else { if (migration==w_computer || (migration==w_security || (migration==w_service || migration==w_reporting))) { InitInfo.cAttributesToFetch = 1; InitInfo.apwzAttributeNames = new PCWSTR[1]; InitInfo.apwzAttributeNames[0] =L"Description"; } else if (migration==w_account) { InitInfo.cAttributesToFetch = 2; InitInfo.apwzAttributeNames = new PCWSTR[2]; InitInfo.apwzAttributeNames[0] =L"sAMAccountName"; InitInfo.apwzAttributeNames[1] =L"Description"; } else if (migration==w_group || migration==w_groupmapping) { InitInfo.cAttributesToFetch = 2; InitInfo.apwzAttributeNames = new PCWSTR[2]; InitInfo.apwzAttributeNames[0] =L"sAMAccountName"; InitInfo.apwzAttributeNames[1] =L"Description"; } } if (multiselect) InitInfo.flOptions = DSOP_FLAG_MULTISELECT; HRESULT hr= pDsObjectPicker->Initialize(&InitInfo); delete [] InitInfo.apwzAttributeNames; return hr; } bool DC(WCHAR* computerName,CString sourceDomainController) { USER_INFO_1 * uinf1 = NULL; bool toreturn =false; NET_API_STATUS rc = NetUserGetInfo(sourceDomainController.GetBuffer(1000),computerName,1,(LPBYTE*)&uinf1); sourceDomainController.ReleaseBuffer(); if ( ! rc ) { if ( uinf1->usri1_flags & UF_SERVER_TRUST_ACCOUNT ) { toreturn = true; } NetApiBufferFree(&uinf1); } return toreturn; } bool inList(CString m_name) {CString temp; m_name.TrimLeft();m_name.TrimRight(); int length=m_listBox.GetItemCount(); for (int i=0;iGetData(&formatetc, &stgmedium); if (FAILED(hr)) return; fGotStgMedium = TRUE; pDsSelList = (PDS_SELECTION_LIST) GlobalLock(stgmedium.hGlobal); if (!pDsSelList) return; CString toinsert; WCHAR temp[10000]; CString samName; CString upnName; bool atleast1dc=false; bool continue1; PDOMAIN_CONTROLLER_INFOW pdomc; CString sourceDomainController; if (migration==w_computer) { HRESULT res = DsGetDcNameW(NULL,(LPCTSTR const)sourceNetbios,NULL,NULL, DS_DIRECTORY_SERVICE_PREFERRED,&pdomc); sourceDomainController=pdomc->DomainControllerName; } _bstr_t yo; int a, ndx; for (i = 0; i < pDsSelList->cItems; i++) { continue1=true; toinsert = pDsSelList->aDsSelection[i].pwzName; samName = pDsSelList->aDsSelection[i].pwzADsPath; upnName = pDsSelList->aDsSelection[i].pwzUPN; swprintf(temp,L"%s",(toinsert+L"$")); if (migration ==w_computer) { if (DC(temp,sourceDomainController)) { atleast1dc = true; continue1=false; } } if (!inList(samName)&&continue1) { a = m_listBox.GetItemCount(); ndx = m_listBox.InsertItem(a,toinsert); if (ndx == -1) continue; SetItemText(m_listBox,ndx,1,samName); _variant_t v; if (sourceIsNT4) { if (migration==w_computer || (migration==w_security || (migration==w_service || migration==w_reporting))) { } else if (migration==w_account) { v = pDsSelList->aDsSelection[i].pvarFetchedAttributes[0]; yo = (_bstr_t) v; SetItemText(m_listBox,ndx,2,yo); v = pDsSelList->aDsSelection[i].pvarFetchedAttributes[1]; yo = (_bstr_t) v; SetItemText(m_listBox,ndx,3,yo); } else if (migration==w_group || migration==w_groupmapping) { v = pDsSelList->aDsSelection[i].pvarFetchedAttributes[0]; yo = (_bstr_t) v; SetItemText(m_listBox,ndx,2,yo); } } else { if (migration==w_computer || (migration==w_security || (migration==w_service || migration==w_reporting))) { v = pDsSelList->aDsSelection[i].pvarFetchedAttributes[0]; yo = (_bstr_t) v; SetItemText(m_listBox,ndx,2,yo); } else if (migration==w_account) { v = pDsSelList->aDsSelection[i].pvarFetchedAttributes[0]; yo = (_bstr_t) v; SetItemText(m_listBox,ndx,2,yo); v = pDsSelList->aDsSelection[i].pvarFetchedAttributes[1]; yo = (_bstr_t) v; SetItemText(m_listBox,ndx,3,yo); SetItemText(m_listBox,ndx,4,upnName); } else if (migration==w_group || migration==w_groupmapping) { v = pDsSelList->aDsSelection[i].pvarFetchedAttributes[0]; yo = (_bstr_t) v; SetItemText(m_listBox,ndx,2,yo); v = pDsSelList->aDsSelection[i].pvarFetchedAttributes[1]; yo = (_bstr_t) v; SetItemText(m_listBox,ndx,3,yo); } } } } GlobalUnlock(stgmedium.hGlobal); if (fGotStgMedium) ReleaseStgMedium(&stgmedium); if (atleast1dc) MessageBoxWrapper(hwndDlg,IDS_MSG_DC,IDS_MSG_ERROR); } bool checkFile(HWND hwndDlg) { CString h;GetDlgItemText(hwndDlg,IDC_PASSWORD_FILE,h.GetBuffer(1000),1000);h.ReleaseBuffer(); CFileFind finder; bool exists = (finder.FindFile((LPCTSTR) h )!=0); if (exists) { finder.FindNextFile(); CString fullpath = finder.GetFilePath(); if (fullpath.GetLength() != 0) SetDlgItemText(hwndDlg, IDC_PASSWORD_FILE, (LPCTSTR)fullpath); return !(finder.IsReadOnly()!=FALSE); } else { //remove the file off the path int tosubtract = h.ReverseFind(L'\\'); int tosubtract2 = h.ReverseFind(L'/'); int final = (tosubtract > tosubtract2) ? tosubtract : tosubtract2; if ((final==-1) || ((final+1)==h.GetLength()))return false; CString dir = h.Left(final); CString filename = h.Right(h.GetLength()-final); //save the filename if ((dir.Right(1) == L':') && (validDir(dir))) return true; //call the helper function to make sure the path exists CString sResult = CreatePath(dir); if (sResult.GetLength()) { //readd the filename to the resulting full path sResult += filename; SetDlgItemText(hwndDlg, IDC_PASSWORD_FILE, (LPCTSTR)sResult); return true; } else return false; } } void ProcessSelectedObjects2(IDataObject *pdo,HWND hwndDlg) { HRESULT hr = S_OK; BOOL fGotStgMedium = FALSE; PDS_SELECTION_LIST pDsSelList = NULL; STGMEDIUM stgmedium = {TYMED_HGLOBAL, NULL, NULL}; FORMATETC formatetc = {(CLIPFORMAT) g_cfDsObjectPicker,NULL,DVASPECT_CONTENT,-1,TYMED_HGLOBAL}; hr = pdo->GetData(&formatetc, &stgmedium); if (FAILED(hr)) return; fGotStgMedium = TRUE; pDsSelList = (PDS_SELECTION_LIST) GlobalLock(stgmedium.hGlobal); if (!pDsSelList) return; SetDlgItemText(hwndDlg,IDC_TARGET_GROUP,pDsSelList->aDsSelection[0].pwzName); GlobalUnlock(stgmedium.hGlobal); if (fGotStgMedium) ReleaseStgMedium(&stgmedium); } void initpasswordbox(HWND hwndDlg,int id1,int id2,int id3, BSTR bstr1, BSTR bstr2) { _bstr_t text; text = pVarSet->get(bstr2); if (!UStrICmp(text,(WCHAR const *) yes)) { CheckRadioButton(hwndDlg,id1,id3,id3); } else { text = pVarSet->get(bstr1); if (!UStrICmp(text,(WCHAR const *) yes)) { CheckRadioButton(hwndDlg,id1,id3,id1); } else { CheckRadioButton(hwndDlg,id1,id3,id2); } } } void initdisablesrcbox(HWND hwndDlg) { _bstr_t text; CString toformat; //init disable src checkbox initcheckbox(hwndDlg,IDC_SRC_DISABLE_ACCOUNTS,DCTVS_AccountOptions_DisableSourceAccounts); //set whether to expire accounts text = pVarSet->get(GET_BSTR(DCTVS_AccountOptions_ExpireSourceAccounts)); //if invalid expire time, don't check it, set to 30 days, and disable the //other sub controls if ((!UStrICmp(text, L"")) || ((_wtol(text) == 0) && (UStrICmp(text,L"0"))) || (_wtol(text) > THREE_YEARS)) { CheckDlgButton(hwndDlg, IDC_SRC_EXPIRE_ACCOUNTS, BST_UNCHECKED); toformat.LoadString(IDS_30); SetDlgItemText(hwndDlg,IDC_yo,toformat); calculateDate(hwndDlg,toformat); disable(hwndDlg,IDC_yo); disable(hwndDlg,IDC_DATE); disable(hwndDlg,IDC_TEXT); } else //else, check it, set to valid days, and enable sub controls { CheckDlgButton(hwndDlg, IDC_SRC_EXPIRE_ACCOUNTS, BST_CHECKED); toformat = (WCHAR*)text; SetDlgItemText(hwndDlg,IDC_yo,toformat); calculateDate(hwndDlg,toformat); enable(hwndDlg,IDC_yo); enable(hwndDlg,IDC_DATE); enable(hwndDlg,IDC_TEXT); } } void inittgtstatebox(HWND hwndDlg) { _bstr_t text; //if "Same as source" was set, check it text = pVarSet->get(GET_BSTR(DCTVS_AccountOptions_TgtStateSameAsSrc)); if (!UStrICmp(text,(WCHAR const *) yes)) CheckRadioButton(hwndDlg,IDC_TGT_ENABLE_ACCOUNTS,IDC_TGT_SAME_AS_SOURCE,IDC_TGT_SAME_AS_SOURCE); else //else set enable tgt or disable tgt { text = pVarSet->get(GET_BSTR(DCTVS_AccountOptions_DisableCopiedAccounts)); if (!UStrICmp(text,(WCHAR const *) yes)) CheckRadioButton(hwndDlg,IDC_TGT_ENABLE_ACCOUNTS,IDC_TGT_SAME_AS_SOURCE,IDC_TGT_DISABLE_ACCOUNTS); else CheckRadioButton(hwndDlg,IDC_TGT_ENABLE_ACCOUNTS,IDC_TGT_SAME_AS_SOURCE,IDC_TGT_ENABLE_ACCOUNTS); } } void addrebootValues(HWND hwndDlg) { HWND hLC3= GetDlgItem(hwndDlg,IDC_COMBO2); m_rebootBox.Attach(hLC3); m_rebootBox.AddString(GET_CSTRING(IDS_ONE)); m_rebootBox.AddString(GET_CSTRING(IDS_FIVE)); m_rebootBox.AddString(GET_CSTRING(IDS_TEN)); } void inittranslationbox(HWND hwndDlg,int id1,int id2,int id3,int i,bool sameForest) { _bstr_t text; text = pVarSet->get(GET_BSTR(i)); _bstr_t b=pVarSet->get(GET_BSTR(DCTVS_Options_SourceDomainDns)); HRESULT hr; if (sameForest && targetNativeMode(b,hr)) { CheckRadioButton(hwndDlg,id1,id3,id1); disable(hwndDlg,id2); disable(hwndDlg,id3); } else { //* if (!UStrICmp(text,L"Replace")) if (!UStrICmp(text,GET_STRING(IDS_Replace))) CheckRadioButton(hwndDlg,id1,id3,id1); //* else if (!UStrICmp(text,L"Add")) else if (!UStrICmp(text,GET_STRING(IDS_Add))) CheckRadioButton(hwndDlg,id1,id3,id2); //* else if (!UStrICmp(text,L"Remove")) else if (!UStrICmp(text,GET_STRING(IDS_Remove))) CheckRadioButton(hwndDlg,id1,id3,id3); else CheckRadioButton(hwndDlg,id1,id3,id1); } } void handleDB() { put(DCTVS_Options_Credentials_Password,L""); put(DCTVS_AccountOptions_SidHistoryCredentials_Password,L""); put(DCTVS_GatherInformation, L""); db->SaveSettings(IUnknownPtr(pVarSet)); } void populateTime(long rebootDelay,int servers ) { _variant_t varX; CString temp; CString typeExtension; time_t ltime; if (migration==w_computer) { time(<ime); rebootDelay = rebootDelay; temp.Format(L"%d",rebootDelay); varX = temp; for (int i =0;iput(_bstr_t(typeExtension), varX); typeExtension.Format(L"Servers.%d.Reboot",i); pVarSet->put(_bstr_t(typeExtension),yes); } } } void initcheckbox(HWND hwndDlg,int id,int varsetKey) { _bstr_t text; text = pVarSet->get(GET_BSTR(varsetKey)); CheckDlgButton( hwndDlg,id, !UStrICmp(text,(WCHAR const * ) yes)); } void initeditbox(HWND hwndDlg,int id,int varsetKey) { _bstr_t text; text = pVarSet->get(GET_BSTR(varsetKey)); SetDlgItemText( hwndDlg,id, (WCHAR const *) text); } void checkbox(HWND hwndDlg,int id,int varsetKey) { _variant_t varX; varX = IsDlgButtonChecked( hwndDlg,id) ? yes : no; pVarSet->put(GET_BSTR(varsetKey), varX); } void editbox(HWND hwndDlg,int id,int varsetKey) { _variant_t varX; CString temp; GetDlgItemText( hwndDlg, id, temp.GetBuffer(1000),1000); temp.ReleaseBuffer(); varX = temp; pVarSet->put(GET_BSTR(varsetKey), varX); } void translationbox(HWND hwndDlg,int id1,int id2,int id3,int varsetKey) { _variant_t varX; if (IsDlgButtonChecked( hwndDlg, id1)) //* varX = L"Replace"; varX = GET_STRING(IDS_Replace); else if(IsDlgButtonChecked( hwndDlg, id2)) //* varX = L"Add"; varX = GET_STRING(IDS_Add); else if (IsDlgButtonChecked( hwndDlg, id3)) //* varX = L"Remove"; varX = GET_STRING(IDS_Remove); pVarSet->put(GET_BSTR(varsetKey), varX); } long rebootbox(HWND hwndDlg,int id) { _variant_t varX; int rebootDelay; if (IsDlgItemEmpty(hwndDlg,id)) rebootDelay=0; else { CString rebooter; GetDlgItemText( hwndDlg, id, rebooter.GetBuffer(1000), 1000); rebooter.ReleaseBuffer(); rebootDelay = _ttoi(rebooter.GetBuffer(1000)); rebooter.ReleaseBuffer(); } rebootDelay =rebootDelay*60; return rebootDelay; } void populateList(CComboBox& s) { DWORD fndNet=0; // number of nets found DWORD rcNet; // net enum return code HANDLE eNet; // enumerate net domains EaWNetDomainInfo iNet; // net domain info rcNet = EaWNetDomainEnumOpen( &eNet ); if (!rcNet ) { for ( rcNet = EaWNetDomainEnumFirst( eNet, &iNet ); !rcNet; rcNet = EaWNetDomainEnumNext( eNet, &iNet ) ) { fndNet++; s.AddString(iNet.name); } EaWNetDomainEnumClose( eNet ); } } void enable(HWND hwndDlg,int id) { HWND temp=GetDlgItem(hwndDlg,id); EnableWindow(temp,true); } void disable(HWND hwndDlg,int id) { HWND temp=GetDlgItem(hwndDlg,id); EnableWindow(temp,false); } void handleInitRename(HWND hwndDlg,bool sameForest,bool bCopyGroups) { _bstr_t text1,text2,text3; text1 = get(DCTVS_AccountOptions_ReplaceExistingAccounts); text2 = get(DCTVS_AccountOptions_Prefix); text3 = get(DCTVS_AccountOptions_Suffix); initeditbox(hwndDlg,IDC_PREFIX,DCTVS_AccountOptions_Prefix ); initeditbox(hwndDlg,IDC_SUFFIX,DCTVS_AccountOptions_Suffix ); initcheckbox(hwndDlg,IDC_REMOVE_EXISTING_USER_RIGHTS,DCTVS_AccountOptions_RemoveExistingUserRights); initcheckbox(hwndDlg,IDC_REMOVE_EXISTING_LOCATION,DCTVS_AccountOptions_MoveReplacedAccounts); if ((migration==w_computer) || (!bCopyGroups)) { disable(hwndDlg,IDC_REPLACE_EXISTING_GROUP_MEMBERS); CheckDlgButton( hwndDlg,IDC_REPLACE_EXISTING_GROUP_MEMBERS,false); } else { enable(hwndDlg,IDC_REPLACE_EXISTING_GROUP_MEMBERS); initcheckbox(hwndDlg,IDC_REPLACE_EXISTING_GROUP_MEMBERS,DCTVS_AccountOptions_ReplaceExistingGroupMembers); } if (!UStrICmp(text1,(WCHAR const *) yes)) CheckRadioButton(hwndDlg,IDC_SKIP_CONFLICTING_ACCOUNTS,IDC_RENAME_CONFLICTING_ACCOUNTS,IDC_REPLACE_CONFLICTING_ACCOUNTS); else if (UStrICmp(text2,L"") || UStrICmp(text3,L"")) CheckRadioButton(hwndDlg,IDC_SKIP_CONFLICTING_ACCOUNTS,IDC_RENAME_CONFLICTING_ACCOUNTS,IDC_RENAME_CONFLICTING_ACCOUNTS); else CheckRadioButton(hwndDlg,IDC_SKIP_CONFLICTING_ACCOUNTS,IDC_RENAME_CONFLICTING_ACCOUNTS,IDC_SKIP_CONFLICTING_ACCOUNTS); if (IsDlgButtonChecked(hwndDlg,IDC_REPLACE_CONFLICTING_ACCOUNTS) && ((sameForest) && migration !=w_computer)) { CheckRadioButton(hwndDlg,IDC_SKIP_CONFLICTING_ACCOUNTS,IDC_RENAME_CONFLICTING_ACCOUNTS,IDC_SKIP_CONFLICTING_ACCOUNTS); disable(hwndDlg,IDC_REPLACE_CONFLICTING_ACCOUNTS); } else if (sameForest && migration !=w_computer) disable(hwndDlg,IDC_REPLACE_CONFLICTING_ACCOUNTS); } void MessageBoxWrapper(HWND hwndDlg,int m,int t) { CString message; CString title; message.LoadString(m); title.LoadString(t); MessageBox(hwndDlg,message,title,MB_OK | MB_ICONSTOP); } void MessageBoxWrapper3(HWND hwndDlg,int m,int t,CString domainName) { CString message; CString title; message.LoadString(m); title.LoadString(t); CString messageFormatter; messageFormatter.LoadString(IDS_FORMAT_MESSAGE); CString text; text.Format(messageFormatter,message,domainName); MessageBox(hwndDlg,text,title,MB_OK|MB_ICONSTOP); } void MessageBoxWrapperFormat1(HWND hwndDlg,int f,int m, int t) { CString formatter; CString insert; CString message; CString title; formatter.LoadString(f); insert.LoadString(m); message.Format(formatter,insert); title.LoadString(t); MessageBox(hwndDlg,message,title,MB_OK | MB_ICONSTOP); } HRESULT BrowseForContainer(HWND hWnd,//Handle to window that should own the browse dialog. LPOLESTR szRootPath, //Root of the browse tree. NULL for entire forest. LPOLESTR *ppContainerADsPath, //Return the ADsPath of the selected container. LPOLESTR *ppContainerClass //Return the ldapDisplayName of the container's class. ) { HRESULT hr = E_FAIL; DSBROWSEINFO dsbi; OLECHAR szPath[5000]; OLECHAR szClass[MAX_PATH]; DWORD result; if (!ppContainerADsPath) return E_POINTER; ::ZeroMemory( &dsbi, sizeof(dsbi) ); dsbi.hwndOwner = hWnd; dsbi.cbStruct = sizeof (DSBROWSEINFO); CString temp1,temp2; temp1.LoadString(IDS_BROWSER); temp2.LoadString(IDS_SELECTOR); dsbi.pszCaption = temp1.GetBuffer(1000); temp1.ReleaseBuffer(); dsbi.pszTitle = temp2.GetBuffer(1000); temp2.ReleaseBuffer(); // L"Browse for Container"; // The caption (titlebar text) // dsbi.pszTitle = L"Select a target container."; //Text for the dialog. dsbi.pszRoot = szRootPath; //ADsPath for the root of the tree to display in the browser. //Specify NULL with DSBI_ENTIREDIRECTORY flag for entire forest. //NULL without DSBI_ENTIREDIRECTORY flag displays current domain rooted at LDAP. dsbi.pszPath = szPath; //Pointer to a unicode string buffer. dsbi.cchPath = sizeof(szPath)/sizeof(OLECHAR);//count of characters for buffer. dsbi.dwFlags = DSBI_RETURN_FORMAT | //Return the path to object in format specified in dwReturnFormat DSBI_RETURNOBJECTCLASS; //Return the object class dsbi.pfnCallback = NULL; dsbi.lParam = 0; dsbi.dwReturnFormat = ADS_FORMAT_X500; //Specify the format. //This one returns an ADsPath. See ADS_FORMAT enum in IADS.H dsbi.pszObjectClass = szClass; //Pointer to a unicode string buffer. dsbi.cchObjectClass = sizeof(szClass)/sizeof(OLECHAR);//count of characters for buffer. //if root path is NULL, make the forest the root. if (!szRootPath) dsbi.dwFlags |= DSBI_ENTIREDIRECTORY; //Display browse dialog box. result = DsBrowseForContainerX( &dsbi ); // returns -1, 0, IDOK or IDCANCEL if (result == IDOK) { //Allocate memory for string *ppContainerADsPath = (OLECHAR *)CoTaskMemAlloc (sizeof(OLECHAR)*(wcslen(szPath)+1)); if (*ppContainerADsPath) { hr = S_OK; wcscpy(*ppContainerADsPath, szPath); //Caller must free using CoTaskMemFree //if the domain was selected, add the DC= stuff CString sNewPath = szPath; if (sNewPath.Find(L"DC=") == -1) { //try retrieving the ADsPath of the containier, which does include //the full LDAP path with DC= IADsPtr pCont; BSTR sAdsPath; hr = ADsGetObject(sNewPath,IID_IADs,(void**)&pCont); if (SUCCEEDED(hr)) { hr = pCont->get_ADsPath(&sAdsPath); if (SUCCEEDED(hr)) { sNewPath = (WCHAR*)sAdsPath; SysFreeString(sAdsPath); CoTaskMemFree(*ppContainerADsPath); *ppContainerADsPath = (OLECHAR *)CoTaskMemAlloc (sizeof(OLECHAR)*(sNewPath.GetLength()+1)); if (*ppContainerADsPath) wcscpy(*ppContainerADsPath, (LPCTSTR)sNewPath); else hr=E_FAIL; } } } } else hr=E_FAIL; if (ppContainerClass) { //Allocate memory for string *ppContainerClass = (OLECHAR *)CoTaskMemAlloc (sizeof(OLECHAR)*(wcslen(szClass)+1)); if (*ppContainerClass) { wcscpy(*ppContainerClass, szClass); //Call must free using CoTaskMemFree hr = S_OK; } else hr=E_FAIL; } } else hr = E_FAIL; return hr; } /* typedef HRESULT (CALLBACK * DSGETDCNAME)(LPWSTR, LPWSTR, GUID*, LPWSTR, DWORD, PDOMAIN_CONTROLLER_INFO*); // The following function is used to get the actual account name from the source domain // instead of account that contains the SID in its SID history. DWORD GetName(PSID pObjectSID, WCHAR * sNameAccount, WCHAR * sDomain) { DWORD cb = 255; DWORD cbDomain = 255; DWORD tempVal; PDWORD psubAuth; PUCHAR pVal; SID_NAME_USE sid_Use; WCHAR sDC[255]; DWORD rc = 0; // Copy the Sid to a temp SID DWORD sidLen = GetLengthSid(pObjectSID); PSID pObjectSID1 = new BYTE[sidLen]; CopySid(sidLen, pObjectSID1, pObjectSID); // Get the RID out of the SID and get the domain SID pVal = GetSidSubAuthorityCount(pObjectSID1); (*pVal)--; psubAuth = GetSidSubAuthority(pObjectSID1, *pVal); tempVal = *psubAuth; *psubAuth = -1; //Lookup the domain from the SID if (!LookupAccountSid(NULL, pObjectSID1, sNameAccount, &cb, sDomain, &cbDomain, &sid_Use)) { rc = GetLastError(); // err.SysMsgWrite(ErrE, rc,DCT_MSG_DOMAIN_LOOKUP_FAILED_D,rc); return rc; } // Get a DC for the domain DSGETDCNAME DsGetDcName = NULL; DOMAIN_CONTROLLER_INFO * pSrcDomCtrlInfo = NULL; HMODULE hPro = LoadLibrary(L"NetApi32.dll"); if ( hPro ) DsGetDcName = (DSGETDCNAME)GetProcAddress(hPro, "DsGetDcNameW"); else { long rc = GetLastError(); // err.SysMsgWrite(ErrE, rc, DCT_MSG_LOAD_LIBRARY_FAILED_SD, L"NetApi32.dll"); } if (DsGetDcName) { if ( DsGetDcName( NULL ,// LPCTSTR ComputerName ? sDomain ,// LPCTSTR DomainName NULL ,// GUID *DomainGuid ? NULL ,// LPCTSTR SiteName ? 0 ,// ULONG Flags ? &pSrcDomCtrlInfo // PDOMAIN_CONTROLLER_INFO *DomainControllerInfo )) { // err.SysMsgWrite(ErrE,GetLastError(),DCT_MSG_GET_DCNAME_FAILED_SD,sDomain,GetLastError()); return GetLastError(); } else { wcscpy(sDC, pSrcDomCtrlInfo->DomainControllerName); NetApiBufferFree(pSrcDomCtrlInfo); } // Reset the sizes cb = 255; cbDomain = 255; // Lookup the account on the PDC that we found above. if ( LookupAccountSid(sDC, pObjectSID, sNameAccount, &cb, sDomain, &cbDomain, &sid_Use) == 0) { return GetLastError(); } } FreeLibrary(hPro); return 0; } */ BOOL GetDomainAndUserFromUPN(WCHAR const * UPNname,CString& domainNetbios, CString& user) { HRESULT hr; HINSTANCE hLibrary = NULL; DSCRACKNAMES * DsCrackNames = NULL; DSFREENAMERESULT * DsFreeNameResult = NULL; DSBINDFUNC DsBind = NULL; DSUNBINDFUNC DsUnBind = NULL; HANDLE hDs = NULL; BOOL bConverted = FALSE; CString resultStr; CString sDomainDNS; // make sure the account name is in UPN format if ( NULL != wcschr(UPNname,L'\\') ) return FALSE; hLibrary = LoadLibrary(L"NTDSAPI.DLL"); if ( hLibrary ) { DsBind = (DSBINDFUNC)GetProcAddress(hLibrary,"DsBindW"); DsUnBind = (DSUNBINDFUNC)GetProcAddress(hLibrary,"DsUnBindW"); DsCrackNames = (DSCRACKNAMES *)GetProcAddress(hLibrary,"DsCrackNamesW"); DsFreeNameResult = (DSFREENAMERESULT *)GetProcAddress(hLibrary,"DsFreeNameResultW"); } if ( DsBind && DsUnBind && DsCrackNames && DsFreeNameResult) { sDomainDNS = targetDNS; hr = (*DsBind)(NULL,sDomainDNS.GetBuffer(1000),&hDs); sDomainDNS.ReleaseBuffer(); if ( !hr ) { PDS_NAME_RESULT pNamesOut = NULL; WCHAR * pNamesIn[1]; pNamesIn[0] = const_cast(UPNname); hr = (*DsCrackNames)(hDs,DS_NAME_NO_FLAGS,DS_USER_PRINCIPAL_NAME,DS_NT4_ACCOUNT_NAME,1,pNamesIn,&pNamesOut); (*DsUnBind)(&hDs); if ( !hr ) { if (pNamesOut->rItems[0].status == DS_NAME_NO_ERROR) { resultStr = pNamesOut->rItems[0].pName; int index = resultStr.Find(L'\\'); if (index != -1) domainNetbios = resultStr.Left(index); //parse off the domain netbios name if (!domainNetbios.IsEmpty()) { //get the user's sAMAccountName user = resultStr.Right(resultStr.GetLength() - index - 1); if (!user.IsEmpty()) bConverted = TRUE; } } else if (pNamesOut->rItems[0].status == DS_NAME_ERROR_DOMAIN_ONLY) { sDomainDNS = pNamesOut->rItems[0].pDomain; hr = (*DsBind)(NULL,sDomainDNS.GetBuffer(1000),&hDs); sDomainDNS.ReleaseBuffer(); if ( !hr ) { (*DsFreeNameResult)(pNamesOut); pNamesOut = NULL; hr = (*DsCrackNames)(hDs,DS_NAME_NO_FLAGS,DS_USER_PRINCIPAL_NAME,DS_NT4_ACCOUNT_NAME,1,pNamesIn,&pNamesOut); if ( !hr ) { if ( pNamesOut->rItems[0].status == DS_NAME_NO_ERROR ) { resultStr = pNamesOut->rItems[0].pName; int index = resultStr.Find(L'\\'); if (index != -1) domainNetbios = resultStr.Left(index); //parse off the domain netbios name if (!domainNetbios.IsEmpty()) { //get the user's sAMAccountName user = resultStr.Right(resultStr.GetLength() - index - 1); if (!user.IsEmpty()) bConverted = TRUE; } }//end if no error }//end if name cracked (*DsUnBind)(&hDs); }//end if bound to other domain } if (pNamesOut) (*DsFreeNameResult)(pNamesOut); }//end if name cracked }//end if bound to target domain }//end got functions if ( hLibrary ) { FreeLibrary(hLibrary); } return bConverted; } /********************************************************************* * * * Written by: Paul Thompson * * Date: 31 AUG 2000 * * * * This function is responsible for switching between showing the* * password file editbox and the password dc combobox. * * * *********************************************************************/ //BEGIN switchboxes void switchboxes(HWND hwndDlg,int oldid, int newid) { /* local variables */ CWnd oldWnd; CWnd newWnd; /* function body */ oldWnd.Attach(GetDlgItem(hwndDlg, oldid)); newWnd.Attach(GetDlgItem(hwndDlg, newid)); oldWnd.ShowWindow(SW_HIDE); newWnd.ShowWindow(SW_SHOW); oldWnd.Detach(); newWnd.Detach(); } //END switchboxes /********************************************************************* * * * Written by: Paul Thompson * * Date: 31 AUG 2000 * * * * This function is responsible for enumerating all DCs in the * * given source domain and add them into the source domain combobox. * * * *********************************************************************/ //BEGIN populatePasswordDCs bool populatePasswordDCs(HWND hwndDlg, int id, bool bNT4) { /* local variables */ CComboBox pwdCombo; CString aDCName; CString aDnName; IEnumVARIANT * pEnumerator = NULL; VARIANT var; POSITION currentPos; HRESULT hr = S_OK; /* function body */ VariantInit(&var); pwdCombo.Attach(GetDlgItem(hwndDlg, id)); //if we already have a list of DCs for this domain then add them if (!DCList.IsEmpty()) { //get the position and string of the first name in the list currentPos = DCList.GetHeadPosition(); //while there is another entry to retrieve from the list, then //get a name from the list and add it to the combobox while (currentPos != NULL) { //get the next string in the list, starts with the first aDCName = DCList.GetNext(currentPos); if (pwdCombo.FindString(-1, aDCName) == CB_ERR) pwdCombo.AddString(aDCName);//add the DC to the combobox } } else //else enumerate DCs in the domain and add them { pwdCombo.ResetContent();//reset the combobox contents //enumerate all domain controllers in the given domain if (bNT4) hr = QueryNT4DomainControllers(sourceDNS, pEnumerator); else hr = QueryW2KDomainControllers(sourceDNS, pEnumerator); if (SUCCEEDED(hr)) { unsigned long count = 0; //for each computer see if a DC. If so, add to combobox while ( pEnumerator->Next(1,&var,&count) == S_OK ) { //get the sam account name for this computer if ( var.vt == ( VT_ARRAY | VT_VARIANT ) ) { VARIANT * pData; _variant_t vnt; _bstr_t abstr; SafeArrayAccessData(var.parray,(void**)&pData); // pData[0] has the sam account name list vnt.Attach(pData[0]); abstr = _bstr_t(vnt); aDCName = (WCHAR *)abstr; vnt.Detach(); SafeArrayUnaccessData(var.parray); //computer sAMAccountNames end in $, lets get rid of that int length = aDCName.GetLength(); if (aDCName[length-1] == L'$') aDCName = aDCName.Left(length-1); //add the DC to the combobox and the memory list, if not in already if (pwdCombo.FindString(-1, aDCName) == CB_ERR) pwdCombo.AddString(aDCName); if (DCList.Find(aDCName) == NULL) DCList.AddTail(aDCName); } }//end while more computers pEnumerator->Release(); } }//end if must get DCs pwdCombo.Detach(); if (hr == S_OK) return true; else return false; } //END populatePasswordDCs /********************************************************************* * * * Written by: Paul Thompson * * Date: 1 SEPT 2000 * * * * This worker function is responsible for enumerating all domain* * controllers in the given Windows 2000 domain. The variant array * * passed back is filled with the sAMAccountName for each domain * * controller. * * * *********************************************************************/ //BEGIN QueryW2KDomainControllers HRESULT QueryW2KDomainControllers(CString domainDNS, IEnumVARIANT*& pEnum) { CString sQuery; WCHAR sCont[MAX_PATH]; SAFEARRAY * colNames; SAFEARRAYBOUND bd = { 1, 0 }; HRESULT hr = S_OK; try { INetObjEnumeratorPtr pQuery(__uuidof(NetObjEnumerator)); //query for all domain controllers in the domain sQuery = L"(&(objectCategory=Computer)"; sQuery += L"(userAccountControl:"; sQuery += LDAP_MATCHING_RULE_BIT_AND_W; sQuery += L":=8192))"; wsprintf(sCont, L"LDAP://%s", domainDNS); //set columns to retrieve sAMAccountName colNames = SafeArrayCreate(VT_BSTR, 1, &bd); long ndx[1]; ndx[0] = 0; SafeArrayPutElement(colNames,ndx,SysAllocString(L"sAMAccountName")); //prepare and execute the query pQuery->SetQuery(sCont, _bstr_t(domainDNS), _bstr_t(sQuery), ADS_SCOPE_SUBTREE, FALSE); pQuery->SetColumns(colNames); pQuery->Execute(&pEnum); } catch(_com_error& e) { hr = e.Error(); } catch(...) { hr = E_FAIL; } return hr; } //END QueryW2KDomainControllers /********************************************************************* * * * Written by: Paul Thompson * * Date: 1 SEPT 2000 * * * * This worker function is responsible for enumerating all domain* * controllers in the given Windows NT4 domain. The variant array * * passed back is filled with the sAMAccountName for each domain * * controller. * * * *********************************************************************/ //BEGIN QueryNT4DomainControllers HRESULT QueryNT4DomainControllers(CString domainDNS, IEnumVARIANT*& pEnum) { CString sCont; SAFEARRAY * colNames; SAFEARRAYBOUND bd = { 1, 0 }; HRESULT hr = S_OK; try { INetObjEnumeratorPtr pQuery(__uuidof(NetObjEnumerator)); sCont = L"CN=DOMAIN CONTROLLERS"; //set columns to retrieve sAMAccountName colNames = SafeArrayCreate(VT_BSTR, 1, &bd); long ndx[1]; ndx[0] = 0; SafeArrayPutElement(colNames,ndx,SysAllocString(L"sAMAccountName")); //prepare and execute the query pQuery->SetQuery(_bstr_t(sCont), _bstr_t(domainDNS), L"", ADS_SCOPE_SUBTREE, FALSE); pQuery->SetColumns(colNames); pQuery->Execute(&pEnum); } catch(_com_error& e) { hr = e.Error(); } catch(...) { hr = E_FAIL; } return hr; } //END QueryNT4DomainControllers /********************************************************************* * * * Written by: Paul Thompson * * Date: 1 SEPT 2000 * * * * This function is responsible for adding a given string to a * * given combobox, if that string is not already in the combobox. * * * *********************************************************************/ //BEGIN addStringToComboBox void addStringToComboBox(HWND hwndDlg, int id, CString s) { /* local variables */ CComboBox pwdCombo; /* function body */ //if the DC starts with "\\", then remove them if (!UStrICmp(s,L"\\\\",UStrLen(L"\\\\"))) s = s.Right(s.GetLength() - UStrLen(L"\\\\")); pwdCombo.Attach(GetDlgItem(hwndDlg, id)); if (pwdCombo.FindString(-1, s) == CB_ERR) pwdCombo.AddString(s);//add the string to the combobox pwdCombo.Detach(); } //END addStringToComboBox /********************************************************************* * * * Written by: Paul Thompson * * Date: 1 SEPT 2000 * * * * This function is responsible for selecting a string in a given* * combobox. If we previously had a DC selected for this domain in * * the varset, we select it. If not, then we set it to the DC found * * in the Domain Selection dialog. * * * *********************************************************************/ //BEGIN initDCcombobox void initDCcombobox(HWND hwndDlg, int id, int varsetKey) { /* local variables */ CComboBox pwdCombo; CString prevDC; CString sTemp; _bstr_t text; /* function body */ //strip the "\\" off the sourceDC default in case we need it if (!UStrICmp(sourceDC,L"\\\\",UStrLen(L"\\\\"))) sTemp = sourceDC.Right(sourceDC.GetLength() - UStrLen(L"\\\\")); pwdCombo.Attach(GetDlgItem(hwndDlg, id)); //get a previous DC text = pVarSet->get(GET_BSTR(varsetKey)); prevDC = (WCHAR *)text; prevDC.TrimLeft();prevDC.TrimRight(); //if not previous DC, use the one found during the Domain Selection if (prevDC.IsEmpty()) prevDC = sTemp; //select string in combobox if (pwdCombo.SelectString(-1, prevDC) == CB_ERR) pwdCombo.SelectString(-1, sTemp); pwdCombo.Detach(); } //END initDCcombobox /********************************************************************* * * * Written by: Paul Thompson * * Date: 3 OCT 2000 * * * * This function is responsible for initializing the Security * * Translation Input dialog's radio buttons based on any previous * * settings. * * * *********************************************************************/ //BEGIN initsecinputbox void initsecinputbox(HWND hwndDlg,int id1,int id2,int varsetKey) { _bstr_t text; text = pVarSet->get(GET_BSTR(varsetKey)); if (!UStrICmp(text,(WCHAR const *) yes)) CheckRadioButton(hwndDlg,id1,id2,id1); else CheckRadioButton(hwndDlg,id1,id2,id2); } //END initsecinputbox /********************************************************************* * * * Written by: Paul Thompson * * Date: 3 OCT 2000 * * * * This function is responsible for displaying and handling the * * map file browse dialog. * * * *********************************************************************/ //BEGIN OnMapFileBrowse void OnMapFileBrowse(HWND hwndDlg,int id) { CWnd yo ; yo.Attach(hwndDlg); CFileDialog f(TRUE, NULL, NULL, OFN_LONGNAMES | OFN_NOREADONLYRETURN, (L"Text Files (*.csv;*.txt)|*.csv;*.txt|All Files (*.*)|*.*||"), &yo); if ( f.DoModal() == IDOK ) { SetDlgItemText(hwndDlg,id,f.GetPathName()); } yo.Detach(); } //END OnMapFileBrowse /********************************************************************* * * * Written by: Paul Thompson * * Date: 3 OCT 2000 * * * * This function is responsible for checking to see if the file * * specified in the edit box on the given dialog is a valid file. We* * will set the full path of the file if a relative path was given. * * * *********************************************************************/ //BEGIN checkMapFile bool checkMapFile(HWND hwndDlg) { CString h;GetDlgItemText(hwndDlg,IDC_MAPPING_FILE,h.GetBuffer(1000),1000);h.ReleaseBuffer(); CFileFind finder; bool exists = (finder.FindFile((LPCTSTR) h )!=0); if (exists) { BOOL bmore = finder.FindNextFile();//must call to fill in path info CString fullpath = finder.GetFilePath(); if (fullpath.GetLength() != 0) SetDlgItemText(hwndDlg,IDC_MAPPING_FILE,fullpath); } return exists; } //END checkMapFile /********************************************************************* * * * Written by: Paul Thompson * * Date: 25 OCT 2000 * * * * This function is responsible for initializing the object * * property exclusion dialog. * * This function adds all common schema properties for the object* * type to the listboxes. Previously excluded properties will be * * placed in the excluded listbox and all other will be placed in the* * included listbox. Since more than one object is allowable, we * * have a combobox that holds the objects whose properties can be * * enumerated, and the listboxes show the properties for the object * * selected in the combobox. * * * *********************************************************************/ //BEGIN initpropdlg void initpropdlg(HWND hwndDlg) { /* local constants */ const WCHAR DELIMITER[3] = L",\0";//used to seperate names in the string /* local variables */ CListBox propIncList; CListBox propExcList; CComboBox typeCombo; CString sPropName; CString sPropOID; CString sType2; CString sExList1; CString sExList2 = L""; CString Type1, Type2 = L""; CStringList ExList1, ExList2; _bstr_t text; HRESULT hr; long srcVer = 5; POSITION currentPos; /* function body */ CWaitCursor wait; /* get list(s) of previously excluded properties and set type related variables */ if (migration==w_computer) { //get the previous computer exclusion list text = pVarSet->get(GET_BSTR(DCTVS_AccountOptions_ExcludedComputerProps)); sExList1 = (WCHAR *)text; Type1 = L"computer"; //set the type to computer //set the parent text sType1 = GET_STRING(IDS_COMPUTERPROPS); } else if (migration==w_account) { //get the previous user exclusion list text = pVarSet->get(GET_BSTR(DCTVS_AccountOptions_ExcludedUserProps)); sExList1 = (WCHAR *)text; //if also migrating groups, set 2nd parent information text = pVarSet->get(GET_BSTR(DCTVS_AccountOptions_CopyMemberOf)); if (!UStrICmp((WCHAR*)text,(WCHAR const *) yes)) { //get the previous group exclusion list text = pVarSet->get(GET_BSTR(DCTVS_AccountOptions_ExcludedGroupProps)); sExList2 = (WCHAR *)text; Type2 = L"group"; //set 2nd type to group //set 2nd parent text sType2 = GET_STRING(IDS_GROUPPROPS); } Type1 = L"user"; //set type to user //set the parent text sType1 = GET_STRING(IDS_USERPROPS); } else if (migration==w_group || migration==w_groupmapping) { //get the previous group exclusion list text = pVarSet->get(GET_BSTR(DCTVS_AccountOptions_ExcludedGroupProps)); sExList1 = (WCHAR *)text; //if also migrating users, set 2nd parent information text = pVarSet->get(GET_BSTR(DCTVS_AccountOptions_CopyContainerContents)); if (!UStrICmp((WCHAR*)text,(WCHAR const *) yes)) { //get the previous user exclusion list text = pVarSet->get(GET_BSTR(DCTVS_AccountOptions_ExcludedUserProps)); sExList2 = (WCHAR *)text; Type2 = L"user"; //set 2nd type to user //set 2nd parent text sType2 = GET_STRING(IDS_USERPROPS); } Type1 = L"group"; //set type to group //set the parent text sType1 = GET_STRING(IDS_GROUPPROPS); } /* place comma seperated exclusion strings parts into lists */ //place each substring in the 1st exclusion string into a list if (!sExList1.IsEmpty()) { CString sTemp = sExList1; WCHAR* pStr = sTemp.GetBuffer(0); WCHAR* pTemp = wcstok(pStr, DELIMITER); while (pTemp != NULL) { ExList1.AddTail(pTemp); //get the next item pTemp = wcstok(NULL, DELIMITER); } sTemp.ReleaseBuffer(); } //place each substring in the 2nd exclusion string into a list if (!sExList2.IsEmpty()) { CString sTemp = sExList2; WCHAR* pStr = sTemp.GetBuffer(0); WCHAR* pTemp = wcstok(pStr, DELIMITER); while (pTemp != NULL) { ExList2.AddTail(pTemp); //get the next item pTemp = wcstok(NULL, DELIMITER); } sTemp.ReleaseBuffer(); } /* place the type(s) in the combobox */ typeCombo.Attach(GetDlgItem(hwndDlg, IDC_OBJECTCMBO)); typeCombo.ResetContent(); typeCombo.InsertString(-1, sType1); if (!sType2.IsEmpty()) typeCombo.InsertString(-1, sType2); //select type 1 in the combobox typeCombo.SelectString(-1, sType1); typeCombo.Detach(); //get a list of all properties names and their OIDs for this object type PropIncMap1.RemoveAll(); PropExcMap1.RemoveAll(); hr = BuildPropertyMap(Type1, srcVer, &PropIncMap1); /* remove excluded properties from the inclusion map and place that property in the exclusion map */ if (!ExList1.IsEmpty()) { //get the position and string of the first property in the previous //exclusion list currentPos = ExList1.GetHeadPosition(); //while there is another entry to retrieve from the list, then //get a property name from the list,remove it from the inclusion map, and //place it in the exclusion list while (currentPos != NULL) { //get the next string in the list, starts with the first sPropName = ExList1.GetNext(currentPos); //if we find the property in the inclusion map, remove it and //add to the exclusion map if (PropIncMap1.Lookup(sPropName, sPropOID)) { PropIncMap1.RemoveKey(sPropName); //remove it from the inc map PropExcMap1.SetAt(sPropName, sPropOID);//add it to the exc map }//end if found in map } } /* add the type1 properties to the appropriate listboxes */ listproperties(hwndDlg); //init "Exclude Prop" checkbox text = pVarSet->get(GET_BSTR(DCTVS_AccountOptions_ExcludeProps)); //if not checked, disable all other controls if (UStrICmp(text,(WCHAR const * ) yes)) { CheckDlgButton( hwndDlg,IDC_EXCLUDEPROPS, BST_UNCHECKED); disable(hwndDlg,IDC_OBJECTCMBO); disable(hwndDlg,IDC_INCLUDELIST); disable(hwndDlg,IDC_EXCLUDELIST); disable(hwndDlg,IDC_EXCLUDEBTN); disable(hwndDlg,IDC_INCLUDEBTN); } else //eles enable them { CheckDlgButton( hwndDlg,IDC_EXCLUDEPROPS, BST_CHECKED); enable(hwndDlg,IDC_OBJECTCMBO); enable(hwndDlg,IDC_INCLUDELIST); enable(hwndDlg,IDC_EXCLUDELIST); enable(hwndDlg,IDC_EXCLUDEBTN); enable(hwndDlg,IDC_INCLUDEBTN); } //if no 2nd type to be displayed, leave if (Type2.IsEmpty()) return; /* enumerate and add all mapped properties, for the 2nd type, to the maps */ //get a list of all properties names and their OIDs for this object type PropIncMap2.RemoveAll(); //clear the property map PropExcMap2.RemoveAll(); //clear the property map hr = BuildPropertyMap(Type2, srcVer, &PropIncMap2); /* remove excluded properties from the inclusion map and place that property in the exclusion map */ if (!ExList2.IsEmpty()) { //get the position and string of the first name in the previous //exclusion list currentPos = ExList2.GetHeadPosition(); //while there is another entry to retrieve from the list, then //get a name from the list,remove it from the inclusion map, and //place it in the exclusion list while (currentPos != NULL) { //get the next string in the list, starts with the first sPropName = ExList2.GetNext(currentPos); //if we find the property in the inclusion map, remove it and //add to the exclusion map if (PropIncMap2.Lookup(sPropName, sPropOID)) { PropIncMap2.RemoveKey(sPropName); //remove it from the inc map PropExcMap2.SetAt(sPropName, sPropOID);//add it to the exc map }//end if found in map } } } //END initpropdlg /********************************************************************* * * * Written by: Paul Thompson * * Date: 26 OCT 2000 * * * * This function is used by "initpropdlg" to retrieve a given * * object's properties, and their associated OIDs, from the schema. * * The property names and OIDs are placed in a given * * string-to-string map using the OID as the key. Property * * enumeration is accomplished using the ObjPropBuilder class. * * * *********************************************************************/ //BEGIN BuildPropertyMap HRESULT BuildPropertyMap(CString Type, long lSrcVer, CMapStringToString * pPropMap) { /* local variables */ IObjPropBuilderPtr pObjProp(__uuidof(ObjPropBuilder)); IVarSetPtr pVarTemp(__uuidof(VarSet)); IUnknown * pUnk; HRESULT hr; long lRet=0; SAFEARRAY * keys = NULL; SAFEARRAY * vals = NULL; VARIANT var; CString sPropName; CString sPropOID; /* function body */ VariantInit(&var); //get an IUnknown pointer to the Varset for passing it around. hr = pVarTemp->QueryInterface(IID_IUnknown, (void**)&pUnk); if (FAILED(hr)) return hr; //fill the varset with a list of properties in common between the source //and target domain for the first type being migrated hr = pObjProp->raw_MapProperties(_bstr_t(Type), _bstr_t(sourceNetbios), lSrcVer, _bstr_t(Type), _bstr_t(targetNetbios), 5, 1, &pUnk); if (SUCCEEDED(hr) || (hr == DCT_MSG_PROPERTIES_NOT_MAPPED)) { hr = pVarTemp->getItems(L"", L"", 1, 10000, &keys, &vals, &lRet); if (SUCCEEDED(hr)) { for ( long x = 0; x < lRet; x++ ) { ::SafeArrayGetElement(keys, &x, &var); if (V_VT(&var) != VT_EMPTY) { sPropOID = (WCHAR*)(var.bstrVal); VariantClear(&var); ::SafeArrayGetElement(vals, &x, &var); if (V_VT(&var) != VT_EMPTY) { sPropName = (WCHAR*)(var.bstrVal); VariantClear(&var); //place the OID and Name in the map with the name as the key pPropMap->SetAt(sPropName, sPropOID); } } } } } return hr; } //END BuildPropertyMap /********************************************************************* * * * Written by: Paul Thompson * * Date: 27 OCT 2000 * * * * This function is responsible for moving properties to and from* * the inclusion and exclusion listboxes. If the boolean parameter * * is true, then we are moving properties from the inclusion listbox * * to the exclusion listbox. We will also move the properties from * * the global inclusion and exclusion maps. * * * *********************************************************************/ //BEGIN moveproperties void moveproperties(HWND hwndDlg, bool bExclude) { /* local constants */ const int MAX_LB_SELECTIONS = 2000; /* local variables */ CListBox propToList; CListBox propFromList; CComboBox typeCombo; CMapStringToString * pPropFromMap; CMapStringToString * pPropToMap; CStringList sMoveList; CString sPropName; CString sTempName; CString sTempOID; POSITION currentPos; int SelectedItems[MAX_LB_SELECTIONS]; int ndx; int nFound; /* function body */ /* find out whether type1 or type2 is having properties moved and setup map pointer accordingly */ typeCombo.Attach(GetDlgItem(hwndDlg, IDC_OBJECTCMBO)); //if type1, use the type1 maps if (typeCombo.FindString(-1, sType1) == typeCombo.GetCurSel()) { if (bExclude) { pPropToMap = &PropExcMap1; pPropFromMap = &PropIncMap1; } else { pPropToMap = &PropIncMap1; pPropFromMap = &PropExcMap1; } } else //else use type2 maps { if (bExclude) { pPropToMap = &PropExcMap2; pPropFromMap = &PropIncMap2; } else { pPropToMap = &PropIncMap2; pPropFromMap = &PropExcMap2; } } typeCombo.Detach(); /* attach to the proper listboxes */ if (bExclude) { propToList.Attach(GetDlgItem(hwndDlg, IDC_EXCLUDELIST)); propFromList.Attach(GetDlgItem(hwndDlg, IDC_INCLUDELIST)); } else { propToList.Attach(GetDlgItem(hwndDlg, IDC_INCLUDELIST)); propFromList.Attach(GetDlgItem(hwndDlg, IDC_EXCLUDELIST)); } /* get the items selected for moving and place the names in a list */ sMoveList.RemoveAll(); int num_selected = propFromList.GetSelItems(MAX_LB_SELECTIONS, (LPINT)&SelectedItems); if ( num_selected != LB_ERR)//if got selected items, { //for each selected item, move maps and listboxes for (ndx = 0; ndx < num_selected; ndx++) { propFromList.GetText(SelectedItems[ndx], sTempName);//get item text sMoveList.AddTail(sTempName); } } /* move the properties in the listboxes and the maps */ if (!sMoveList.IsEmpty()) { currentPos = sMoveList.GetHeadPosition(); //while there is another entry to retrieve from the move list, then //get a name from the 'from' list, remove it from the 'from' map and //listbox, and place it in the 'to' map and listbox list while (currentPos != NULL) { //get the next string in the list, starts with the first sTempName = sMoveList.GetNext(currentPos); //remove the property from the 'from' listbox if ((nFound = propFromList.FindString(-1, sTempName)) != LB_ERR) { propFromList.DeleteString(nFound); //add it to the 'to' listbox propToList.AddString(sTempName); } /* find the property in the 'from' map, remove it, and add it to the 'to' map */ //if we find the property in the inclusion map, remove it and //add to the exclusion map if (pPropFromMap->Lookup(sTempName, sTempOID)) { pPropFromMap->RemoveKey(sTempName); //remove it from the from map pPropToMap->SetAt(sTempName, sTempOID);//add it to the to map }//end if found in map }//end while more props to move }//end if props to move propToList.Detach(); propFromList.Detach(); } //END moveproperties /********************************************************************* * * * Written by: Paul Thompson * * Date: 27 OCT 2000 * * * * This function is responsible for listing properties in the * * inclusion and exclusion listboxes based on the current object type* * selected in the combobox. * * We will retrieve the properties from the global inclusion and * * exclusion maps. * * * *********************************************************************/ //BEGIN listproperties void listproperties(HWND hwndDlg) { /* local variables */ CListBox propIncList; CListBox propExcList; CComboBox typeCombo; CMapStringToString * pPropIncMap; CMapStringToString * pPropExcMap; CString sPropName; CString sPropOID; POSITION currentPos; /* function body */ /* find out whether type1 or type2 is having properties listed and setup map pointer accordingly */ typeCombo.Attach(GetDlgItem(hwndDlg, IDC_OBJECTCMBO)); //if type1, use the type1 maps if (typeCombo.FindString(-1, sType1) == typeCombo.GetCurSel()) { pPropIncMap = &PropIncMap1; pPropExcMap = &PropExcMap1; } else //else use type2 maps { pPropIncMap = &PropIncMap2; pPropExcMap = &PropExcMap2; } typeCombo.Detach(); /* attach to the proper listboxes */ propIncList.Attach(GetDlgItem(hwndDlg, IDC_INCLUDELIST)); propExcList.Attach(GetDlgItem(hwndDlg, IDC_EXCLUDELIST)); propIncList.ResetContent(); propExcList.ResetContent(); /* populate the include listbox from the include map */ if (!pPropIncMap->IsEmpty()) { //get the position of the first name in the list currentPos = pPropIncMap->GetStartPosition(); //for each property in the include map, place it in //the include listbox while (currentPos != NULL) { //get the next name and associated OID from the map, starts with the first pPropIncMap->GetNextAssoc(currentPos, sPropName, sPropOID); propIncList.AddString(sPropName); }//end while more to list }//end if props to list /* populate the exclude listbox from the exclude map */ if (!pPropExcMap->IsEmpty()) { //get the position of the first name in the list currentPos = pPropExcMap->GetStartPosition(); //for each property in the include map, place it in //the include listbox while (currentPos != NULL) { //get the next name and associated OID from the map, starts with the first pPropExcMap->GetNextAssoc(currentPos, sPropName, sPropOID); propExcList.AddString(sPropName); }//end while more to list }//end if props to list propIncList.Detach(); propExcList.Detach(); } //END listproperties /********************************************************************* * * * Written by: Paul Thompson * * Date: 31 OCT 2000 * * * * This function is responsible for storing excluded properties * * in the proper varset field. The excluded properties are retrieved* * from the global exclusion maps. Properties are store in the * * varset string as a comma-seperated string of the properties' IOD. * * * *********************************************************************/ //BEGIN saveproperties void saveproperties(HWND hwndDlg) { /* local variables */ CComboBox typeCombo; CString sPropName; CString sPropOID; CString sType2 = L""; CString sType; CString sExList; POSITION currentPos; int ndx; _bstr_t text; _bstr_t key1; _bstr_t key2; /* function body */ /* see if there is a second type listed in the combobox */ typeCombo.Attach(GetDlgItem(hwndDlg, IDC_OBJECTCMBO)); for (ndx = 0; ndx < typeCombo.GetCount(); ndx++) { typeCombo.GetLBText(ndx, sType); //get the next type listed if (sType != sType1) sType2 = sType; } typeCombo.Detach(); /* find the proper varset key for each type */ if (sType1 == GET_STRING(IDS_USERPROPS)) key1 = GET_BSTR(DCTVS_AccountOptions_ExcludedUserProps); if (sType1 == GET_STRING(IDS_GROUPPROPS)) key1 = GET_BSTR(DCTVS_AccountOptions_ExcludedGroupProps); if (sType1 == GET_STRING(IDS_COMPUTERPROPS)) key1 = GET_BSTR(DCTVS_AccountOptions_ExcludedComputerProps); if (!sType2.IsEmpty()) { if (sType2 == GET_STRING(IDS_USERPROPS)) key2 = GET_BSTR(DCTVS_AccountOptions_ExcludedUserProps); if (sType2 == GET_STRING(IDS_GROUPPROPS)) key2 = GET_BSTR(DCTVS_AccountOptions_ExcludedGroupProps); if (sType2 == GET_STRING(IDS_COMPUTERPROPS)) key2 = GET_BSTR(DCTVS_AccountOptions_ExcludedComputerProps); } /* populate the varset key for Type1 from the exclusion map */ sExList = L""; if (!PropExcMap1.IsEmpty()) { //get the position of the first name in the list currentPos = PropExcMap1.GetStartPosition(); //for each property in the exclusion map, place it's name in //the comma-seperated varset string while (currentPos != NULL) { //get the next name and associated OID from the map, starts with the first PropExcMap1.GetNextAssoc(currentPos, sPropName, sPropOID); sExList += sPropName; sExList += L","; }//end while more to add //remove the trailing ',' sExList.SetAt((sExList.GetLength() - 1), L'\0'); }//end if props to record /* store the Type1 excluded properties in the varset */ pVarSet->put(key1, _bstr_t(sExList)); /* if a Type2, populate the varset key for Type2 from the exclusion map */ if (!sType2.IsEmpty()) { sExList = L""; if (!PropExcMap2.IsEmpty()) { //get the position of the first name in the list currentPos = PropExcMap2.GetStartPosition(); //for each property in the exclusion map, place it's name in //the comma-seperated varset string while (currentPos != NULL) { //get the next name and associated OID from the map, starts with the first PropExcMap2.GetNextAssoc(currentPos, sPropName, sPropOID); sExList += sPropName; sExList += L","; }//end while more to add //remove the trailing ',' sExList.SetAt((sExList.GetLength() - 1), L'\0'); }//end if props to record }//end if props to record /* if Type2, store the Type2 excluded properties in the varset */ if (!sType2.IsEmpty()) pVarSet->put(key2, _bstr_t(sExList)); } //END saveproperties /********************************************************************* * * * Written by: Paul Thompson * * Date: 17 NOV 2000 * * * * This function is responsible for making an RPC call into the * * given Password DC to see if it is ready to perform password * * migrations. We return if it is ready or not. If the DC is not * * ready, we also fill in the msg and title strings. * * * *********************************************************************/ //BEGIN IsPasswordDCReady bool IsPasswordDCReady(CString server, CString& msg, CString& title, UINT *msgtype) { /* local variables */ IPasswordMigrationPtr pPwdMig(__uuidof(PasswordMigration)); DOMAIN_CONTROLLER_INFO * pTgtDomCtrlInfo = NULL; HRESULT hr = S_OK; DWORD rc = 0; CString sTemp; TErrorDct err; _bstr_t sText; _bstr_t sTgtDC = L""; WCHAR sMach[1000]; DWORD dwMachLen = 1000; IErrorInfoPtr pErrorInfo = NULL; BSTR bstrDescription; /* function body */ //get a DC from this domain. We will set a VARSET key so that we use this DC for //password migration (and other acctrepl operations) rc = DsGetDcName(NULL, targetDNS, NULL, NULL, 0, &pTgtDomCtrlInfo); if (rc == NO_ERROR) { sTgtDC = pTgtDomCtrlInfo->DomainControllerName; NetApiBufferFree(pTgtDomCtrlInfo); } else //else if failed, get this machine's name { if (GetComputerNameEx(ComputerNameDnsFullyQualified, sMach, &dwMachLen)) sTgtDC = sMach; } //make sure the server name starts with "\\" if (wcsncmp((WCHAR*)sTgtDC, L"\\\\", 2)) { _bstr_t sTempName = L"\\\\"; sTempName += sTgtDC; sTgtDC = sTempName; } //store this DC to use later for the actual migration targetServer = (WCHAR*)sTgtDC; //try to establish the session, which will check all requirements hr = pPwdMig->raw_EstablishSession(_bstr_t(server), sTgtDC); if (SUCCEEDED(hr)) //if success, return true return true; //try to get the rich error information if (SUCCEEDED(GetErrorInfo(0, &pErrorInfo))) { HRESULT hrTmp = pErrorInfo->GetDescription(&bstrDescription); if (SUCCEEDED(hrTmp)) //if got rich error info, use it sText = _bstr_t(bstrDescription, false); else //else, prepare a standard message and return { sTemp.LoadString(IDS_MSG_PWDDC_NOT_READY); msg.Format((LPCTSTR)sTemp, (LPCTSTR)server, (LPCTSTR)server); title.LoadString(IDS_MSG_ERROR); *msgtype = MB_ICONERROR | MB_OK; return false; } } else //else, prepare a standard message and return { sTemp.LoadString(IDS_MSG_PWDDC_NOT_READY); msg.Format((LPCTSTR)sTemp, (LPCTSTR)server, (LPCTSTR)server); title.LoadString(IDS_MSG_ERROR); *msgtype = MB_ICONERROR | MB_OK; return false; } //if not enabled on the src, add special question to error info if (hr == PM_E_PASSWORD_MIGRATION_NOT_ENABLED) { sTemp.LoadString(IDS_MSG_PWDDC_DISABLED); msg = (LPCTSTR)sText; msg += sTemp; //add a question to the end of the error text title.LoadString(IDS_MSG_WARNING); *msgtype = MB_ICONQUESTION | MB_YESNO; } //else display the error info else { msg = (LPCTSTR)sText; title.LoadString(IDS_MSG_ERROR); *msgtype = MB_ICONERROR | MB_OK; } return false; } //END IsPasswordDCReady /********************************************************************* * * * Written by: Paul Thompson * * Date: 7 FEB 2001 * * * * This function is a helper function responsible for checking * * the existance of a directory path, and create any needed * * directories for this path. The given path should not include a * * file and should be a full path and not a relative path. * * The function returns the newly created path. * * * *********************************************************************/ //BEGIN CreatePath CString CreatePath(CString sDirPath) { /* local variables */ int tosubtract,tosubtract2, final; CString dir; CString root; CString sEmpty = L""; int nStart = 1; /* function body */ //remove any trailing '\' or '/' tosubtract = sDirPath.ReverseFind(L'\\'); tosubtract2 = sDirPath.ReverseFind(L'/'); final = (tosubtract > tosubtract2) ? tosubtract : tosubtract2; if (final==-1) return sEmpty; if (sDirPath.GetLength() == (final+1)) dir = sDirPath.Left(final); else dir = sDirPath; //try to convert a local relative dir path to a full path if (dir.GetAt(0) != L'\\') { CString szPath; LPTSTR pszFilePart; CString tempPath = dir; tempPath += "\\*.*"; DWORD cchPath = GetFullPathName(tempPath, 2000, szPath.GetBuffer(2000), &pszFilePart); szPath.ReleaseBuffer(); if ((cchPath != 0) && (cchPath <= 2000)) { final = szPath.ReverseFind(L'\\'); dir = szPath.Left(final); } } else nStart = 2; if ((dir.Right(1) == L':') && (validDir(dir))) return dir; //find the first '\' or '/' past the "C:" or "\\" at the beginning tosubtract = dir.Find(L'\\', nStart); tosubtract2 = dir.Find(L'/', nStart); if ((tosubtract != -1)) { final = tosubtract; if ((tosubtract2 != -1) && (tosubtract2 < final)) final = tosubtract2; } else if ((tosubtract2 != -1)) final = tosubtract2; else return sEmpty; final++; //move to the next character root = dir.Left(final); dir = dir.Right(dir.GetLength()-final); //create needed directories final = dir.FindOneOf(L"\\/"); while (final!=-1) { root += dir.Left(final); if (!validDir(root)) { int create=CreateDirectory(root.GetBuffer(1000),NULL); root.ReleaseBuffer(); if (create==0)return sEmpty; } root += L"\\"; dir = dir.Right(dir.GetLength()-final-1); final = dir.FindOneOf(L"\\/"); } root += dir; if (!validDir(root)) { int create=CreateDirectory(root.GetBuffer(1000),NULL); root.ReleaseBuffer(); if (create==0)return sEmpty; } return root; } //END CreatePath void GetValidPathPart(CString sFullPath, CString & sDirectory, CString & sFileName) { //remove the file off the path int tosubtract = sFullPath.ReverseFind(L'\\'); int tosubtract2 = sFullPath.ReverseFind(L'/'); int final = (tosubtract > tosubtract2) ? tosubtract : tosubtract2; if (final == -1) { sDirectory = L""; sFileName = L""; return; } sDirectory = sFullPath; sFileName = sFullPath.Right(sFullPath.GetLength()-(final+1)); //save the filename while (final != -1) { //see if this shorter path exists sDirectory = sDirectory.Left(final); if (validDir(sDirectory)) return; //strip off the next directory from the path tosubtract = sDirectory.ReverseFind(L'\\'); tosubtract2 = sDirectory.ReverseFind(L'/'); final = (tosubtract > tosubtract2) ? tosubtract : tosubtract2; } sDirectory = L""; return; }