mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2381 lines
72 KiB
2381 lines
72 KiB
/*
|
|
+-------------------------------------------------------------------------+
|
|
| Netware to Windows NT Transfer Loop |
|
|
+-------------------------------------------------------------------------+
|
|
| (c) Copyright 1993-1994 |
|
|
| Microsoft Corp. |
|
|
| All rights reserved |
|
|
| |
|
|
| Program : [Transfer.c] |
|
|
| Programmer : Arthur Hanson |
|
|
| Original Program Date : [Jul 27, 1993] |
|
|
| Last Update : [Jun 16, 1994] |
|
|
| |
|
|
| Version: 1.00 |
|
|
| |
|
|
| Description: |
|
|
| |
|
|
| History: |
|
|
| arth June 16, 1994 1.00 Original Version. |
|
|
| |
|
|
+-------------------------------------------------------------------------+
|
|
*/
|
|
|
|
|
|
#include "globals.h"
|
|
|
|
#include <stdio.h>
|
|
#include <stdarg.h>
|
|
#include <limits.h>
|
|
#include <time.h>
|
|
|
|
#include "nwconv.h"
|
|
#include "convapi.h"
|
|
#include "ntnetapi.h"
|
|
#include "nwnetapi.h"
|
|
#include "userdlg.h"
|
|
#include "statbox.h"
|
|
#include "filedlg.h"
|
|
#include "map.h"
|
|
|
|
#define NWC_ERR_IGNORE 1
|
|
#define NWC_ERR_NAMELONG 2
|
|
#define NWC_ERR_DUPLICATE 3
|
|
#define NWC_ERR_NAMEINVALID 4
|
|
|
|
#define ILLEGAL_CHARS TEXT("\"\\/[]:;=,+*?<>")
|
|
|
|
// define for routines in fcopy.c
|
|
void ConvertFiles(HWND hDlg, BOOL TConversion, USER_LIST *Users, GROUP_LIST *Groups);
|
|
void ConvertFilesInit(HWND hDlg);
|
|
void VSharesCreate(DEST_SERVER_BUFFER *DServ, BOOL TConversion);
|
|
|
|
// Cache of user and group lists
|
|
typedef struct _LIST_CACHE {
|
|
struct _LIST_CACHE *next;
|
|
ULONG Count;
|
|
void *ul;
|
|
} LIST_CACHE;
|
|
|
|
static LIST_CACHE *UserCacheHead = NULL;
|
|
static LIST_CACHE *GroupCacheHead = NULL;
|
|
|
|
// Misc string holders
|
|
static LPTSTR LocalName = NULL;
|
|
static LPTSTR SourceServer, DestServer;
|
|
TCHAR UserServerName[MAX_SERVER_NAME_LEN + 3];
|
|
static TCHAR tmpStr[80];
|
|
static TCHAR tmpStr2[60];
|
|
static TCHAR ErrorText[256];
|
|
static TCHAR NewName[256];
|
|
static TCHAR pLine[256];
|
|
|
|
static CONVERT_OPTIONS *ConvOpt = NULL;
|
|
static FILE_OPTIONS *FileOptions = NULL;
|
|
static BOOL TConversion;
|
|
static BOOL WarningDlgForNTFS;
|
|
|
|
// Totals for stat box
|
|
static UINT TotErrors;
|
|
static UINT TotGroups;
|
|
static UINT TotUsers;
|
|
static UINT TotConversions;
|
|
UINT TotFiles;
|
|
time_t StartTime;
|
|
time_t CurrTime;
|
|
|
|
// User and Group list pointers
|
|
static USER_LIST *Users = NULL;
|
|
static USER_LIST *NTUsers = NULL;
|
|
static GROUP_LIST *Groups = NULL;
|
|
static GROUP_LIST *NTGroups = NULL;
|
|
static DWORD UserCount, NTUserCount;
|
|
static DWORD GroupCount, NTGroupCount;
|
|
static BOOL TransferCancel = FALSE;
|
|
|
|
static MAP_FILE *hMap;
|
|
|
|
// All of this is used for transfer lists in the conversion
|
|
#define USER_SERVER 0
|
|
#define USER_SERVER_PDC 1
|
|
#define USER_SERVER_TRUSTED 2
|
|
|
|
typedef struct _TRANSFER_BUFFER {
|
|
LPTSTR ServerName;
|
|
UINT UserServerType;
|
|
CONVERT_LIST *ConvertList;
|
|
} TRANSFER_BUFFER;
|
|
|
|
typedef struct _TRANSFER_LIST {
|
|
ULONG Count;
|
|
TRANSFER_BUFFER TList[];
|
|
} TRANSFER_LIST;
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| ErrorIt()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
void ErrorIt(LPTSTR szFormat, ...) {
|
|
static TCHAR tmpStr[1024];
|
|
va_list marker;
|
|
|
|
va_start(marker, szFormat);
|
|
|
|
wvsprintf(tmpStr, szFormat, marker);
|
|
#ifdef DEBUG
|
|
dprintf(TEXT("Errorit: %s\n"), tmpStr);
|
|
#endif
|
|
|
|
TotErrors++;
|
|
Status_TotErrors(TotErrors);
|
|
LogWriteErr(TEXT("%s"),tmpStr);
|
|
va_end(marker);
|
|
|
|
} // ErrorIt
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| NTFS Check Routines |
|
|
+-------------------------------------------------------------------------+*/
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| ShareListNTFSCheck()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
BOOL ShareListNTFSCheck() {
|
|
CONVERT_LIST *ConvList;
|
|
DEST_SERVER_BUFFER *DServ;
|
|
SOURCE_SERVER_BUFFER *SServ;
|
|
SHARE_LIST *ShareList;
|
|
SHARE_BUFFER *SList;
|
|
VIRTUAL_SHARE_BUFFER *VShare;
|
|
DRIVE_BUFFER *Drive;
|
|
ULONG i;
|
|
FILE_OPTIONS *FileOptions;
|
|
|
|
// Go through the convert list checking for any shares to non NTFS drives
|
|
ConvList = ConvertListStart;
|
|
|
|
while (ConvList != NULL) {
|
|
DServ = ConvList->FileServ;
|
|
SServ = ConvList->SourceServ;
|
|
|
|
FileOptions = (FILE_OPTIONS *) ConvList->FileOptions;
|
|
if (FileOptions->TransferFileInfo) {
|
|
ShareList = SServ->ShareList;
|
|
|
|
if (ShareList != NULL) {
|
|
|
|
SList = ShareList->SList;
|
|
for (i = 0; i < ShareList->Count; i++) {
|
|
|
|
// if not flagged as okay for going to fat, then must check
|
|
if (SList[i].Convert && !SList[i].ToFat)
|
|
if (SList[i].DestShare != NULL)
|
|
if (SList[i].Virtual) {
|
|
VShare = (VIRTUAL_SHARE_BUFFER *) SList[i].DestShare;
|
|
Drive = VShare->Drive;
|
|
|
|
if ((Drive == NULL) || (Drive->Type != DRIVE_TYPE_NTFS))
|
|
return FALSE;
|
|
} else {
|
|
Drive = SList[i].DestShare->Drive;
|
|
|
|
if ((Drive == NULL) || (Drive->Type != DRIVE_TYPE_NTFS))
|
|
return FALSE;
|
|
}
|
|
} // for loop through shares
|
|
|
|
}
|
|
|
|
} // if FileOptions
|
|
|
|
ConvList = ConvList->next;
|
|
}
|
|
|
|
return TRUE;
|
|
|
|
} // ShareListNTFSCheck
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| ShareListNTFSListboxFill()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
void ShareListNTFSListboxFill(HWND hDlg) {
|
|
TCHAR AddLine[256];
|
|
CONVERT_LIST *ConvList;
|
|
DEST_SERVER_BUFFER *DServ;
|
|
SOURCE_SERVER_BUFFER *SServ;
|
|
SHARE_LIST *ShareList;
|
|
SHARE_BUFFER *SList;
|
|
VIRTUAL_SHARE_BUFFER *VShare;
|
|
DRIVE_BUFFER *Drive;
|
|
ULONG i;
|
|
HWND hCtrl;
|
|
FILE_OPTIONS *FileOptions;
|
|
|
|
// Go through the convert list checking for any shares to non NTFS drives
|
|
ConvList = ConvertListStart;
|
|
hCtrl = GetDlgItem(hDlg, IDC_LIST1);
|
|
|
|
while (ConvList != NULL) {
|
|
DServ = ConvList->FileServ;
|
|
SServ = ConvList->SourceServ;
|
|
|
|
FileOptions = (FILE_OPTIONS *) ConvList->FileOptions;
|
|
if (FileOptions->TransferFileInfo) {
|
|
ShareList = SServ->ShareList;
|
|
|
|
if (ShareList != NULL) {
|
|
|
|
SList = ShareList->SList;
|
|
for (i = 0; i < ShareList->Count; i++) {
|
|
|
|
// if not flagged as okay for going to fat, then must check
|
|
if (SList[i].Convert && !SList[i].ToFat)
|
|
if (SList[i].DestShare != NULL)
|
|
if (SList[i].Virtual) {
|
|
VShare = (VIRTUAL_SHARE_BUFFER *) SList[i].DestShare;
|
|
Drive = VShare->Drive;
|
|
|
|
if ((Drive == NULL) || (Drive->Type != DRIVE_TYPE_NTFS)) {
|
|
wsprintf(AddLine, TEXT("%s\\%s: -> \\\\%s\\%s"), SServ->Name, SList[i].Name, DServ->Name, VShare->Name);
|
|
SendMessage(hCtrl, LB_ADDSTRING, (WPARAM) 0, (LPARAM) AddLine);
|
|
}
|
|
} else {
|
|
Drive = SList[i].DestShare->Drive;
|
|
|
|
if ((Drive == NULL) || (Drive->Type != DRIVE_TYPE_NTFS)) {
|
|
wsprintf(AddLine, TEXT("%s\\%s: -> \\\\%s\\%s"), SServ->Name, SList[i].Name, DServ->Name, SList[i].DestShare->Name);
|
|
SendMessage(hCtrl, LB_ADDSTRING, (WPARAM) 0, (LPARAM) AddLine);
|
|
}
|
|
}
|
|
} // for loop through shares
|
|
|
|
}
|
|
} // if FileOptions
|
|
|
|
ConvList = ConvList->next;
|
|
}
|
|
|
|
} // ShareListNTFSListboxFill
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| ShareListFATOK()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
void ShareListFATOK() {
|
|
CONVERT_LIST *ConvList;
|
|
DEST_SERVER_BUFFER *DServ;
|
|
SOURCE_SERVER_BUFFER *SServ;
|
|
SHARE_LIST *ShareList;
|
|
SHARE_BUFFER *SList;
|
|
ULONG i;
|
|
FILE_OPTIONS *FileOptions;
|
|
|
|
// Go through the convert list checking for any shares to non NTFS drives
|
|
ConvList = ConvertListStart;
|
|
|
|
while (ConvList != NULL) {
|
|
DServ = ConvList->FileServ;
|
|
SServ = ConvList->SourceServ;
|
|
|
|
FileOptions = (FILE_OPTIONS *) ConvList->FileOptions;
|
|
if (FileOptions->TransferFileInfo) {
|
|
ShareList = SServ->ShareList;
|
|
|
|
if (ShareList != NULL) {
|
|
|
|
SList = ShareList->SList;
|
|
for (i = 0; i < ShareList->Count; i++) {
|
|
if (SList[i].Convert)
|
|
SList[i].ToFat = TRUE;
|
|
}
|
|
|
|
}
|
|
} // if FileOptions
|
|
|
|
ConvList = ConvList->next;
|
|
}
|
|
|
|
} // ShareListFATOK
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| Space Check Routines |
|
|
+-------------------------------------------------------------------------+*/
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| ShareListSpaceCheck()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
BOOL ShareListSpaceCheck() {
|
|
CONVERT_LIST *ConvList;
|
|
DEST_SERVER_BUFFER *DServ;
|
|
SOURCE_SERVER_BUFFER *SServ;
|
|
SHARE_LIST *ShareList;
|
|
SHARE_BUFFER *SList;
|
|
VIRTUAL_SHARE_BUFFER *VShare;
|
|
DRIVE_BUFFER *Drive;
|
|
ULONG i;
|
|
FILE_OPTIONS *FileOptions;
|
|
|
|
// Go through the convert list checking for any shares to non NTFS drives
|
|
ConvList = ConvertListStart;
|
|
|
|
while (ConvList != NULL) {
|
|
DServ = ConvList->FileServ;
|
|
SServ = ConvList->SourceServ;
|
|
|
|
FileOptions = (FILE_OPTIONS *) ConvList->FileOptions;
|
|
if (FileOptions->TransferFileInfo) {
|
|
ShareList = SServ->ShareList;
|
|
|
|
if (ShareList != NULL) {
|
|
|
|
SList = ShareList->SList;
|
|
for (i = 0; i < ShareList->Count; i++) {
|
|
|
|
if (SList[i].Convert && (SList[i].DestShare != NULL))
|
|
if (SList[i].Virtual) {
|
|
VShare = (VIRTUAL_SHARE_BUFFER *) SList[i].DestShare;
|
|
Drive = VShare->Drive;
|
|
|
|
if ((Drive == NULL) || (Drive->AllocSpace > Drive->FreeSpace))
|
|
return FALSE;
|
|
} else {
|
|
Drive = SList[i].DestShare->Drive;
|
|
|
|
if ((Drive == NULL) || (Drive->AllocSpace > Drive->FreeSpace))
|
|
return FALSE;
|
|
}
|
|
} // for loop through shares
|
|
|
|
}
|
|
} // if FileOptions
|
|
|
|
ConvList = ConvList->next;
|
|
}
|
|
|
|
return TRUE;
|
|
|
|
} // ShareListSpaceCheck
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| ShareListSpaceListboxFill()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
void ShareListSpaceListboxFill(HWND hDlg) {
|
|
TCHAR AddLine[256];
|
|
TCHAR Free[25];
|
|
CONVERT_LIST *ConvList;
|
|
DEST_SERVER_BUFFER *DServ;
|
|
SOURCE_SERVER_BUFFER *SServ;
|
|
SHARE_LIST *ShareList;
|
|
SHARE_BUFFER *SList;
|
|
VIRTUAL_SHARE_BUFFER *VShare;
|
|
DRIVE_BUFFER *Drive;
|
|
ULONG i;
|
|
HWND hCtrl;
|
|
FILE_OPTIONS *FileOptions;
|
|
|
|
// Go through the convert list checking for any shares to non NTFS drives
|
|
ConvList = ConvertListStart;
|
|
hCtrl = GetDlgItem(hDlg, IDC_LIST1);
|
|
|
|
while (ConvList != NULL) {
|
|
DServ = ConvList->FileServ;
|
|
SServ = ConvList->SourceServ;
|
|
|
|
FileOptions = (FILE_OPTIONS *) ConvList->FileOptions;
|
|
if (FileOptions->TransferFileInfo) {
|
|
ShareList = SServ->ShareList;
|
|
|
|
if (ShareList != NULL) {
|
|
|
|
SList = ShareList->SList;
|
|
for (i = 0; i < ShareList->Count; i++) {
|
|
|
|
if (SList[i].Convert && (SList[i].DestShare != NULL))
|
|
if (SList[i].Virtual) {
|
|
VShare = (VIRTUAL_SHARE_BUFFER *) SList[i].DestShare;
|
|
Drive = VShare->Drive;
|
|
|
|
if (Drive != NULL) {
|
|
if (Drive->AllocSpace > Drive->FreeSpace) {
|
|
// List shares then space
|
|
wsprintf(AddLine, TEXT("%s\\%s: -> \\\\%s\\%s"), SServ->Name, SList[i].Name, DServ->Name, VShare->Name);
|
|
SendMessage(hCtrl, LB_ADDSTRING, (WPARAM) 0, (LPARAM) AddLine);
|
|
|
|
lstrcpy(Free, lToStr(Drive->FreeSpace));
|
|
wsprintf(AddLine, Lids(IDS_D_13), Free, lToStr(Drive->AllocSpace));
|
|
SendMessage(hCtrl, LB_ADDSTRING, (WPARAM) 0, (LPARAM) AddLine);
|
|
}
|
|
} else {
|
|
wsprintf(AddLine, TEXT("%s\\%s: -> \\\\%s\\%s"), SServ->Name, SList[i].Name, DServ->Name, VShare->Name);
|
|
SendMessage(hCtrl, LB_ADDSTRING, (WPARAM) 0, (LPARAM) AddLine);
|
|
|
|
wsprintf(AddLine, Lids(IDS_D_14));
|
|
SendMessage(hCtrl, LB_ADDSTRING, (WPARAM) 0, (LPARAM) AddLine);
|
|
}
|
|
} else {
|
|
Drive = SList[i].DestShare->Drive;
|
|
|
|
if (Drive != NULL) {
|
|
if (Drive->AllocSpace > Drive->FreeSpace) {
|
|
// List shares then space
|
|
wsprintf(AddLine, TEXT("%s\\%s: -> \\\\%s\\%s"), SServ->Name, SList[i].Name, DServ->Name, SList[i].DestShare->Name);
|
|
SendMessage(hCtrl, LB_ADDSTRING, (WPARAM) 0, (LPARAM) AddLine);
|
|
|
|
lstrcpy(Free, lToStr(Drive->FreeSpace));
|
|
wsprintf(AddLine, Lids(IDS_D_13), Free, lToStr(Drive->AllocSpace));
|
|
SendMessage(hCtrl, LB_ADDSTRING, (WPARAM) 0, (LPARAM) AddLine);
|
|
}
|
|
} else {
|
|
wsprintf(AddLine, TEXT("%s\\%s: -> \\\\%s\\%s"), SServ->Name, SList[i].Name, DServ->Name, SList[i].DestShare->Name);
|
|
SendMessage(hCtrl, LB_ADDSTRING, (WPARAM) 0, (LPARAM) AddLine);
|
|
|
|
wsprintf(AddLine, Lids(IDS_D_14));
|
|
SendMessage(hCtrl, LB_ADDSTRING, (WPARAM) 0, (LPARAM) AddLine);
|
|
}
|
|
} // if Virtual
|
|
|
|
} // for loop through shares
|
|
|
|
}
|
|
} // if FileOptions
|
|
|
|
ConvList = ConvList->next;
|
|
}
|
|
|
|
} // ShareListSpaceListboxFill
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| Conversion Warning Dialog |
|
|
+-------------------------------------------------------------------------+*/
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| DlgConversionWarning()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
LRESULT CALLBACK DlgConversionWarning(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) {
|
|
int wmId, wmEvent;
|
|
|
|
switch (message) {
|
|
case WM_INITDIALOG:
|
|
// Center the dialog over the application window
|
|
CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER));
|
|
|
|
if (WarningDlgForNTFS) {
|
|
SendDlgItemMessage(hDlg, IDC_PANEL1, WM_SETTEXT, 0, (LPARAM) Lids(IDS_D_15));
|
|
ShareListNTFSListboxFill(hDlg);
|
|
} else {
|
|
SendDlgItemMessage(hDlg, IDC_PANEL1, WM_SETTEXT, 0, (LPARAM) Lids(IDS_D_16));
|
|
ShareListSpaceListboxFill(hDlg);
|
|
}
|
|
|
|
return (TRUE);
|
|
|
|
case WM_COMMAND:
|
|
wmId = LOWORD(wParam);
|
|
wmEvent = HIWORD(wParam);
|
|
|
|
switch (wmId) {
|
|
case IDYES:
|
|
if (WarningDlgForNTFS)
|
|
ShareListFATOK();
|
|
|
|
EndDialog(hDlg, 0);
|
|
return (TRUE);
|
|
break;
|
|
|
|
case IDNO:
|
|
TransferCancel = TRUE;
|
|
EndDialog(hDlg, 0);
|
|
return (TRUE);
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
return (FALSE); // Didn't process the message
|
|
|
|
lParam;
|
|
} // DlgConversionWarning
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| ConversionWarningDlg_Do()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
void ConversionWarningDlg_Do(HWND hDlg) {
|
|
DLGPROC lpfnDlg;
|
|
|
|
lpfnDlg = MakeProcInstance((DLGPROC) DlgConversionWarning, hInst);
|
|
DialogBox(hInst, TEXT("AlertSel"), hDlg, lpfnDlg) ;
|
|
FreeProcInstance(lpfnDlg);
|
|
|
|
} // ConversionWarningDlg_Do
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| NTFSCheck()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
void NTFSCheck(HWND hDlg) {
|
|
WarningDlgForNTFS = TRUE;
|
|
|
|
if (!ShareListNTFSCheck())
|
|
ConversionWarningDlg_Do(hDlg);
|
|
|
|
} // NTFSCheck
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| SpaceCheck()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
void SpaceCheck(HWND hDlg) {
|
|
WarningDlgForNTFS = FALSE;
|
|
|
|
if (!ShareListSpaceCheck())
|
|
ConversionWarningDlg_Do(hDlg);
|
|
|
|
} // SpaceCheck
|
|
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| End of Conversion Dialog |
|
|
+-------------------------------------------------------------------------+*/
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| DlgConversionEnd()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
LRESULT CALLBACK DlgConversionEnd(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) {
|
|
HANDLE hFile;
|
|
int wmId, wmEvent;
|
|
static char CmdLine[256];
|
|
HWND hCtrl;
|
|
|
|
switch (message) {
|
|
case WM_INITDIALOG:
|
|
// Center the dialog over the application window
|
|
CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER));
|
|
|
|
hCtrl = GetDlgItem(hDlg, IDC_VIEWLOG);
|
|
|
|
// check if logfile exists, if it does allow log file viewing...
|
|
hFile = CreateFileA( "LogFile.LOG", GENERIC_READ, 0, NULL, OPEN_EXISTING,
|
|
FILE_ATTRIBUTE_NORMAL, NULL);
|
|
|
|
if (hFile != (HANDLE) INVALID_HANDLE_VALUE)
|
|
CloseHandle( hFile );
|
|
else
|
|
EnableWindow(hCtrl, FALSE);
|
|
|
|
SendDlgItemMessage(hDlg, IDC_S_TOT_COMP, WM_SETTEXT, 0, (LPARAM) lToStr(TotConversions));
|
|
SendDlgItemMessage(hDlg, IDC_S_TOT_GROUPS, WM_SETTEXT, 0, (LPARAM) lToStr(TotGroups));
|
|
SendDlgItemMessage(hDlg, IDC_S_TOT_USERS, WM_SETTEXT, 0, (LPARAM) lToStr(TotUsers));
|
|
SendDlgItemMessage(hDlg, IDC_S_TOT_FILES, WM_SETTEXT, 0, (LPARAM) lToStr(TotFiles));
|
|
SendDlgItemMessage(hDlg, IDC_S_TOT_ERRORS, WM_SETTEXT, 0, (LPARAM) lToStr(TotErrors));
|
|
|
|
if (TransferCancel)
|
|
SendMessage(hDlg, WM_SETTEXT, (WPARAM) 0, (LPARAM) Lids(IDS_D_17));
|
|
|
|
return (TRUE);
|
|
|
|
case WM_COMMAND:
|
|
wmId = LOWORD(wParam);
|
|
wmEvent = HIWORD(wParam);
|
|
|
|
switch (wmId) {
|
|
case IDOK:
|
|
case IDCANCEL:
|
|
EndDialog(hDlg, 0);
|
|
return (TRUE);
|
|
break;
|
|
|
|
case IDC_VIEWLOG:
|
|
lstrcpyA(CmdLine, "LogView ");
|
|
lstrcatA(CmdLine, "Error.LOG Summary.LOG LogFile.LOG");
|
|
WinExec(CmdLine, SW_SHOW);
|
|
return (TRUE);
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
return (FALSE); // Didn't process the message
|
|
|
|
lParam;
|
|
} // DlgConversionEnd
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| ConversionEndDlg_Do()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
void ConversionEndDlg_Do(HWND hDlg) {
|
|
DLGPROC lpfnDlg;
|
|
|
|
lpfnDlg = MakeProcInstance((DLGPROC) DlgConversionEnd, hInst);
|
|
DialogBox(hInst, TEXT("ConversionEnd"), hDlg, lpfnDlg) ;
|
|
FreeProcInstance(lpfnDlg);
|
|
|
|
} // ConversionEndDlg_Do
|
|
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| User / Group lists and Cache routines |
|
|
+-------------------------------------------------------------------------+*/
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| FindUserMatch()
|
|
|
|
|
| Searches through the user list using a binary search. Returns a
|
|
| pointer to the found user record or NULL if no match.
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
USER_BUFFER *FindUserMatch(LPTSTR Name, USER_LIST *UserList, BOOL NewName) {
|
|
LONG begin = 0;
|
|
LONG end;
|
|
LONG cur;
|
|
int match;
|
|
USER_BUFFER *UserBuffer;
|
|
|
|
if (UserList == NULL)
|
|
return NULL;
|
|
|
|
UserBuffer = UserList->UserBuffer;
|
|
end = UserList->Count - 1;
|
|
|
|
while (end >= begin) {
|
|
// go halfway in-between
|
|
cur = (begin + end) / 2;
|
|
|
|
// compare the two result into match
|
|
if (NewName)
|
|
match = lstrcmpi(Name, UserBuffer[cur].NewName);
|
|
else
|
|
match = lstrcmpi(Name, UserBuffer[cur].Name);
|
|
|
|
if (match < 0)
|
|
// move new begin
|
|
end = cur - 1;
|
|
else
|
|
begin = cur + 1;
|
|
|
|
if (match == 0)
|
|
return &UserBuffer[cur];
|
|
}
|
|
|
|
return NULL;
|
|
|
|
} // FindUserMatch
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| FindGroupMatch()
|
|
|
|
|
| Searches through the group list using a binary search. Returns a
|
|
| pointer to the found group record or NULL if no match.
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
GROUP_BUFFER *FindGroupMatch(LPTSTR Name, GROUP_LIST *GroupList, BOOL NewName) {
|
|
LONG begin = 0;
|
|
LONG end;
|
|
LONG cur;
|
|
int match;
|
|
GROUP_BUFFER *GroupBuffer;
|
|
|
|
if (GroupList == NULL)
|
|
return NULL;
|
|
|
|
GroupBuffer = GroupList->GroupBuffer;
|
|
end = GroupList->Count - 1;
|
|
|
|
while (end >= begin) {
|
|
// go halfway in-between
|
|
cur = (begin + end) / 2;
|
|
|
|
// compare the two result into match
|
|
if (NewName)
|
|
match = lstrcmpi(Name, GroupBuffer[cur].NewName);
|
|
else
|
|
match = lstrcmpi(Name, GroupBuffer[cur].Name);
|
|
|
|
if (match < 0)
|
|
// move new begin
|
|
end = cur - 1;
|
|
else
|
|
begin = cur + 1;
|
|
|
|
if (match == 0)
|
|
return &GroupBuffer[cur];
|
|
}
|
|
|
|
return NULL;
|
|
|
|
} // FindGroupMatch
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| The List Cache's are a linked list of previously converted user and
|
|
| group lists. This is mostly for when running trial conversions you can
|
|
| check if a previously transferred name conflicts with a new name (since
|
|
| the name won't actually be out on the destination server).
|
|
|
|
|
| The Cache is kept around while working with the same destination server
|
|
| or domain. Once a new domain/server is selected the cache and all lists
|
|
| should be freed.
|
|
+-------------------------------------------------------------------------+*/
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| ListCachePut()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
BOOL ListCachePut(LIST_CACHE **CacheHead, void *ul, ULONG Count) {
|
|
LIST_CACHE *cc;
|
|
LIST_CACHE *pc;
|
|
|
|
cc = (LIST_CACHE *) AllocMemory(sizeof(LIST_CACHE));
|
|
|
|
if (cc == NULL)
|
|
return FALSE;
|
|
|
|
// Init the cache entry
|
|
cc->next = NULL;
|
|
cc->Count = Count;
|
|
cc->ul = ul;
|
|
|
|
// Now put it at the end of the chain
|
|
if (*CacheHead == NULL) {
|
|
*CacheHead = cc;
|
|
return TRUE;
|
|
}
|
|
|
|
pc = *CacheHead;
|
|
while (pc->next)
|
|
pc = pc->next;
|
|
|
|
pc->next = cc;
|
|
return TRUE;
|
|
|
|
} // ListCachePut
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| ListCacheFree()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
void ListCacheFree(LIST_CACHE **CacheHead) {
|
|
LIST_CACHE *cc;
|
|
LIST_CACHE *pc;
|
|
|
|
cc = *CacheHead;
|
|
|
|
while (cc) {
|
|
// Free the user list attached to this cache entry
|
|
FreeMemory(cc->ul);
|
|
|
|
// Save next cache entry
|
|
pc = cc->next;
|
|
|
|
// Free up the cache entry and loop
|
|
FreeMemory(cc);
|
|
cc = pc;
|
|
}
|
|
|
|
*CacheHead = NULL;
|
|
|
|
} // ListCacheFree
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| UserCacheMatch()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
BOOL UserCacheMatch(LPTSTR UserName) {
|
|
LIST_CACHE *cc;
|
|
BOOL match = FALSE;
|
|
|
|
cc = UserCacheHead;
|
|
|
|
// loop through the cache entries and try to match with each user list
|
|
while (cc && !match) {
|
|
if (FindUserMatch(UserName, (USER_LIST *) cc->ul, TRUE))
|
|
match = TRUE;
|
|
else
|
|
cc = cc->next;
|
|
}
|
|
|
|
return match;
|
|
|
|
} // UserCacheMatch
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| GroupCacheMatch()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
BOOL GroupCacheMatch(LPTSTR GroupName) {
|
|
LIST_CACHE *cc;
|
|
BOOL match = FALSE;
|
|
|
|
cc = GroupCacheHead;
|
|
|
|
// loop through the cache entries and try to match with each user list
|
|
while (cc && !match) {
|
|
if (FindGroupMatch(GroupName, (GROUP_LIST *) cc->ul, TRUE))
|
|
match = TRUE;
|
|
else
|
|
cc = cc->next;
|
|
}
|
|
|
|
return match;
|
|
|
|
} // GroupCacheMatch
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| Logging Garbage |
|
|
+-------------------------------------------------------------------------+*/
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| ConvertOptionsLog()
|
|
|
|
|
| Writes all the admin selected conversion options to the log file.
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
void ConvertOptionsLog() {
|
|
|
|
LogWriteLog(0, Lids(IDS_L_136));
|
|
|
|
if (ConvOpt->TransferUserInfo)
|
|
LogWriteLog(1, Lids(IDS_L_137), Lids(IDS_YES));
|
|
else
|
|
LogWriteLog(1, Lids(IDS_L_137), Lids(IDS_NO));
|
|
|
|
LogWriteLog(0, Lids(IDS_CRLF));
|
|
|
|
if (ConvOpt->TransferUserInfo) {
|
|
LogWriteLog(1, Lids(IDS_L_140));
|
|
|
|
if (ConvOpt->UseMappingFile) {
|
|
LogWriteLog(2, Lids(IDS_L_138), Lids(IDS_YES));
|
|
LogWriteLog(3, Lids(IDS_L_139), ConvOpt->MappingFile);
|
|
} else {
|
|
LogWriteLog(2, Lids(IDS_L_138), Lids(IDS_NO));
|
|
|
|
// Password Options
|
|
LogWriteLog(2, Lids(IDS_L_141));
|
|
switch (ConvOpt->PasswordOption) {
|
|
case 0: // Use NULL
|
|
LogWriteLog(0, Lids(IDS_L_142));
|
|
break;
|
|
|
|
case 1: // Password is username
|
|
LogWriteLog(0, Lids(IDS_L_143));
|
|
break;
|
|
|
|
case 2: // Use constant
|
|
LogWriteLog(0, Lids(IDS_L_144), ConvOpt->PasswordConstant);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (ConvOpt->ForcePasswordChange)
|
|
LogWriteLog(3, Lids(IDS_L_145), Lids(IDS_YES));
|
|
else
|
|
LogWriteLog(3, Lids(IDS_L_145), Lids(IDS_NO));
|
|
|
|
if (!ConvOpt->UseMappingFile) {
|
|
// User Names Options
|
|
LogWriteLog(2, Lids(IDS_L_146));
|
|
|
|
switch (ConvOpt->UserNameOption) {
|
|
case 0: // Don't transfer - log failures
|
|
LogWriteLog(0, Lids(IDS_L_148));
|
|
break;
|
|
|
|
case 1: // Ignore
|
|
LogWriteLog(0, Lids(IDS_L_149));
|
|
break;
|
|
|
|
case 2: // Overwrite with new info
|
|
LogWriteLog(0, Lids(IDS_L_151));
|
|
break;
|
|
|
|
case 3: // Pre-Pend constant
|
|
LogWriteLog(0, Lids(IDS_L_150), ConvOpt->UserConstant);
|
|
break;
|
|
}
|
|
|
|
LogWriteLog(0, Lids(IDS_CRLF));
|
|
|
|
// Group Names Options
|
|
LogWriteLog(2, Lids(IDS_L_147));
|
|
|
|
switch (ConvOpt->GroupNameOption) {
|
|
case 0: // Don't transfer - log failures
|
|
LogWriteLog(0, Lids(IDS_L_148));
|
|
break;
|
|
|
|
case 1: // Overwrite with new info
|
|
LogWriteLog(0, Lids(IDS_L_149));
|
|
break;
|
|
|
|
case 2: // Pre-Pend constant
|
|
LogWriteLog(0, Lids(IDS_L_150), ConvOpt->GroupConstant);
|
|
break;
|
|
}
|
|
|
|
LogWriteLog(0, Lids(IDS_CRLF));
|
|
}
|
|
|
|
if (ConvOpt->SupervisorDefaults)
|
|
LogWriteLog(2, Lids(IDS_L_152), Lids(IDS_YES));
|
|
else
|
|
LogWriteLog(2, Lids(IDS_L_152), Lids(IDS_NO));
|
|
|
|
if (ConvOpt->AdminAccounts)
|
|
LogWriteLog(2, Lids(IDS_L_153), Lids(IDS_YES));
|
|
else
|
|
LogWriteLog(2, Lids(IDS_L_153), Lids(IDS_NO));
|
|
|
|
if (ConvOpt->UseTrustedDomain && (ConvOpt->TrustedDomain != NULL))
|
|
LogWriteLog(2, Lids(IDS_L_154), ConvOpt->TrustedDomain->Name);
|
|
|
|
LogWriteLog(0, Lids(IDS_CRLF));
|
|
}
|
|
|
|
LogWriteLog(0, Lids(IDS_CRLF));
|
|
|
|
} // ConvertOptionsLog
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| OptionsFileLog()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
void OptionsFileLog() {
|
|
LogWriteLog(0, Lids(IDS_L_155));
|
|
|
|
if (FileOptions->TransferFileInfo)
|
|
LogWriteLog(1, Lids(IDS_L_156), Lids(IDS_YES));
|
|
else
|
|
LogWriteLog(1, Lids(IDS_L_156), Lids(IDS_NO));
|
|
|
|
LogWriteLog(0, Lids(IDS_CRLF));
|
|
} // OptionsFileLog
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| ConvertPairLog()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
void ConvertPairLog() {
|
|
LogWriteLog(0, Lids(IDS_LINE));
|
|
wsprintf(tmpStr, Lids(IDS_L_157), SourceServer);
|
|
LogWriteLog(0, Lids(IDS_BRACE), tmpStr);
|
|
|
|
wsprintf(tmpStr, Lids(IDS_L_158), DestServer);
|
|
LogWriteLog(0, Lids(IDS_BRACE), tmpStr);
|
|
|
|
LogWriteLog(0, Lids(IDS_LINE));
|
|
GetTime(tmpStr2);
|
|
wsprintf(tmpStr, Lids(IDS_L_159), tmpStr2);
|
|
LogWriteLog(0, Lids(IDS_BRACE), tmpStr);
|
|
LogWriteLog(0, Lids(IDS_LINE));
|
|
LogWriteLog(0, Lids(IDS_CRLF));
|
|
|
|
LogWriteSummary(0, Lids(IDS_CRLF));
|
|
LogWriteSummary(0, TEXT("[%s -> %s]\r\n"), SourceServer, DestServer);
|
|
ErrorContextSet(TEXT("[%s -> %s]\r\n"), SourceServer, DestServer);
|
|
|
|
} // ConvertPairLog
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| UsersLogNames()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
void UsersLogNames(USER_LIST *Users) {
|
|
ULONG i;
|
|
DWORD UserCount;
|
|
USER_BUFFER *UserBuffer;
|
|
|
|
if (Users == NULL)
|
|
return;
|
|
|
|
UserCount = Users->Count;
|
|
UserBuffer = Users->UserBuffer;
|
|
|
|
if (UserCount) {
|
|
LogWriteLog(1, Lids(IDS_L_160));
|
|
LogWriteLog(1, Lids(IDS_L_161));
|
|
|
|
// Check Mapping File
|
|
for (i = 0; i < UserCount; i++) {
|
|
if (UserBuffer[i].IsNewName)
|
|
wsprintf(pLine, TEXT("%s -> %s"), UserBuffer[i].Name, UserBuffer[i].NewName);
|
|
else
|
|
wsprintf(pLine, TEXT("%s"), UserBuffer[i].NewName);
|
|
|
|
LogWriteLog(1, TEXT(" %-50s"), pLine);
|
|
|
|
if (UserBuffer[i].err) {
|
|
if (UserBuffer[i].err == NWC_ERR_NAMELONG)
|
|
LogWriteLog(0, Lids(IDS_L_162));
|
|
|
|
if (UserBuffer[i].err == NWC_ERR_DUPLICATE)
|
|
LogWriteLog(0, Lids(IDS_L_163));
|
|
|
|
if (UserBuffer[i].err == NWC_ERR_NAMEINVALID)
|
|
LogWriteLog(0, Lids(IDS_L_164));
|
|
|
|
}
|
|
|
|
// Need to check this seperatly - as it's not an error
|
|
if (UserBuffer[i].Overwrite)
|
|
LogWriteLog(0, Lids(IDS_L_163));
|
|
|
|
LogWriteLog(0, Lids(IDS_CRLF));
|
|
|
|
}
|
|
|
|
LogWriteLog(0, Lids(IDS_CRLF));
|
|
}
|
|
|
|
} // UsersLogNames
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| UserNewName_Check()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
void UserNewName_Check(USER_BUFFER *Users) {
|
|
// We have done any mappings that need to be done, now check for
|
|
// name validity if there is a new name...
|
|
if (Users->IsNewName)
|
|
if (UserCacheMatch(Users->NewName)) {
|
|
Users->err = NWC_ERR_DUPLICATE;
|
|
}
|
|
|
|
if (lstrlen(Users->NewName) > MAX_NT_USER_NAME_LEN) {
|
|
// Name is too long
|
|
Users->err = NWC_ERR_NAMELONG;
|
|
}
|
|
|
|
// Check if a valid name (no illegal characters)...
|
|
if ((int) wcscspn(Users->NewName, ILLEGAL_CHARS) < (int) lstrlen(Users->NewName))
|
|
Users->err = NWC_ERR_NAMEINVALID;
|
|
|
|
} // UserNewName_Check
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| UserNames_Resolve()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
void UserNames_Resolve(USER_BUFFER *Users) {
|
|
LPTSTR TheName;
|
|
LPTSTR ErrorText;
|
|
ULONG RetType;
|
|
|
|
// Figure out which name to use
|
|
if (Users->IsNewName)
|
|
TheName = Users->Name;
|
|
else
|
|
TheName = Users->NewName;
|
|
|
|
// If using mapping file then map the name appropriatly
|
|
if (ConvOpt->UseMappingFile) {
|
|
if (UserCacheMatch(TheName))
|
|
Users->err = NWC_ERR_DUPLICATE;
|
|
} else {
|
|
// check if the user name is in the destination list (duplicate)
|
|
if (UserCacheMatch(TheName)) {
|
|
// There was - so figure out based on conversion options what
|
|
// to do with it...
|
|
switch (ConvOpt->UserNameOption) {
|
|
case 0: // Log Errors
|
|
Users->err = NWC_ERR_DUPLICATE;
|
|
break;
|
|
|
|
case 1: // ignore
|
|
Users->err = NWC_ERR_IGNORE;
|
|
break;
|
|
|
|
case 2: // Overwrite
|
|
Users->Overwrite = TRUE;
|
|
break;
|
|
|
|
case 3: // Pre-Pend constant
|
|
lstrcpy(NewName, ConvOpt->UserConstant);
|
|
lstrcat(NewName, Users->Name);
|
|
lstrcpy(Users->NewName, NewName);
|
|
Users->IsNewName = TRUE;
|
|
break;
|
|
} // switch
|
|
}
|
|
}
|
|
|
|
do {
|
|
RetType = IDIGNORE;
|
|
UserNewName_Check(Users);
|
|
|
|
if (Users->err && (Users->err != NWC_ERR_IGNORE) && PopupOnError()) {
|
|
switch(Users->err) {
|
|
case NWC_ERR_NAMELONG:
|
|
ErrorText = Lids(IDS_L_165);
|
|
break;
|
|
|
|
case NWC_ERR_DUPLICATE:
|
|
ErrorText = Lids(IDS_L_166);
|
|
break;
|
|
|
|
case NWC_ERR_NAMEINVALID:
|
|
ErrorText = Lids(IDS_L_167);
|
|
break;
|
|
|
|
}
|
|
|
|
RetType = UserNameErrorDlg_Do(Lids(IDS_L_168), ErrorText, Users);
|
|
}
|
|
} while (RetType == IDRETRY);
|
|
|
|
if (RetType == IDABORT)
|
|
TransferCancel = TRUE;
|
|
|
|
} // UserNames_Resolve
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| UserSave()
|
|
|
|
|
| Given a user-name, moves their account information from the source
|
|
| to the destination server.
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
BOOL UserSave(BOOL *NWInfo, LPTSTR origUserName, LPTSTR newUserName, NT_USER_INFO *NTInfo, void **OldInfo, BOOL Replace) {
|
|
NET_API_STATUS ret = 0;
|
|
void *NWUInfo;
|
|
FPNW_INFO fpnw;
|
|
static TCHAR ServerName[MAX_SERVER_NAME_LEN+3]; // +3 for leading slashes and ending NULL
|
|
|
|
*NWInfo = FALSE;
|
|
|
|
// Overlay NetWare info into record
|
|
NWUserInfoGet(origUserName, OldInfo);
|
|
NWUInfo = *OldInfo;
|
|
|
|
if (NWUInfo == NULL)
|
|
return FALSE;
|
|
|
|
*NWInfo = TRUE;
|
|
NWNetUserMapInfo(origUserName, NWUInfo, NTInfo);
|
|
|
|
// Force user to change password if required
|
|
if (ConvOpt->ForcePasswordChange)
|
|
NTInfo->password_expired = (DWORD) (-1L);
|
|
|
|
// Now get/map special FPNW info
|
|
if (ConvOpt->NetWareInfo) {
|
|
NWFPNWMapInfo(NWUInfo, &fpnw);
|
|
}
|
|
|
|
if (!TConversion)
|
|
if (Replace)
|
|
if (ConvOpt->NetWareInfo)
|
|
ret = NTUserInfoSet(NTInfo, &fpnw);
|
|
else
|
|
ret = NTUserInfoSet(NTInfo, NULL);
|
|
else
|
|
if (ConvOpt->NetWareInfo)
|
|
ret = NTUserInfoSave(NTInfo, &fpnw);
|
|
else
|
|
ret = NTUserInfoSave(NTInfo, NULL);
|
|
|
|
if (ret)
|
|
return FALSE;
|
|
else {
|
|
// now save out FPNW Info
|
|
if (ConvOpt->NetWareInfo)
|
|
NTSAMParmsSet(newUserName, fpnw, NTInfo->password, ConvOpt->ForcePasswordChange);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
} // UserSave
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| UsersConvert()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
void UsersConvert() {
|
|
static TCHAR Password[MAX_PW_LEN + 1];
|
|
USER_BUFFER *UserBuffer = NULL;
|
|
BOOL NWInfo;
|
|
DWORD status = 0;
|
|
DWORD i;
|
|
void *NW_UInfo;
|
|
static NT_USER_INFO NT_UInfo;
|
|
ULONG TotConv = 0;
|
|
|
|
Status_ConvTxt(Lids(IDS_D_18));
|
|
Status_ItemLabel(Lids(IDS_D_19));
|
|
|
|
Status_CurTot((UINT) UserCount);
|
|
|
|
LogWriteLog(0, Lids(IDS_L_169));
|
|
LogWriteLog(1, Lids(IDS_L_170), UserCount);
|
|
ErrorCategorySet(Lids(IDS_L_171));
|
|
|
|
if (Users == NULL)
|
|
return;
|
|
|
|
UserBuffer = Users->UserBuffer;
|
|
|
|
// This will update the status pane - but we will reset it afterwards
|
|
for (i = 0; i < UserCount; i++) {
|
|
// Don't update totals yet, but update item ref incase this takes
|
|
// awhile
|
|
Status_CurNum((UINT) i + 1);
|
|
Status_Item(UserBuffer[i].Name);
|
|
|
|
UserNames_Resolve(&UserBuffer[i]);
|
|
if (TransferCancel)
|
|
return;
|
|
}
|
|
|
|
UsersLogNames(Users);
|
|
|
|
i = 0;
|
|
while (i < UserCount) {
|
|
Status_CurNum((UINT) i + 1);
|
|
Status_Item(UserBuffer[i].Name);
|
|
lstrcpy(pLine, UserBuffer[i].Name);
|
|
|
|
if (UserBuffer[i].IsNewName)
|
|
wsprintf(pLine, TEXT("[%s -> %s]"), UserBuffer[i].Name, UserBuffer[i].NewName);
|
|
else
|
|
wsprintf(pLine, TEXT("[%s]"), UserBuffer[i].NewName);
|
|
|
|
LogWriteLog(1, TEXT("%-50s"), pLine);
|
|
ErrorItemSet(TEXT("%s\r\n"), pLine);
|
|
|
|
// If duplicate or other type error just do logging - don't try to save
|
|
if (UserBuffer[i].err) {
|
|
if (UserBuffer[i].err == NWC_ERR_DUPLICATE) {
|
|
LogWriteLog(0, Lids(IDS_L_172));
|
|
ErrorIt(Lids(IDS_L_173));
|
|
}
|
|
|
|
if (UserBuffer[i].err == NWC_ERR_NAMELONG) {
|
|
LogWriteLog(0, Lids(IDS_L_174));
|
|
ErrorIt(Lids(IDS_L_175));
|
|
}
|
|
|
|
if (UserBuffer[i].err == NWC_ERR_NAMEINVALID) {
|
|
LogWriteLog(0, Lids(IDS_L_176));
|
|
ErrorIt(Lids(IDS_L_177));
|
|
}
|
|
|
|
} else {
|
|
// Init the user record
|
|
NTUserRecInit(UserBuffer[i].NewName, &NT_UInfo);
|
|
|
|
// +-------------------------------------------------------------+
|
|
// | User name figured out - now map password |
|
|
// +-------------------------------------------------------------+
|
|
memset(Password, 0, sizeof(Password));
|
|
if (ConvOpt->UseMappingFile)
|
|
// If using map file, password is already set
|
|
lstrcpy(Password, UserBuffer[i].Password);
|
|
else
|
|
if (lstrlen(Password) == 0) {
|
|
// Didn't map password - so find what to use
|
|
switch (ConvOpt->PasswordOption) {
|
|
case 0: // No Password
|
|
// Don't need to do anything
|
|
break;
|
|
|
|
case 1: // Username
|
|
// BUGBUG: Name can be longer then password!!!
|
|
lstrcpy(Password, UserBuffer[i].NewName);
|
|
break;
|
|
|
|
case 2: // Constant
|
|
lstrcpy(Password, ConvOpt->PasswordConstant);
|
|
break;
|
|
|
|
} // switch
|
|
}
|
|
|
|
NT_UInfo.password = Password;
|
|
|
|
#ifdef DEBUG
|
|
dprintf(TEXT("User: %s\n"), UserBuffer[i].Name);
|
|
#endif
|
|
|
|
if (!UserSave(&NWInfo, UserBuffer[i].Name, UserBuffer[i].NewName, &NT_UInfo, &NW_UInfo, UserBuffer[i].Overwrite )) {
|
|
LogWriteLog(0, Lids(IDS_L_178));
|
|
ErrorIt(Lids(IDS_L_179));
|
|
} else {
|
|
// only increment total if actually converted...
|
|
TotUsers++;
|
|
TotConv++;
|
|
Status_TotUsers(TotUsers);
|
|
|
|
LogWriteLog(0, Lids(IDS_L_180));
|
|
LogWriteLog(0, Lids(IDS_CRLF));
|
|
|
|
// Converted - now need to save info to logs...
|
|
if (NWInfo) {
|
|
if (VerboseUserLogging())
|
|
NWUserInfoLog(UserBuffer[i].Name, NW_UInfo);
|
|
|
|
if (VerboseUserLogging())
|
|
NTUserRecLog(NT_UInfo);
|
|
}
|
|
|
|
}
|
|
|
|
LogWriteLog(0, Lids(IDS_CRLF));
|
|
|
|
}
|
|
|
|
i++;
|
|
}
|
|
|
|
LogWriteLog(0, Lids(IDS_CRLF));
|
|
LogWriteSummary(1, Lids(IDS_L_181), lToStr(TotConv));
|
|
|
|
} // UsersConvert
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| GroupSave()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
BOOL GroupSave(LPTSTR Name, DWORD *Status) {
|
|
|
|
*Status = 0;
|
|
|
|
if (!TConversion)
|
|
if ((*Status = NTGroupSave(Name)))
|
|
return FALSE;
|
|
|
|
return TRUE;
|
|
|
|
} // GroupSave
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| GroupNewName_Check()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
void GroupNewName_Check(GROUP_BUFFER *Groups) {
|
|
// We have done any mappings that need to be done, now check for
|
|
// name validity if there is a new name...
|
|
if (Groups->IsNewName)
|
|
if (GroupCacheMatch(Groups->NewName)) {
|
|
Groups->err = NWC_ERR_DUPLICATE;
|
|
}
|
|
|
|
// make sure not too long
|
|
if (lstrlen(Groups->NewName) > MAX_NT_GROUP_NAME_LEN) {
|
|
// Name is too long
|
|
Groups->err = NWC_ERR_NAMELONG;
|
|
}
|
|
|
|
// Check if a valid name (no illegal characters)...
|
|
if ((int) wcscspn(Groups->NewName, ILLEGAL_CHARS) < (int) lstrlen(Groups->NewName))
|
|
Groups->err = NWC_ERR_NAMEINVALID;
|
|
|
|
} // GroupNewName_Check
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| GroupNames_Resolve()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
void GroupNames_Resolve(GROUP_BUFFER *Groups) {
|
|
LPTSTR TheName;
|
|
LPTSTR ErrorText;
|
|
ULONG RetType;
|
|
|
|
// Figure out which name to use
|
|
if (Groups->IsNewName)
|
|
TheName = Groups->Name;
|
|
else
|
|
TheName = Groups->NewName;
|
|
|
|
// If using mapping file then map the name appropriatly
|
|
if (ConvOpt->UseMappingFile) {
|
|
if (GroupCacheMatch(TheName))
|
|
Groups->err = NWC_ERR_DUPLICATE;
|
|
} else {
|
|
// check if the user name is in the destination list (duplicate)
|
|
if (GroupCacheMatch(TheName)) {
|
|
// There was - so figure out based on conversion options what
|
|
// to do with it...
|
|
switch (ConvOpt->GroupNameOption) {
|
|
case 0: // Log Errors
|
|
Groups->err = NWC_ERR_DUPLICATE;
|
|
break;
|
|
|
|
case 1: // ignore
|
|
Groups->err = NWC_ERR_IGNORE;
|
|
break;
|
|
|
|
case 2: // Pre-Pend constant
|
|
lstrcpy(NewName, ConvOpt->GroupConstant);
|
|
lstrcat(NewName, Groups->Name);
|
|
lstrcpy(Groups->NewName, NewName);
|
|
Groups->IsNewName = TRUE;
|
|
break;
|
|
} // switch
|
|
}
|
|
}
|
|
|
|
do {
|
|
RetType = IDIGNORE;
|
|
GroupNewName_Check(Groups);
|
|
|
|
if (Groups->err && (Groups->err != NWC_ERR_IGNORE) && PopupOnError()) {
|
|
switch(Groups->err) {
|
|
case NWC_ERR_NAMELONG:
|
|
ErrorText = Lids(IDS_L_182);
|
|
break;
|
|
|
|
case NWC_ERR_DUPLICATE:
|
|
ErrorText = Lids(IDS_L_183);
|
|
break;
|
|
|
|
case NWC_ERR_NAMEINVALID:
|
|
ErrorText = Lids(IDS_L_184);
|
|
break;
|
|
|
|
}
|
|
|
|
RetType = GroupNameErrorDlg_Do(Lids(IDS_L_185), ErrorText, Groups);
|
|
}
|
|
} while (RetType == IDRETRY);
|
|
|
|
if (RetType == IDABORT)
|
|
TransferCancel = TRUE;
|
|
|
|
} // GroupNames_Resolve
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| GroupsConvert()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
void GroupsConvert() {
|
|
USER_LIST *GUsers = NULL;
|
|
USER_BUFFER *GUserBuffer;
|
|
USER_BUFFER *pUser;
|
|
GROUP_BUFFER *pGroup;
|
|
GROUP_BUFFER *GroupBuffer = NULL;
|
|
DWORD GUserCount;
|
|
DWORD status = 0;
|
|
ULONG Count, i;
|
|
ULONG TotConv = 0;
|
|
LPTSTR NewName;
|
|
BOOL SecEquivTitle = FALSE;
|
|
BOOL SecEquivUser = FALSE;
|
|
TCHAR GroupTitle[TMP_STR_LEN_256];
|
|
|
|
// update status pane
|
|
Status_ConvTxt(Lids(IDS_D_20));
|
|
Status_ItemLabel(Lids(IDS_D_21));
|
|
ErrorCategorySet(Lids(IDS_L_186));
|
|
|
|
Status_CurTot((UINT) GroupCount);
|
|
LogWriteLog(0, Lids(IDS_L_187));
|
|
LogWriteLog(1, Lids(IDS_L_188), GroupCount);
|
|
|
|
if (Groups == NULL)
|
|
return;
|
|
|
|
GroupBuffer = Groups->GroupBuffer;
|
|
|
|
for (i = 0; i < GroupCount; i++) {
|
|
// Don't update totals yet, but update item ref incase this takes
|
|
// awhile
|
|
Status_CurNum((UINT) i + 1);
|
|
Status_Item(GroupBuffer[i].Name);
|
|
|
|
GroupNames_Resolve(&GroupBuffer[i]);
|
|
|
|
if (TransferCancel)
|
|
return;
|
|
}
|
|
|
|
i = 0;
|
|
while (i < GroupCount) {
|
|
// update status pane for this group
|
|
Status_CurNum((UINT) i + 1);
|
|
Status_Item(GroupBuffer[i].Name);
|
|
lstrcpy(pLine, GroupBuffer[i].Name);
|
|
|
|
#ifdef DEBUG
|
|
dprintf(TEXT("Working on Group: %s\r\n"), GroupBuffer[i].Name);
|
|
#endif
|
|
|
|
if (GroupBuffer[i].IsNewName)
|
|
wsprintf(pLine, TEXT("%s -> %s"), GroupBuffer[i].Name, GroupBuffer[i].NewName);
|
|
else
|
|
wsprintf(pLine, TEXT("%s"), GroupBuffer[i].NewName);
|
|
|
|
LogWriteLog(1, TEXT("%-50s"), pLine);
|
|
ErrorItemSet(TEXT("[%s]\r\n"), pLine);
|
|
|
|
// If duplicate or other type error just do logging - don't try
|
|
// to save...
|
|
if (GroupBuffer[i].err) {
|
|
if (GroupBuffer[i].err == NWC_ERR_DUPLICATE) {
|
|
LogWriteLog(0, Lids(IDS_L_163));
|
|
ErrorIt(Lids(IDS_L_189));
|
|
}
|
|
|
|
if (GroupBuffer[i].err == NWC_ERR_NAMELONG) {
|
|
LogWriteLog(0, Lids(IDS_L_162));
|
|
ErrorIt(Lids(IDS_L_190));
|
|
}
|
|
|
|
if (GroupBuffer[i].err == NWC_ERR_NAMEINVALID) {
|
|
LogWriteLog(0, Lids(IDS_L_164));
|
|
ErrorIt(Lids(IDS_L_191));
|
|
}
|
|
|
|
} else {
|
|
// Try to save it and get any errors...
|
|
if (!GroupSave(GroupBuffer[i].NewName, &status)) {
|
|
LogWriteLog(0, Lids(IDS_L_192));
|
|
ErrorIt(Lids(IDS_L_193));
|
|
} else {
|
|
// only increment total if actually converted...
|
|
TotGroups++;
|
|
TotConv++;
|
|
Status_TotGroups(TotGroups);
|
|
|
|
LogWriteLog(0, Lids(IDS_L_180));
|
|
}
|
|
}
|
|
|
|
LogWriteLog(0, Lids(IDS_CRLF));
|
|
|
|
i++;
|
|
}
|
|
LogWriteLog(0, Lids(IDS_CRLF));
|
|
|
|
ErrorCategorySet(Lids(IDS_L_194));
|
|
// +-------------------------------------------------------------+
|
|
// | Go through and add users to the groups |
|
|
// +-------------------------------------------------------------+
|
|
for (Count = 0; Count < GroupCount; Count++) {
|
|
GUserCount = 0;
|
|
|
|
if (!(status = NWGroupUsersEnum(GroupBuffer[Count].Name, &GUsers)) && (GUsers != NULL)) {
|
|
GUserCount = GUsers->Count;
|
|
GUserBuffer = GUsers->UserBuffer;
|
|
|
|
if (GUserCount > 0) {
|
|
wsprintf(GroupTitle, Lids(IDS_S_46), GroupBuffer[Count].NewName);
|
|
EscapeFormattingChars(GroupTitle,
|
|
sizeof(GroupTitle)/sizeof(GroupTitle[0])) ;
|
|
Status_ItemLabel(GroupTitle);
|
|
LogWriteLog(1, TEXT("[%s]\r\n"), GroupBuffer[Count].NewName);
|
|
}
|
|
|
|
for (i = 0; i < GUserCount; i++) {
|
|
pUser = FindUserMatch(GUserBuffer[i].Name, Users, FALSE);
|
|
|
|
if (pUser == NULL)
|
|
NewName = NWSpecialNamesMap(GUserBuffer[i].Name);
|
|
else
|
|
NewName = pUser->NewName;
|
|
|
|
LogWriteLog(2, TEXT("%-20s"), NewName);
|
|
Status_Item(NewName);
|
|
|
|
#ifdef DEBUG
|
|
dprintf(TEXT("Adding User [%s] to Group: %s\n"), NewName, GroupBuffer[Count].NewName );
|
|
#endif
|
|
if (!TConversion)
|
|
if (NTGroupUserAdd(GroupBuffer[Count].NewName, NewName, FALSE)) {
|
|
LogWriteLog(0, Lids(IDS_L_196));
|
|
ErrorIt(Lids(IDS_L_195), NewName, GroupBuffer[Count].NewName);
|
|
}
|
|
|
|
LogWriteLog(0, Lids(IDS_CRLF));
|
|
}
|
|
|
|
LogWriteLog(0, Lids(IDS_CRLF));
|
|
FreeMemory((LPBYTE) GUsers);
|
|
} else {
|
|
LogWriteLog(1, Lids(IDS_L_197), GroupBuffer[Count].Name);
|
|
ErrorIt(Lids(IDS_L_197), GroupBuffer[Count].Name);
|
|
}
|
|
|
|
} // loop adding users to groups
|
|
|
|
ErrorCategorySet(Lids(IDS_L_198));
|
|
// +-------------------------------------------------------------+
|
|
// | Convert Security Equivalences to Group Names |
|
|
// +-------------------------------------------------------------+
|
|
SecEquivTitle = FALSE;
|
|
for (Count = 0; Count < UserCount; Count++) {
|
|
GUserCount = 0;
|
|
SecEquivUser = FALSE;
|
|
|
|
if (!(status = NWUserEquivalenceEnum(Users->UserBuffer[Count].Name, &GUsers)) && (GUsers != NULL)) {
|
|
GUserCount = GUsers->Count;
|
|
GUserBuffer = GUsers->UserBuffer;
|
|
|
|
if (GUserCount > 0) {
|
|
for (i = 0; i < GUserCount; i++) {
|
|
pGroup = FindGroupMatch(GUserBuffer[i].Name, Groups, FALSE);
|
|
|
|
if (pGroup != NULL) {
|
|
if ((pGroup->err != NWC_ERR_NAMELONG) && (pGroup->err != NWC_ERR_NAMEINVALID))
|
|
if (!SecEquivTitle) {
|
|
SecEquivTitle = TRUE;
|
|
LogWriteLog(0, Lids(IDS_CRLF));
|
|
LogWriteLog(0, Lids(IDS_L_199));
|
|
}
|
|
|
|
if (!SecEquivUser) {
|
|
SecEquivUser = TRUE;
|
|
wsprintf(GroupTitle, Lids(IDS_S_47), Users->UserBuffer[Count].NewName);
|
|
EscapeFormattingChars(GroupTitle,
|
|
sizeof(GroupTitle)/sizeof(GroupTitle[0])) ;
|
|
Status_ItemLabel(GroupTitle);
|
|
LogWriteLog(1, TEXT("[%s]\r\n"), Users->UserBuffer[Count].NewName);
|
|
}
|
|
|
|
LogWriteLog(2, TEXT("%-20s"), pGroup->NewName);
|
|
Status_Item(pGroup->NewName);
|
|
#ifdef DEBUG
|
|
dprintf(TEXT("User [%s] Security Equivalence: %s\n"), Users->UserBuffer[Count].NewName, pGroup->NewName );
|
|
#endif
|
|
if (!TConversion)
|
|
if (NTGroupUserAdd(pGroup->NewName, Users->UserBuffer[Count].NewName, FALSE)) {
|
|
LogWriteLog(0, Lids(IDS_L_196));
|
|
ErrorIt(Lids(IDS_L_195), Users->UserBuffer[Count].NewName, pGroup->NewName);
|
|
}
|
|
|
|
LogWriteLog(0, Lids(IDS_CRLF));
|
|
} else {
|
|
// There was not a group match - check if this is supervisor
|
|
// equivalence
|
|
if (!lstrcmpi(GUserBuffer[i].Name, Lids(IDS_S_28))) {
|
|
// Check if we should add them
|
|
if (ConvOpt->AdminAccounts) {
|
|
if (!SecEquivTitle) {
|
|
SecEquivTitle = TRUE;
|
|
LogWriteLog(0, Lids(IDS_CRLF));
|
|
LogWriteLog(0, Lids(IDS_L_199));
|
|
}
|
|
|
|
if (!SecEquivUser) {
|
|
SecEquivUser = TRUE;
|
|
LogWriteLog(1, TEXT("[%s]\r\n"), Users->UserBuffer[Count].NewName);
|
|
}
|
|
|
|
LogWriteLog(2, TEXT("%-20s"), Lids(IDS_S_42));
|
|
|
|
if (!TConversion)
|
|
if (NTGroupUserAdd(Lids(IDS_S_42), Users->UserBuffer[Count].NewName, FALSE)) {
|
|
LogWriteLog(0, Lids(IDS_L_196));
|
|
ErrorIt(Lids(IDS_L_195), Users->UserBuffer[Count].NewName, Lids(IDS_S_42));
|
|
}
|
|
|
|
LogWriteLog(0, Lids(IDS_CRLF));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Only put blank line if we logged this user
|
|
if (SecEquivUser)
|
|
LogWriteLog(0, Lids(IDS_CRLF));
|
|
|
|
}
|
|
|
|
FreeMemory((LPBYTE) GUsers);
|
|
}
|
|
|
|
} // Loop converting security equivalences
|
|
|
|
// Synchronize the domain - we need to synch as Print Operators are a
|
|
// local group
|
|
NTDomainSynch(CurrentConvertList->FileServ);
|
|
|
|
// Now set server to appropriate dest server (local group - so must
|
|
// be on dest server and not PDC or trusted domain)...
|
|
if ((status = NTServerSet(CurrentConvertList->FileServ->Name))) {
|
|
// Failed to set server so log it and loop to next server
|
|
LogWriteLog(0, Lids(IDS_L_209), CurrentConvertList->FileServ->Name);
|
|
ErrorIt(Lids(IDS_L_209), CurrentConvertList->FileServ->Name);
|
|
return;
|
|
}
|
|
|
|
ErrorCategorySet(Lids(IDS_L_200));
|
|
// +-------------------------------------------------------------+
|
|
// | Do Print Operators |
|
|
// +-------------------------------------------------------------+
|
|
SecEquivTitle = FALSE;
|
|
if (!(status = NWPrintOpsEnum(&GUsers)) && (GUsers != NULL)) {
|
|
GUserCount = GUsers->Count;
|
|
GUserBuffer = GUsers->UserBuffer;
|
|
|
|
if (GUserCount > 0) {
|
|
for (i = 0; i < GUserCount; i++) {
|
|
|
|
if (!SecEquivTitle) {
|
|
SecEquivTitle = TRUE;
|
|
LogWriteLog(0, Lids(IDS_CRLF));
|
|
LogWriteLog(0, Lids(IDS_L_201));
|
|
}
|
|
|
|
pUser = FindUserMatch(GUserBuffer[i].Name, Users, FALSE);
|
|
|
|
if ((pUser == NULL) || ((pUser->err != NWC_ERR_NAMELONG) && (pUser->err != NWC_ERR_NAMEINVALID))) {
|
|
if (pUser == NULL)
|
|
NewName = NWSpecialNamesMap(GUserBuffer[i].Name);
|
|
else
|
|
NewName = pUser->NewName;
|
|
|
|
LogWriteLog(2, TEXT("%-20s"), NewName);
|
|
#ifdef DEBUG
|
|
dprintf(TEXT("Adding User [%s] to Group: %s\n"), NewName, Lids(IDS_S_43) );
|
|
#endif
|
|
if (!TConversion)
|
|
if (NTGroupUserAdd(Lids(IDS_S_43), NewName, TRUE)) {
|
|
LogWriteLog(0, Lids(IDS_L_196));
|
|
ErrorIt(Lids(IDS_L_195), NewName, Lids(IDS_S_43));
|
|
}
|
|
|
|
LogWriteLog(0, Lids(IDS_CRLF));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
LogWriteSummary(1, Lids(IDS_L_202), lToStr(TotConv));
|
|
|
|
} // GroupsConvert
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| SupervisorDefaultsConvert()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
void SupervisorDefaultsConvert(TRANSFER_LIST *tl) {
|
|
ULONG i;
|
|
void *Defaults;
|
|
BOOL ConvertDefaults = FALSE;
|
|
NT_DEFAULTS *NTDefaults = NULL;
|
|
NT_DEFAULTS CDefaults;
|
|
DEST_SERVER_BUFFER *oDServ = NULL;
|
|
TRANSFER_BUFFER *TList;
|
|
CONVERT_OPTIONS *ConvOpt;
|
|
|
|
if (tl == NULL)
|
|
return;
|
|
|
|
TList = tl->TList;
|
|
|
|
memset(&CDefaults, 0, sizeof(CDefaults));
|
|
LogWriteLog(0, Lids(IDS_LINE));
|
|
LogWriteLog(0, Lids(IDS_BRACE), Lids(IDS_L_203));
|
|
LogWriteLog(0, Lids(IDS_LINE));
|
|
|
|
// Loop through the server pairs for conversion - this is sorted in order of
|
|
// destination users servers.
|
|
for (i = 0; i < tl->Count; i++) {
|
|
CurrentConvertList = TList[i].ConvertList;
|
|
ConvOpt = (CONVERT_OPTIONS *) CurrentConvertList->ConvertOptions;
|
|
|
|
if (CurrentConvertList->FileServ != oDServ) {
|
|
// if this is not the first time through the loop, then we need to save
|
|
// off the converted defaults
|
|
if (ConvertDefaults && (oDServ != NULL)) {
|
|
ConvertDefaults = FALSE;
|
|
LogWriteLog(0, Lids(IDS_L_204), oDServ->Name);
|
|
|
|
if (NTDefaults != NULL) {
|
|
NTUserDefaultsLog(*NTDefaults);
|
|
|
|
if (!TConversion)
|
|
NTUserDefaultsSet(*NTDefaults);
|
|
}
|
|
|
|
}
|
|
|
|
oDServ = CurrentConvertList->FileServ;
|
|
|
|
// Point to dest server and get defaults
|
|
NTServerSet(CurrentConvertList->FileServ->Name);
|
|
NTUserDefaultsGet(&NTDefaults);
|
|
memset(&CDefaults, 0, sizeof(CDefaults));
|
|
|
|
if (NTDefaults != NULL)
|
|
memcpy(&CDefaults, NTDefaults, sizeof(CDefaults));
|
|
|
|
}
|
|
|
|
// Supervisor defaults
|
|
if (ConvOpt->SupervisorDefaults) {
|
|
|
|
// if not flagged for this dest server, then flag and write out original
|
|
// values
|
|
if (!ConvertDefaults) {
|
|
ConvertDefaults = TRUE;
|
|
|
|
if (NTDefaults != NULL) {
|
|
LogWriteLog(0, Lids(IDS_L_205), CurrentConvertList->FileServ->Name);
|
|
NTUserDefaultsLog(*NTDefaults);
|
|
}
|
|
}
|
|
|
|
NWServerSet(CurrentConvertList->SourceServ->Name);
|
|
NWUserDefaultsGet(&Defaults);
|
|
|
|
if (Defaults != NULL) {
|
|
LogWriteLog(0, Lids(IDS_L_206), CurrentConvertList->SourceServ->Name);
|
|
NWUserDefaultsLog(Defaults);
|
|
NWUserDefaultsMap(Defaults, &CDefaults);
|
|
|
|
// Now map in least restrictive values to the NT one
|
|
if (NTDefaults != NULL) {
|
|
if (CDefaults.min_passwd_len < NTDefaults->min_passwd_len)
|
|
NTDefaults->min_passwd_len = CDefaults.min_passwd_len;
|
|
|
|
if (CDefaults.max_passwd_age < NTDefaults->max_passwd_age)
|
|
NTDefaults->max_passwd_age = CDefaults.max_passwd_age;
|
|
|
|
if (CDefaults.force_logoff < NTDefaults->force_logoff)
|
|
NTDefaults->force_logoff = CDefaults.force_logoff;
|
|
|
|
}
|
|
|
|
FreeMemory(Defaults);
|
|
Defaults = NULL;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
// Need to catch the last one through the loop
|
|
if (ConvertDefaults && (oDServ != NULL)) {
|
|
ConvertDefaults = FALSE;
|
|
LogWriteLog(0, Lids(IDS_L_204), oDServ->Name);
|
|
|
|
if (NTDefaults != NULL) {
|
|
NTUserDefaultsLog(*NTDefaults);
|
|
|
|
if (!TConversion)
|
|
NTUserDefaultsSet(*NTDefaults);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
} // SupervisorDefaultsConvert
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| TransferListCompare()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
int __cdecl TransferListCompare(const void *arg1, const void *arg2) {
|
|
TRANSFER_BUFFER *TBarg1, *TBarg2;
|
|
|
|
TBarg1 = (TRANSFER_BUFFER *) arg1;
|
|
TBarg2 = (TRANSFER_BUFFER *) arg2;
|
|
|
|
return lstrcmpi( TBarg1->ServerName, TBarg2->ServerName);
|
|
|
|
} // TransferListCompare
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| TransferListCreate()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
TRANSFER_LIST *TransferListCreate() {
|
|
CONVERT_OPTIONS *ConvOpt;
|
|
static TRANSFER_LIST *tl;
|
|
TRANSFER_BUFFER *TList;
|
|
CONVERT_LIST *CList;
|
|
ULONG Count = 0;
|
|
|
|
tl = NULL;
|
|
CList = ConvertListStart;
|
|
while (CList != NULL) {
|
|
Count++;
|
|
CList = CList->next;
|
|
}
|
|
|
|
if (Count == 0)
|
|
return NULL;
|
|
|
|
tl = AllocMemory(sizeof(TRANSFER_LIST) + (sizeof(TRANSFER_BUFFER) * Count));
|
|
if (tl == NULL)
|
|
return NULL;
|
|
|
|
tl->Count = Count;
|
|
TList = tl->TList;
|
|
|
|
// init it all to NULL
|
|
memset(TList, 0, sizeof(TRANSFER_BUFFER) * Count);
|
|
|
|
Count = 0;
|
|
CList = ConvertListStart;
|
|
while (CList != NULL) {
|
|
TList[Count].ConvertList = CList;
|
|
|
|
// If going to a trusted domain then point to it's PDC for user transfers
|
|
ConvOpt = (CONVERT_OPTIONS *) CList->ConvertOptions;
|
|
if (ConvOpt->UseTrustedDomain && (ConvOpt->TrustedDomain != NULL) && (ConvOpt->TrustedDomain->PDCName != NULL)) {
|
|
TList[Count].UserServerType = USER_SERVER_TRUSTED;
|
|
TList[Count].ServerName = ConvOpt->TrustedDomain->PDCName;
|
|
} else
|
|
// If in a domain then point to the PDC for user transfers
|
|
if (CList->FileServ->InDomain && CList->FileServ->Domain) {
|
|
TList[Count].UserServerType = USER_SERVER_PDC;
|
|
TList[Count].ServerName = CList->FileServ->Domain->PDCName;
|
|
} else {
|
|
TList[Count].UserServerType = USER_SERVER;
|
|
TList[Count].ServerName = CList->FileServ->Name;
|
|
}
|
|
|
|
Count++;
|
|
CList = CList->next;
|
|
}
|
|
|
|
// Have setup the main transfer list - now need to sort it in order of the
|
|
// server names that users are being transfered to.
|
|
qsort((void *) TList, (size_t) tl->Count, sizeof(TRANSFER_BUFFER), TransferListCompare);
|
|
|
|
#ifdef DEBUG
|
|
dprintf(TEXT("\nTransfer List:\n"));
|
|
for (Count = 0; Count < tl->Count; Count++) {
|
|
dprintf(TEXT(" Name: %s "), TList[Count].ServerName);
|
|
switch (TList[Count].UserServerType) {
|
|
case USER_SERVER:
|
|
dprintf(TEXT("(Normal)\n"));
|
|
break;
|
|
|
|
case USER_SERVER_PDC:
|
|
dprintf(TEXT("(PDC)\n"));
|
|
break;
|
|
|
|
case USER_SERVER_TRUSTED:
|
|
dprintf(TEXT("(TRUSTED)\n"));
|
|
break;
|
|
}
|
|
}
|
|
|
|
dprintf(TEXT("\n"));
|
|
#endif
|
|
return tl;
|
|
|
|
} // TransferListCreate
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| DoConversion()
|
|
|
|
|
| Main program that does the actuall conversion. Loops through the
|
|
| convert list and transfer the information.
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
void DoConversion(HWND hDlg, BOOL TrialConversion) {
|
|
TRANSFER_LIST *tl = NULL;
|
|
TRANSFER_BUFFER *TList;
|
|
LPTSTR oDServ = NULL;
|
|
DWORD status = 0;
|
|
UINT i;
|
|
BOOL GotUserList;
|
|
TCHAR sztime[40];
|
|
LPTSTR DomainName;
|
|
|
|
time(&StartTime);
|
|
TransferCancel = FALSE;
|
|
TConversion = TrialConversion;
|
|
|
|
// Check if going to non NTFS drives - if so, let user abort
|
|
NTFSCheck(hDlg);
|
|
if (TransferCancel)
|
|
return;
|
|
|
|
CursorHourGlass();
|
|
|
|
PanelDlg_Do(hDlg, Lids(IDS_D_22));
|
|
ConvertFilesInit(hDlg);
|
|
|
|
if (Panel_Cancel()) {
|
|
PanelDlgKill();
|
|
TransferCancel = TRUE;
|
|
CursorNormal();
|
|
return;
|
|
}
|
|
|
|
PanelDlgKill();
|
|
|
|
// Check if enough space on destination drives, if not allow user to abort
|
|
CursorNormal();
|
|
SpaceCheck(hDlg);
|
|
if (TransferCancel)
|
|
return;
|
|
|
|
CursorHourGlass();
|
|
tl = TransferListCreate();
|
|
TList = tl->TList;
|
|
|
|
DoStatusDlg(hDlg);
|
|
|
|
Status_TotConv((UINT) NumServerPairs);
|
|
|
|
Users = NULL;
|
|
NTUsers = NULL;
|
|
Groups = NULL;
|
|
NTGroups = NULL;
|
|
UserCount = 0;
|
|
NTUserCount = 0;
|
|
GroupCount = 0;
|
|
NTGroupCount= 0;
|
|
|
|
// Initialize global statistics
|
|
TotErrors = 0;
|
|
TotGroups = 0;
|
|
TotUsers = 0;
|
|
TotFiles = 0;
|
|
|
|
// Update statistics window
|
|
Status_TotComplete(0);
|
|
Status_TotGroups(TotGroups);
|
|
Status_TotUsers(TotUsers);
|
|
Status_TotFiles(TotFiles);
|
|
Status_TotErrors(TotErrors);
|
|
|
|
// Set up logs and do all the header stuff
|
|
LogInit();
|
|
|
|
if (TrialConversion) {
|
|
LogWriteLog(0, Lids(IDS_L_207));
|
|
} else {
|
|
LogWriteLog(0, Lids(IDS_L_208));
|
|
}
|
|
|
|
LogWriteSummary(0, Lids(IDS_CRLF));
|
|
LogWriteErr(Lids(IDS_CRLF));
|
|
LogWriteLog(0, Lids(IDS_CRLF));
|
|
|
|
// Log the list of servers to be converted
|
|
ErrorResetAll();
|
|
ConvertListLog();
|
|
|
|
// Loop through source servers and conglomerate defaults into dest servers
|
|
// and log the results
|
|
SupervisorDefaultsConvert(tl);
|
|
|
|
|
|
// +---------------------------------------------------------------------+
|
|
// | Done with init - loop through server pairs and do conversion |
|
|
// +---------------------------------------------------------------------+
|
|
|
|
// Get Local computer name
|
|
GetLocalName(&LocalName);
|
|
|
|
// Loop through the server pairs for conversion
|
|
for (i = 0; ((i < tl->Count) && !TransferCancel); i++) {
|
|
CurrentConvertList = TList[i].ConvertList;
|
|
|
|
// Get source and destination server - update logs and status window
|
|
Status_CurConv(i + 1);
|
|
|
|
SourceServer = CurrentConvertList->SourceServ->Name;
|
|
DestServer = CurrentConvertList->FileServ->Name;
|
|
|
|
Status_SrcServ(SourceServer);
|
|
Status_DestServ(DestServer);
|
|
|
|
// Log this server pair - section heading
|
|
ConvertPairLog();
|
|
|
|
// SetConvert options and log them out.
|
|
ConvOpt = (CONVERT_OPTIONS *) CurrentConvertList->ConvertOptions;
|
|
FileOptions = (FILE_OPTIONS *) CurrentConvertList->FileOptions;
|
|
ConvertOptionsLog();
|
|
OptionsFileLog();
|
|
|
|
// If our destination server has changed then update the caches
|
|
if (TList[i].ServerName != oDServ) {
|
|
oDServ = TList[i].ServerName;
|
|
GotUserList = TRUE;
|
|
|
|
ListCacheFree(&UserCacheHead);
|
|
ListCacheFree(&GroupCacheHead);
|
|
if ((status = NTServerSet(DestServer))) {
|
|
// Failed to set server so log it and loop to next server
|
|
LogWriteLog(0, Lids(IDS_L_209), DestServer);
|
|
ErrorIt(Lids(IDS_L_209), DestServer);
|
|
goto ConvDo_Loop;
|
|
}
|
|
|
|
// Put VShares here so it doesn't get lost in user info
|
|
if (FileOptions->TransferFileInfo)
|
|
VSharesCreate(CurrentConvertList->FileServ, TConversion);
|
|
|
|
// Get users on NT server and put in cache
|
|
if (status = NTUsersEnum(&NTUsers)) {
|
|
// Failed - make sure we don't try to convert users and log err
|
|
NTUsers = NULL;
|
|
NTUserCount = 0;
|
|
LogWriteLog(0, Lids(IDS_L_210), DestServer);
|
|
ErrorIt(Lids(IDS_L_210), DestServer);
|
|
GotUserList = FALSE;
|
|
} else
|
|
NTUserCount = NTUsers->Count;
|
|
|
|
if (!ListCachePut(&UserCacheHead, (void *) NTUsers, NTUserCount)) {
|
|
// Failed - but clean up NT List first
|
|
GotUserList = FALSE;
|
|
FreeMemory(NTUsers);
|
|
} else {
|
|
// Now get Groups (if users succeded) and put in group cache
|
|
if (status = NTGroupsEnum(&NTGroups)) {
|
|
// Failed - make sure we don't try to convert users and log err
|
|
NTGroupCount = 0;
|
|
NTGroups = NULL;
|
|
LogWriteLog(0, Lids(IDS_L_211), DestServer);
|
|
ErrorIt(Lids(IDS_L_211), DestServer);
|
|
FreeMemory(NTUsers);
|
|
GotUserList = FALSE;
|
|
} else
|
|
NTGroupCount = NTGroups->Count;
|
|
|
|
if (!ListCachePut(&GroupCacheHead, (void *) NTGroups, NTGroupCount)) {
|
|
// Failed - but clean up NT List first
|
|
GotUserList = FALSE;
|
|
FreeMemory(NTUsers);
|
|
FreeMemory(NTGroups);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
wsprintf(UserServerName, TEXT("\\\\%s"), TList[i].ServerName);
|
|
if ((status = NTServerSet(TList[i].ServerName))) {
|
|
// Failed to set server so log it and loop to next server
|
|
LogWriteLog(0, Lids(IDS_L_209), TList[i].ServerName);
|
|
ErrorIt(Lids(IDS_L_209), TList[i].ServerName);
|
|
goto ConvDo_Loop;
|
|
}
|
|
|
|
if (ConvOpt->NetWareInfo) {
|
|
NTSAMClose();
|
|
|
|
if (ConvOpt->UseTrustedDomain && (ConvOpt->TrustedDomain != NULL))
|
|
DomainName = ConvOpt->TrustedDomain->Name;
|
|
else
|
|
if ((CurrentConvertList->FileServ->InDomain) && (CurrentConvertList->FileServ->Domain != NULL))
|
|
DomainName = CurrentConvertList->FileServ->Domain->Name;
|
|
else
|
|
DomainName = TEXT("");
|
|
|
|
if ((status = NTSAMConnect(TList[i].ServerName, DomainName))) {
|
|
// Failed to set server so log it and loop to next server
|
|
LogWriteLog(0, Lids(IDS_L_209), TList[i].ServerName);
|
|
ErrorIt(Lids(IDS_L_209), TList[i].ServerName);
|
|
goto ConvDo_Loop;
|
|
}
|
|
}
|
|
|
|
if ((status = NWServerSet(SourceServer))) {
|
|
// Failed to set server so log it and loop to next server
|
|
LogWriteLog(0, Lids(IDS_L_209), SourceServer);
|
|
ErrorIt(Lids(IDS_L_209), SourceServer);
|
|
goto ConvDo_Loop;
|
|
}
|
|
|
|
//
|
|
// If we are using mapping file then don't enum users and groups off
|
|
// the server. Get them from the mapping file instead.
|
|
//
|
|
hMap = NULL;
|
|
if (ConvOpt->UseMappingFile) {
|
|
//
|
|
// This is mapping file stuff
|
|
//
|
|
hMap = map_Open(ConvOpt->MappingFile);
|
|
if (hMap == NULL) {
|
|
ErrorIt(Lids(IDS_L_217), ConvOpt->MappingFile);
|
|
goto ConvDo_Loop;
|
|
}
|
|
|
|
if ((status = map_GroupsEnum(hMap, &Groups))) {
|
|
// Failed - make sure we don't try to convert users and log err
|
|
Groups = NULL;
|
|
GroupCount = 0;
|
|
LogWriteLog(0, Lids(IDS_L_219), ConvOpt->MappingFile);
|
|
ErrorIt(Lids(IDS_L_219), ConvOpt->MappingFile);
|
|
GotUserList = FALSE;
|
|
} else
|
|
GroupCount = Groups->Count;
|
|
|
|
if ((status = map_UsersEnum(hMap, &Users))) {
|
|
// Failed - make sure we don't try to convert users and log err
|
|
Users = NULL;
|
|
UserCount = 0;
|
|
LogWriteLog(0, Lids(IDS_L_218), ConvOpt->MappingFile);
|
|
ErrorIt(Lids(IDS_L_218), ConvOpt->MappingFile);
|
|
GotUserList = FALSE;
|
|
} else
|
|
UserCount = Users->Count;
|
|
|
|
} else {
|
|
//
|
|
// Enuming users and groups from NetWare Server instead of map file
|
|
//
|
|
if ((status = NWGroupsEnum(&Groups, TRUE))) {
|
|
// Failed - make sure we don't try to convert users and log err
|
|
Groups = NULL;
|
|
GroupCount = 0;
|
|
LogWriteLog(0, Lids(IDS_L_211), SourceServer);
|
|
ErrorIt(Lids(IDS_L_211), SourceServer);
|
|
GotUserList = FALSE;
|
|
} else
|
|
GroupCount = Groups->Count;
|
|
|
|
if ((status = NWUsersEnum(&Users, TRUE))) {
|
|
// Failed - make sure we don't try to convert users and log err
|
|
Users = NULL;
|
|
UserCount = 0;
|
|
LogWriteLog(0, Lids(IDS_L_210), SourceServer);
|
|
ErrorIt(Lids(IDS_L_210), SourceServer);
|
|
GotUserList = FALSE;
|
|
} else
|
|
UserCount = Users->Count;
|
|
}
|
|
|
|
if (GotUserList) {
|
|
// User and Groups
|
|
if (ConvOpt->TransferUserInfo) {
|
|
UsersConvert();
|
|
|
|
if (!TransferCancel)
|
|
GroupsConvert();
|
|
}
|
|
}
|
|
|
|
// Note GroupsConvert switches servers for Print Operators to the
|
|
// destination server (and not the PDC).
|
|
|
|
// Files
|
|
if (!(TransferCancel) && FileOptions->TransferFileInfo) {
|
|
ErrorCategorySet(Lids(IDS_L_212));
|
|
|
|
// Now set server to appropriate file dest server
|
|
if ((status = NTServerSet(CurrentConvertList->FileServ->Name))) {
|
|
// Failed to set server so log it and loop to next server
|
|
LogWriteLog(0, Lids(IDS_L_209), CurrentConvertList->FileServ->Name);
|
|
ErrorIt(Lids(IDS_L_209), CurrentConvertList->FileServ->Name);
|
|
goto ConvDo_Loop;
|
|
}
|
|
|
|
Status_BytesTxt(Lids(IDS_L_213));
|
|
Status_Bytes(TEXT("0"));
|
|
Status_TotBytes(TEXT("0"));
|
|
Status_BytesSep(Lids(IDS_L_214));
|
|
ConvertFiles(hDlg, TConversion, Users, Groups);
|
|
Status_BytesTxt(TEXT(""));
|
|
Status_Bytes(TEXT(""));
|
|
Status_TotBytes(TEXT(""));
|
|
Status_BytesSep(TEXT(""));
|
|
}
|
|
|
|
NWServerFree();
|
|
|
|
ConvDo_Loop:
|
|
Status_TotComplete(i);
|
|
|
|
if (Users) {
|
|
FreeMemory(Users);
|
|
UserCount = 0;
|
|
}
|
|
|
|
if (Groups) {
|
|
FreeMemory(Groups);
|
|
GroupCount = 0;
|
|
}
|
|
|
|
if (hMap != NULL)
|
|
map_Close(hMap);
|
|
|
|
} // for loop through transfer list
|
|
|
|
// Free up our caches
|
|
ListCacheFree(&UserCacheHead);
|
|
ListCacheFree(&GroupCacheHead);
|
|
|
|
// Log out the finish time
|
|
LogWriteSummary(0, Lids(IDS_CRLF));
|
|
LogWriteSummary(0, Lids(IDS_CRLF));
|
|
LogWriteLog(0, Lids(IDS_CRLF));
|
|
LogWriteLog(0, Lids(IDS_CRLF));
|
|
GetTime(sztime);
|
|
|
|
if (TransferCancel) {
|
|
LogWriteLog(0, Lids(IDS_L_215), sztime);
|
|
LogWriteSummary(0, Lids(IDS_L_215), sztime);
|
|
} else {
|
|
LogWriteLog(0, Lids(IDS_L_216), sztime);
|
|
LogWriteSummary(0, Lids(IDS_L_216), sztime);
|
|
}
|
|
|
|
if (tl != NULL)
|
|
FreeMemory(tl);
|
|
|
|
NTSAMClose();
|
|
StatusDlgKill();
|
|
CursorNormal();
|
|
|
|
TotConversions = i;
|
|
ConversionEndDlg_Do(hDlg);
|
|
|
|
} // DoConversion
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| ConversionSuccessful()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
BOOL ConversionSuccessful() {
|
|
if (TotErrors || TransferCancel)
|
|
return FALSE;
|
|
else
|
|
return TRUE;
|
|
|
|
} // ConversionSuccesful
|