mirror of https://github.com/lianthony/NT4.0
466 lines
10 KiB
466 lines
10 KiB
/*++
|
|
|
|
Copyright (c) 1991-1993 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
PortUASP.H
|
|
|
|
Abstract:
|
|
|
|
Private header file for UAS->SAM porting code.
|
|
|
|
Author:
|
|
|
|
Shanku Niyogi (W-SHANKN) 24-Oct-1991
|
|
|
|
Environment:
|
|
|
|
Uses NT APIs and lots of Win32 things.
|
|
Requires ANSI C extensions: slash-slash comments, long external names.
|
|
|
|
Revision History:
|
|
|
|
24-Oct-1991 w-shankn
|
|
Created.
|
|
02-Mar-1992 JohnRo
|
|
Avoid creating redundant groups.
|
|
10-Mar-1992 JohnRo
|
|
Don't need 8.3 length restriction anymore.
|
|
13-Mar-1992 JohnRo
|
|
Added command-line parsing stuff.
|
|
Added WARNING_MSG(), ERROR_MSG(), PROGRESS_MSG() macros.
|
|
18-Mar-1992 JohnRo
|
|
Use iterator to allow hash-table collision handling.
|
|
Added flag for verbose output at run time.
|
|
19-Mar-1992 JohnRo
|
|
Moved decrypt function here from NT RTL code (per DavidC).
|
|
30-Apr-1992 JohnRo
|
|
Added alias support for operators.
|
|
Undo temporary length restrictions.
|
|
Allow password to be null pointer to DumpPassword().
|
|
08-Jun-1992 JohnRo
|
|
RAID 10139: PortUAS should add to admin group/alias.
|
|
Use PREFIX_ equates.
|
|
27-Oct-1992 JohnRo
|
|
RAID 9020: setup: PortUas fails ("prompt on conflicts" version).
|
|
RAID 9613: PortUAS should prevent run on BDC.
|
|
27-Jan-1993 JohnRo
|
|
RAID 8683: PortUAS should set primary group from Mac parms.
|
|
Made changes suggested by PC-LINT 5.0
|
|
18-Feb-1993 RonaldM
|
|
Added NlsPutMsg() prototype plus STDOUT and STDERR defs.
|
|
28-Jul-1993 JohnRo
|
|
RAID 16822: PortUAS should have ^C handler to restore user modals.
|
|
Made changes suggested by PC-LINT 5.0
|
|
02-Sep-1993 JohnRo
|
|
Add PortUAS /log:filename switch for Cheetah.
|
|
Also use NetpNameCompare() to compare user names.
|
|
Added Environment comment section.
|
|
|
|
--*/
|
|
|
|
|
|
#ifndef _PORTUASP_
|
|
#define _PORTUASP_
|
|
|
|
|
|
// These must be included first:
|
|
|
|
#include <lmcons.h> // LM20_UNLEN, LM20_GNLEN.
|
|
|
|
|
|
// These may be included in any order:
|
|
|
|
#include <debugfmt.h> // FORMAT_API_STATUS, etc.
|
|
#include <ntsam.h> // SAM_HANDLE.
|
|
|
|
// Don't complain about "unneeded" includes of this file:
|
|
/*lint -efile(764,stdio.h) */
|
|
/*lint -efile(766,stdio.h) */
|
|
#include <stdio.h> // printf().
|
|
|
|
// Don't complain about "unneeded" includes of this file:
|
|
/*lint -efile(764,permit.h) */
|
|
/*lint -efile(766,permit.h) */
|
|
#include <permit.h> // UAS_MAXGROUP.
|
|
|
|
// Don't complain about "unneeded" includes of this file:
|
|
/*lint -efile(764,prefix.h) */
|
|
/*lint -efile(766,prefix.h) */
|
|
#include <prefix.h> // PREFIX_ equates.
|
|
|
|
#define BANG TEXT('!')
|
|
#define MINUS TEXT('-')
|
|
#define SLASH TEXT('/')
|
|
#define NULLC TEXT('\0')
|
|
#define NEWLINE TEXT('\n')
|
|
#define RETURN TEXT('\r')
|
|
|
|
//FARBUGBUG This is really hacky.
|
|
#define TFORMAT_LPWSTR TEXT(FORMAT_LPWSTR)
|
|
|
|
//
|
|
// Maximum lengths of user and group names.
|
|
// Lengths are in characters, and don't include trailing nulls.
|
|
//
|
|
#define PORTUAS_MAX_USER_LEN LM20_UNLEN
|
|
//#define PORTUAS_MAX_USER_LEN 8
|
|
|
|
#define PORTUAS_MAX_GROUP_LEN LM20_GNLEN
|
|
//#define PORTUAS_MAX_GROUP_LEN 8
|
|
|
|
|
|
#if DBG
|
|
void PortDeb(CHAR *, ...);
|
|
#define DEBUG_MSG( arglist ) PortDeb arglist
|
|
#else
|
|
#define DEBUG_MSG( arglist )
|
|
#endif
|
|
|
|
//#define ERROR_MSG( arglist ) (void) WriteToCon arglist
|
|
//#define PROGRESS_MSG( arglist ) (void) WriteToCon arglist
|
|
//#define WARNING_MSG( arglist ) (void) WriteToCon arglist
|
|
|
|
#if 0
|
|
#define UNEXPECTED_MSG( apiName, retCode ) \
|
|
ERROR_MSG( (PREFIX_PORTUAS "unexpected return code " FORMAT_API_STATUS \
|
|
" from API " apiName ".\n", retCode ))
|
|
#endif
|
|
|
|
#define UNEXPECTED_MSG( apiName, retCode ) \
|
|
(void) NlsPutMsg(STDOUT, PUAS_UNEXPECTED_RETURN_CODE, retCode, apiName)
|
|
|
|
//
|
|
// Close the various SAM handles (aliases, domain, and connect).
|
|
//
|
|
#define CLOSE_SAM_HANDLE(globalVar) \
|
|
{ \
|
|
NET_API_STATUS ApiStatus; \
|
|
NTSTATUS NtStatus; \
|
|
if (globalVar != NULL) { \
|
|
NtStatus = SamCloseHandle( globalVar ); \
|
|
globalVar = NULL; \
|
|
if ( !NT_SUCCESS( NtStatus ) ) { \
|
|
ApiStatus = NetpNtStatusToApiStatus( NtStatus ); \
|
|
UNEXPECTED_MSG( "SamCloseHandle" #globalVar ")", ApiStatus ); \
|
|
/* continue closing stuff */ \
|
|
} \
|
|
} \
|
|
}
|
|
|
|
//
|
|
// Global variables.
|
|
//
|
|
|
|
extern PSID PortUasAccountsDomainId;
|
|
extern PSID PortUasBuiltinDomainId;
|
|
|
|
extern SAM_HANDLE PortUasSamConnectHandle;
|
|
extern SAM_HANDLE PortUasSamAccountsDomainHandle;
|
|
extern SAM_HANDLE PortUasSamBuiltinDomainHandle;
|
|
|
|
extern HANDLE PortUasGlobalLogFileHandle; // Set by PortUasParseCommandLine().
|
|
|
|
extern LPTSTR PortUasGlobalUserToSkipTo; // Set by PortUasParseCommandLine().
|
|
|
|
extern BOOL Verbose;
|
|
|
|
// NLS stuff
|
|
|
|
#define STDERR 2
|
|
#define STDOUT 1
|
|
|
|
/*lint -save -e579 */ // Don't complain about unwidened before ...
|
|
USHORT NlsPutMsg(USHORT, USHORT, ... );
|
|
/*lint -restore */
|
|
|
|
//
|
|
// Error coding.
|
|
//
|
|
|
|
NET_API_STATUS
|
|
PortUasError(
|
|
IN NET_API_STATUS Error
|
|
);
|
|
|
|
//
|
|
// UAS Read routines.
|
|
//
|
|
|
|
NET_API_STATUS
|
|
PortUasOpen(
|
|
IN LPTSTR File
|
|
);
|
|
|
|
VOID
|
|
PortUasClose(
|
|
VOID
|
|
);
|
|
|
|
// User modals information.
|
|
|
|
NET_API_STATUS
|
|
PortUasGetModals(
|
|
OUT LPUSER_MODALS_INFO_0 * Modals0
|
|
);
|
|
|
|
// Group information.
|
|
|
|
NET_API_STATUS
|
|
PortUasGetGroups(
|
|
OUT LPBYTE * Buffer,
|
|
OUT LPBYTE * Gids,
|
|
OUT LPDWORD Entries
|
|
);
|
|
|
|
BOOL
|
|
PortUasIsGroupRedundant(
|
|
IN LPWSTR GroupName
|
|
);
|
|
|
|
|
|
//
|
|
// User iterator stuff.
|
|
// This stuff is required to hide details of the hash collision buckets from
|
|
// as much code as possible.
|
|
//
|
|
|
|
typedef struct {
|
|
DWORD Index; // 0..UAS_USER_HASH_ENTRIES-1: normal.
|
|
// UAS_USER_HASH_ENTRIES: done.
|
|
// NULL_INDEX: initial value.
|
|
DWORD DiskOffset;
|
|
} USER_ITERATOR, *LPUSER_ITERATOR;
|
|
|
|
#define NULL_DISK_OFFSET 0x00000000
|
|
#define NULL_INDEX 0xFFFFFFFF
|
|
|
|
// VOID
|
|
// PortUasCopyUserIterator(
|
|
// OUT LPUSER_ITERATOR Dest,
|
|
// IN LPUSER_ITERATOR Src
|
|
// );
|
|
//
|
|
#define PortUasCopyUserIterator( Dest, Src ) \
|
|
{ \
|
|
(Dest)->Index = (Src)->Index; \
|
|
(Dest)->DiskOffset = (Src)->DiskOffset; \
|
|
}
|
|
|
|
#define PortUasInitUserIterator( It ) \
|
|
{ \
|
|
It.Index = NULL_INDEX; \
|
|
It.DiskOffset = NULL_DISK_OFFSET; \
|
|
}
|
|
|
|
// BOOL
|
|
// PortUasUserIteratorEqual(
|
|
// IN LPUSER_ITERATOR One,
|
|
// IN LPUSER_ITERATOR TheOther
|
|
// );
|
|
//
|
|
#define PortUasUserIteratorEqual( One, TheOther ) \
|
|
( ( ((One)->Index) == ((TheOther)->Index) ) \
|
|
&& ( ((One)->DiskOffset) == ((TheOther)->DiskOffset) ) )
|
|
|
|
|
|
//
|
|
// User information.
|
|
//
|
|
|
|
NET_API_STATUS
|
|
PortUasDecryptLmOwfPwdWithIndex(
|
|
IN LPVOID EncryptedLmOwfPassword,
|
|
IN LPDWORD Index,
|
|
OUT LPVOID LmOwfPassword
|
|
);
|
|
|
|
NET_API_STATUS
|
|
PortUasGetUser(
|
|
IN OUT LPUSER_ITERATOR UserIterator,
|
|
OUT LPBYTE * Buffer
|
|
);
|
|
|
|
NET_API_STATUS
|
|
PortUasGetUserOWFPassword(
|
|
IN LPUSER_ITERATOR UserIterator,
|
|
OUT LPBYTE * Password
|
|
);
|
|
|
|
NET_API_STATUS
|
|
PortUasGetUserGroups(
|
|
IN LPUSER_ITERATOR UserIterator,
|
|
OUT LPBYTE * Buffer,
|
|
OUT LPBYTE * Gids,
|
|
OUT LPDWORD Entries
|
|
);
|
|
|
|
NET_API_STATUS
|
|
PortUasNameToRid(
|
|
IN LPCTSTR Name, // may be group or user name
|
|
IN SID_NAME_USE ExpectedType,
|
|
OUT PULONG UserRid
|
|
);
|
|
|
|
NET_API_STATUS
|
|
PortUasSetMacPrimaryGroup(
|
|
IN LPCTSTR UserName,
|
|
IN LPCTSTR MacPrimaryField // field in "mGroup:junk" format.
|
|
);
|
|
|
|
VOID
|
|
DumpPassword(
|
|
// LPTSTR Tag,
|
|
IN USHORT Tag,
|
|
IN LPBYTE Password OPTIONAL
|
|
);
|
|
|
|
VOID
|
|
DumpUserInfo(
|
|
IN LPUSER_INFO_22 user
|
|
);
|
|
|
|
//
|
|
// PortUAS name mapping layer.
|
|
//
|
|
|
|
typedef struct {
|
|
LPWSTR OldName;
|
|
LPWSTR NewName; // May be NULL (if this is to be ignored).
|
|
} MAP_ENTRY, *PMAP_ENTRY, *LPMAP_ENTRY;
|
|
|
|
NET_API_STATUS
|
|
PortUasMapTableInit(
|
|
VOID
|
|
);
|
|
|
|
// Return NO_ERROR and *MapEntry=NULL if not found.
|
|
NET_API_STATUS
|
|
PortUasFindMapEntry(
|
|
IN LPWSTR NameToFind,
|
|
OUT BOOL * IgnoreThis OPTIONAL,
|
|
OUT LPMAP_ENTRY * MapEntry // Do NOT free this!
|
|
);
|
|
|
|
NET_API_STATUS
|
|
PortUasFindOrCreateMapEntry(
|
|
IN LPWSTR OldName,
|
|
IN BOOL ThisIsUserName, // TRUE for user name, FALSE for group name.
|
|
IN DWORD Reason, // REASON_ equates from PortUAS.h
|
|
OUT BOOL * IgnoreThis,
|
|
OUT LPMAP_ENTRY * MapEntry // Do NOT free this!
|
|
);
|
|
|
|
NET_API_STATUS
|
|
PortUasDeleteBadMapEntry(
|
|
IN LPMAP_ENTRY Entry
|
|
);
|
|
|
|
NET_API_STATUS
|
|
PortUasFreeMapTable(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
PortUasDbgDisplayMapTable(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
PortUasDbgDisplayMapEntry(
|
|
IN LPMAP_ENTRY Entry
|
|
);
|
|
|
|
//
|
|
// Complain to admin about a bad user or group name.
|
|
//
|
|
NET_API_STATUS
|
|
PortUasComplainAboutBadName(
|
|
IN LPWSTR OldName,
|
|
IN BOOL ThisIsUserName, // TRUE for user name, FALSE for group name
|
|
IN DWORD Reason // REASON_ equates from PortUAS.h
|
|
);
|
|
|
|
//
|
|
// Prompt for new (user or group) name routine.
|
|
//
|
|
|
|
NET_API_STATUS
|
|
PortUasDefaultPromptForNewName(
|
|
IN LPWSTR OldName,
|
|
IN BOOL ThisIsUserName, // TRUE for user name, FALSE for group name
|
|
IN DWORD Reason, // REASON_ equates from PortUAS.h
|
|
OUT LPWSTR * NewName, // alloc w/ NetApiBufferAllocate().
|
|
OUT BOOL * IgnoreThis,
|
|
OUT BOOL * ForceIgnoreFromNowOn
|
|
);
|
|
|
|
//
|
|
// Are updates to security allowed on this machine?
|
|
// (We can't update a Backup Domain Controller directly.)
|
|
// Expected returns: NERR_NotPrimary, ERROR_ACCESS_DENIED, or NO_ERROR.
|
|
//
|
|
NET_API_STATUS
|
|
PortUasMachineAllowsUpdates(
|
|
VOID
|
|
);
|
|
|
|
//
|
|
// Command-line parsing routine (optional use).
|
|
//
|
|
|
|
LPTSTR // Returns file name. Does not return on error.
|
|
PortUasParseCommandLine(
|
|
IN int argc,
|
|
IN char *argv[]
|
|
);
|
|
|
|
//
|
|
// Alias-handling routines.
|
|
//
|
|
|
|
NET_API_STATUS
|
|
PortUasAliasSetup(
|
|
VOID
|
|
);
|
|
|
|
NET_API_STATUS
|
|
PortUasAddUserToAliases(
|
|
IN LPCWSTR UserName,
|
|
IN DWORD Priv, // USER_PRIV_ values from lmaccess.h
|
|
IN DWORD AuthFlags // AF_ values from lmaccess.h
|
|
);
|
|
|
|
NET_API_STATUS
|
|
PortUasAliasCleanup(
|
|
VOID
|
|
);
|
|
|
|
//
|
|
// Log file routines (see LogFile.c)...
|
|
//
|
|
|
|
NET_API_STATUS
|
|
PortUasOpenLogFile(
|
|
IN LPCTSTR FileName,
|
|
OUT LPHANDLE ResultHandle
|
|
);
|
|
|
|
NET_API_STATUS
|
|
PortUasWriteToLogFile(
|
|
IN HANDLE LogFileHandle,
|
|
IN LPCTSTR TextToLog
|
|
);
|
|
|
|
NET_API_STATUS
|
|
PortUasCloseLogFile(
|
|
IN HANDLE LogFileHandle
|
|
);
|
|
|
|
|
|
INT
|
|
WriteToCon(
|
|
TCHAR*fmt, ...
|
|
);
|
|
#endif // _PORTUASP_
|