WindowsXP-SP1/admin/admt/wizards/guiutils.cpp
2020-09-30 16:53:49 +02:00

5390 lines
166 KiB
C++

#include "stdafx.h"
#include "GuiUtils.h"
#include "TxtSid.h"
#include "LSAUtils.h"
#include "ErrDct.hpp"
#include <ntdsapi.h>
#include <ntldap.h> // LDAP_MATCHING_RULE_BIT_AND_W
#include <lm.h>
#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;i<count;i++)
{
base.Format(L"Accounts.%d.Name",i);
text =pVarSet->get(_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;i<m_serviceBox.GetItemCount();i++)
{
computer = m_serviceBox.GetItemText(i,0);
service = m_serviceBox.GetItemText(i,1);
account = m_serviceBox.GetItemText(i,2);
db->SetServiceAcctEntryStatus(_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;i<m_serviceBox.GetItemCount();i++)
{
computer = m_serviceBox.GetItemText(i,0);
service = m_serviceBox.GetItemText(i,1);
account = m_serviceBox.GetItemText(i,2);
c = m_serviceBox.GetItemText(i,3);
if (c== skip)
{
db->SetServiceAcctEntryStatus(_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;i<accounts;i++)
{
pVarSetMerge->Clear();
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;i<number;i++)
{
some=true;
base.Format(L"Computer.%d",i);
text= pVarSetMerge->get(_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(&ltime);
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 (i<numItems)
{
holder.Format(L"DA.%d" ,i);
toLoad = holder + L".Server";
text = pVarSetFailed->get(_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;i<m_cancelBox.GetItemCount();i++)
{
c = m_cancelBox.GetItemText(i,5);
if (c== include)
{
CString name;
CString sName;
name = m_cancelBox.GetItemText(i,0);
sName = L"\\\\";
sName += name;
holder.Format(L"Servers.%d",count);
pVarSet->put(_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;i<m_cancelBox.GetItemCount();i++)
{
c = m_cancelBox.GetItemText(i,5);
if (c== include)
{
return true;
}
}
return false;
}
void OnFileBrowse(HWND hwndDlg,int id)
{
CWnd yo;
yo.Attach(hwndDlg);
CString sDir = L"", sFile = L"", sPath = L"";
CFileDialog f(FALSE,
L"",
GET_CSTRING(IDS_PASSWORDS),
OFN_LONGNAMES | OFN_NOREADONLYRETURN,
GET_CSTRING(IDS_MASKS),
&yo);
GetDlgItemText(hwndDlg, id, sPath.GetBuffer(1000), 1000);
sPath.ReleaseBuffer();
if (sPath.GetLength())
GetValidPathPart(sPath, sDir, sFile);
f.m_ofn.lpstrInitialDir = sDir.GetBuffer(1000);
f.m_ofn.lpstrFile = sFile.GetBuffer(1000);
if ( f.DoModal() == IDOK )
{
SetDlgItemText(hwndDlg,id,f.GetPathName());
}
yo.Detach();
sFile.ReleaseBuffer();
sDir.ReleaseBuffer();
}
void ShowWarning(HWND hwndDlg)
{
CString warning,base,title;
IAccessCheckerPtr pAC;
HRESULT hr = pAC.CreateInstance(CLSID_AccessChecker);
long length;
hr = pAC->raw_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<num.GetLength();i++)
{
if (checker.Find(num.GetAt(i)) == -1)
return false;
}
return true;
}
bool timeInABox(HWND hwndDlg,time_t& t)
{
CString s;
GetDlgItemText(hwndDlg,IDC_yo,s.GetBuffer(1000),1000);
s.ReleaseBuffer();
s.TrimLeft();s.TrimRight();
if (!number(s)) return false;
int num=_ttoi((LPTSTR const) s.GetBuffer(1000));
s.ReleaseBuffer();
if (num > 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;i<c.GetLength();i++)
{
//* if (check.Find(c.GetAt(i)) == -1)
//if any characters enetered by the user ar in the viewable
//invalid list, return false to display a messagebox
if (check.Find(c.GetAt(i)) != -1)
return false;
//if any chars have a value between 1-31, return false
for (UINT j=0; j<wcslen(InvalidDownLevelChars); j++)
{
if ((c.GetAt(i)) == (InvalidDownLevelChars[j]))
return false;
}
}
*/
//convert the same user input so we can guard against <ALT>1
//- <ALT>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<c.GetLength();i++)
{
if (check.Find(c.GetAt(i)) == -1)
return false;
}
//check to make sure it doesn't exceed the MAX (15 minutes) (will not integer
//overflow since combobox is small and not scrollable
int num;
int nRead = swscanf((LPCTSTR)c, L"%d", &num);
if ((nRead == EOF) || (nRead == 0))
return false;
if ((num >= 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<numItems;i++)
{
for (int j=i;j<numItems;j++)
{
ahead = ((listbox.GetItemText(i,col)).CompareNoCase(listbox.GetItemText(j,col))> 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<j)
changePlaces(listBox,i,j);
else
return j;
}
}
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<numItems;i++)
{
for (int j=i;j<numItems;j++)
{
ahead = ((listbox.GetItemText(i,col)).CompareNoCase(listbox.GetItemText(j,col))> 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 (p<r)
{
q= Partition(listBox,col,order,p,q);
QuickSort(listBox,col,order,p,q);
QuickSort(listBox,col,order,q+1,r);
}
}
void sort(CListCtrl & listbox,int col,bool order)
{
CWaitCursor w;
QuickSort(listBox,col,order,1,listBox.GetItemCount());
}*/
void OnBROWSE(HWND hwndDlg,int id)
{
TCHAR path[MAX_PATH];
CString path2, sTitle;
BROWSEINFO b;
sTitle.LoadString(IDS_BROWSE_REPORT_TITLE);
b.hwndOwner=hwndDlg;
b.pidlRoot=NULL;
b.pszDisplayName=path;
b.lpszTitle=(LPCTSTR)sTitle;
b.lpfn=NULL;
b.lParam=NULL;
b.iImage=NULL;
/**/b.ulFlags=0; //PRT - 4/3
LPITEMIDLIST l = SHBrowseForFolder(&b);
SHGetPathFromIDList(l,path2.GetBuffer(1000));
path2.ReleaseBuffer();
SetDlgItemText(hwndDlg,id,path2.GetBuffer(1000));
path2.ReleaseBuffer();
}
bool administrator(CString m_Computer,HRESULT& hr)
{
IAccessCheckerPtr pAC;
long bIs;
hr = pAC.CreateInstance(CLSID_AccessChecker);
hr = pAC->raw_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;i<intCount;i++)
{
if (migration==w_computer || (migration ==w_security ||
(migration == w_reporting || migration == w_service)))
{
name= m_listBox.GetItemText(i,0);
spruced_name = "\\\\" + name;
varset_1.Format(L"Servers.%d",servers);
pVarSet->put(_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;i<length;i++)
{
temp=m_listBox.GetItemText(i,1);
temp.TrimLeft();temp.TrimRight();
if (!temp.CompareNoCase(m_name))return true;
}
return false;
}
void ProcessSelectedObjects(IDataObject *pdo,HWND hwndDlg,bool sourceIsNT4)
{
HRESULT hr = S_OK; BOOL fGotStgMedium = FALSE; PDS_SELECTION_LIST pDsSelList = NULL; ULONG i;
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;
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(&ltime);
rebootDelay = rebootDelay;
temp.Format(L"%d",rebootDelay);
varX = temp;
for (int i =0;i<servers;i++)
{
typeExtension.Format(L"Servers.%d.RebootDelay",i);
pVarSet->put(_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<WCHAR *>(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;
}