windows-nt/Source/XPSP1/NT/admin/admt/workobj/usercopy.hpp
2020-09-26 16:20:57 +08:00

355 lines
14 KiB
C++

#ifndef __USERCOPY_HPP__
#define __USERCOPY_HPP__
//#pragma title("usercopy.hpp- class definitions for usercopy")
/*
================================================================================
(c) Copyright 1995-1998, Mission Critical Software, Inc., All Rights Reserved
Proprietary and confidential to Mission Critical Software, Inc.
Program - usercopy
Class - LAN Manager Utilities
Author - Christy Boles
Created - 09/04/97
Description- class definitions to allow usercopy to process subsets of accounts.
The list of accounts will be generated by the GUI, and will consist
of a TNodeList of TAcctNodes. Users will be added from the front of
the list, and groups will be added at the end.
Updates - 01/30/98 CAB Added strong password generation
================================================================================
*/
#include <lmcons.h>
#include "TNode.hpp"
#include <share.h> // for _SH_DENYNO
#include "EaLen.hpp"
#include "Common.hpp"
#include "Err.hpp"
#include "UString.hpp"
#include "CommaLog.hpp"
#include "TARNode.hpp"
#include "WorkObj.h"
#include "ProcExts.h"
//#import "\bin\DBManager.tlb" no_namespace, named_guids
//#import "\bin\McsDctWorkerObjects.tlb"
#import "DBMgr.tlb" no_namespace, named_guids
#import "WorkObj.tlb"
#define AR_BUFSIZE ((size_t)16000)
#define AR_NUM_IN_BUF 5000
#define F_REPLACE 0x00000001 // replace account info
#define F_GROUP 0x00000002 // copy global groups
#define F_LGROUP 0x00000004 // copy local groups
#define F_USERS 0x00000008 // copy users
#define F_DISABLE_ALL 0x00000010 // disable all accounts
#define F_DISABLE_SPECIAL 0x00000020 // disable Account Ops, Backup Ops, Administrators, Domain Admins
#define F_STRONGPW_ALL 0x00000040 // generate strong passwords for all accounts
#define F_STRONGPW_SPECIAL 0x00000080 // generate strong passwords for Account Ops, Backup Ops, Admins, and Domain Admins
#define F_MACHINE 0x00000100 // copy computer accounts
#define F_REMOVE_OLD_MEMBERS 0x00000200 // remove old members from replaced groups
#define F_DISABLESOURCE 0x00000400 // disable copied user accounts on source domain
#define F_AddToSrcGroupLocal 0x00000800 // indicates that the add-to group is on the target domain
#define F_AddToGroupLocal 0x00001000 // add to group is a local group
#define F_INTERACT 0x00002000 // use command-line parms to initiate interactive gui session
#define F_WARN_FULLNAME 0x00004000 // warn before replacing accounts w/different fullname
#define F_WARN_COMMENT 0x00008000 // warn before replacing accounts w/different comment
#define F_CopyPasswords 0x00010000 // copy passwords
#define F_RevokeOldRights 0x00020000 // removes old user rights from copied accounts
#define F_AddSidHistory 0x00040000 // Add SID of source account to the SID history of the target account.
#define F_TranslateProfiles 0x00080000 // Translate roaming profiles
#define F_OUS 0x00100000 // Process the organizational units.
#define F_COMPUTERS 0x00200000 // Process the computer accounts in Acct replication
#define F_COPY_CONT_CONTENT 0x00400000 // Copy the container contents along with the container when copying accounts.
#define F_COPY_MIGRATED_ACCT 0x00800000 // When expanding containers/membership include accounts that have already been migrated.
#define F_MOVE_REPLACED_ACCT 0x01000000 // move a replaces account to the user-specified OU.
#define AR_AccountComputer (0x80000000)
#define AR_AccountComputerPdc (0x40000000)
#define ADMINISTRATORS 1
#define ACCOUNT_OPERATORS 2
#define BACKUP_OPERATORS 3
#define DOMAIN_ADMINS 4
#define CREATOR_OWNER 5
#define DOMAIN_USERS 6
#define DOMAIN_CONTROLLERS 7
#define DOMAIN_COMPUTERS 8
struct AccountStats
{
long users;
long globals;
long locals;
long computers;
long generic;
};
class TANode:public TNode
{
BOOL bMarked;
PSID pSid;
WCHAR name[LEN_Account];
public:
TANode() { name[0] = 0; bMarked = FALSE; pSid = NULL;}
TANode(WCHAR const * n)
{
safecopy(name,n);
bMarked = FALSE;
pSid = NULL;
}
~TANode()
{
if ( pSid )
delete pSid;
}
BOOL Marked() { return bMarked; }
void Mark() { bMarked = TRUE; }
void SetSid(PSID p) { pSid = p; }
void SetName(WCHAR const * n){ safecopy(name,n); }
WCHAR * GetName() { return name; }
PSID GetSid() { return pSid;}
};
// Password generation service
#define PWGEN_MIN_LENGTH 8 // enforced minimum password length
#define PWGEN_MAX_LENGTH 14 // enforced maximum password length
struct EaPwdFilterInfo
{
DWORD bEnforce;
DWORD bAllowName;
DWORD minLower;
DWORD minUpper;
DWORD minDigits;
DWORD minSpecial;
DWORD maxConsecutiveAlpha;
};
struct Options
{
WCHAR srcComp[LEN_Account]; // source computername
WCHAR srcDomain[LEN_Domain+1];
WCHAR tgtDomain[LEN_Domain+1];
WCHAR srcDomainDns[LEN_Path];
WCHAR tgtDomainDns[LEN_Path];
WCHAR tgtComp[LEN_Account]; // target computername
PSID srcSid;
PSID tgtSid;
DWORD srcDomainVer;
DWORD tgtDomainVer;
WCHAR prefix[UNLEN]; // prefix for added users
WCHAR suffix[UNLEN]; // suffix for added users
WCHAR globalPrefix[UNLEN];
WCHAR globalSuffix[UNLEN];
WCHAR addToGroup[GNLEN+1]; // optional group name to add new users to
WCHAR addToGroupSource[GNLEN+1]; // optional group name to add source users to
WCHAR logFile[MAX_PATH+1];
EaPwdFilterInfo policyInfo;
DWORD minPwdLength;
CommaDelimitedLog passwordLog;
DWORD flags; // operation flags
BOOL nochange;
WCHAR authUser[UNLEN+1]; //User name for source authentication
WCHAR authPassword[UNLEN+1]; //Password for Authentication.
WCHAR authDomain[LEN_Domain+1]; // Domain for the user passed for authentication
HANDLE dsBindHandle; // Handle to the directory service. Should be init by DsBind.
WCHAR srcNamingContext[LEN_Path]; // Naming context for the Adsi path
WCHAR tgtNamingContext[LEN_Path]; // Naming context for the Target domain
WCHAR tgtOUPath[LEN_Path]; // path for the OU container that is to be used to create objects in
BOOL expandContainers; // Whether or not we want to expand the containers.
BOOL expandMemberOf;
BOOL fixMembership;
IIManageDB * pDb;
BOOL bUndo;
BOOL bSameForest;
long lActionID;
long lUndoActionID;
MCSDCTWORKEROBJECTSLib::IStatusObjPtr pStatus;
WCHAR sDomUsers[UNLEN+1]; // Name of the domain users group in the source domain
_bstr_t sExcUserProps; // user properties to exclude from migration
_bstr_t sExcGroupProps; // group properties to exclude from migration
_bstr_t sExcCmpProps; // computer properties to exclude from migration
BOOL bExcludeProps;
_bstr_t sWizard;
Options() {
srcComp[0] = 0;
srcDomain[0] = 0;
tgtDomain[0] = 0;
srcDomainDns[0] = 0;
tgtDomainDns[0] = 0;
tgtComp[0] = 0;
prefix[0] = 0;
suffix[0] = 0;
globalPrefix[0] = 0;
globalSuffix[0] = 0;
addToGroup[0] = 0;
addToGroupSource[0] = 0;
logFile[0] = 0;
minPwdLength = 0;
flags = 0;
nochange = TRUE;
authUser[0] = 0;
authPassword[0] = 0;
authDomain[0] = 0;
srcNamingContext[0] = 0;
tgtNamingContext[0] = 0;
tgtOUPath[0] = 0;
expandContainers = FALSE;
fixMembership = TRUE;
pDb = NULL;
CoCreateInstance(CLSID_IManageDB,NULL,CLSCTX_ALL,IID_IIManageDB,(void**)&pDb);
bUndo = FALSE;
srcDomainVer = -1;
tgtDomainVer = -1;
srcSid = NULL;
tgtSid = NULL;
lUndoActionID = 0;
pStatus = NULL;
bSameForest = FALSE;
sDomUsers[0] = 0;
bExcludeProps = FALSE;
}
~Options()
{
if( pDb )
{
pDb->Release();
}
if ( srcSid )
FreeSid(srcSid);
if ( tgtSid )
FreeSid(tgtSid);
}
};
typedef void ProgressFn(WCHAR const * mesg);
int
UserCopy(
Options * options, // in - options
TNodeListSortable * acctlist, // in - list of accounts to process
ProgressFn * progress, // in - function called to log current progress
TError & error, // in - TError to write messages to
IStatusObj * pStatus, // in -status object to support cancellation
void fn (void ), // in - window update function
CProcessExtensions * pExts // in - pointer to extensions
);
int
UserRename(
Options * options, // in -options
TNodeListSortable * acctlist, // in -list of accounts to process
ProgressFn * progress, // in -window to write progress messages to
TError & error, // in -window to write error messages to
IStatusObj * pStatus, // in -status object to support cancellation
void WindowUpdate (void ) // in - window update function
);
DWORD
CopyServerName(
WCHAR * uncServ ,// out-UNC server name
TCHAR const * server // in -\\server or domain name
);
bool AddSidHistory(
const Options * pOptions,
const WCHAR * strSrcPrincipal,
const WCHAR * strDestPrincipal,
IStatusObj * pStatus = NULL,
BOOL isFatal = TRUE
);
bool BindToDS(
WCHAR * strDestDC,
Options * pOpt
);
bool AddToOU (
Options * options, // in -options
TNodeListSortable * acctlist // in -list of accounts to process
);
void MakeFullyQualifiedAdsPath(
WCHAR * sPath, //out- Fully qulified LDAP path to the object
DWORD nPathLen, //in - MAX size, in characters, of the sPath buffer
WCHAR * sSubPath, //in- LDAP subpath of the object
WCHAR * tgtDomain, //in- Domain name where object exists.
WCHAR * sDN //in- Deafault naming context for the Domain
);
BOOL GetDnsAndNetbiosFromName(WCHAR * name,WCHAR * netBios, WCHAR * dns);
void FillupNamingContext(Options * options);
bool IsAccountMigrated(
TAcctReplNode * pNode, //in -Account node that contains the Account info
Options * pOptions, //in -Options as specified by the user.
IIManageDBPtr pDb, //in -Pointer to DB manager. We dont want to create this object for every account we process
WCHAR * sTgtSam //in,out - Name of the target object that was copied if any.
);
bool CheckifAccountExists(
Options const* options, //in-Options as set by the user
WCHAR * acctName //in-Name of the account to look for
);
bool CallExtensions(
CProcessExtensions * pExt, // in - Extension handler.
Options * options, // in -options
TNodeListSortable * acctlist, //in -Accounts to be copied.
IStatusObj * pStatus, // in -status object to support cancellation
ProgressFn * progress //in- Progress function.
);
void
CopyGlobalGroupMembers(
Options const * options ,// in -options
TAcctReplNode * acct ,// in -account to copy
TNodeListSortable * acctlist ,// in -list of accounts being copied
void WindowUpdate (void ) // in - window update function
);
void
CopyLocalGroupMembers(
Options const * options ,// in -options
TAcctReplNode * acct ,// in -account to copy
TNodeListSortable * acctlist ,// in -list of accounts being copied
void WindowUpdate (void ) // in - window update function
);
HRESULT
CopySidHistoryProperty(
Options * pOptions,
TAcctReplNode * pNode,
IStatusObj * pStatus
);
HRESULT
GetRidPoolAllocator(
Options * pOptions
);
void Mark( _bstr_t sMark, _bstr_t sObj);
DWORD GetName(PSID pObjectSID, WCHAR * sNameAccount, WCHAR * sDomain);
typedef HRESULT (CALLBACK * ADSGETOBJECT)(LPWSTR, REFIID, void**);
extern ADSGETOBJECT ADsGetObject;
#endif //__USERCOPY_HPP__