542 lines
18 KiB
C++
542 lines
18 KiB
C++
/**********************************************************************/
|
|
/** Microsoft LAN Manager **/
|
|
/** Copyright(c) Microsoft Corp., 1990 **/
|
|
/**********************************************************************/
|
|
|
|
/*
|
|
* History
|
|
* gregj 4/16/91 Cloned from COMPUTER class
|
|
* gregj 4/22/91 Added USER, USER_11.
|
|
* gregj 4/29/91 Results of 4/29/91 code review
|
|
* with chuckc, jimh, terryk, ericch
|
|
* gregj 5/21/91 Use new LOCATION class
|
|
* gregj 5/22/91 Support LOCATION's LOCATION_TYPE constructor
|
|
* SimoP 6/13/91 GetInfo and WriteInfo in class USER
|
|
* moved to public
|
|
* jonn 7/19/91 Writable USER_11 object
|
|
* jonn 8/06/91 Updated to latest NEW_LM_OBJ spec
|
|
* jonn 8/12/91 Code review changes
|
|
* rustanl 8/26/91 Changed [W_]CloneFrom parameter from * to &
|
|
* jonn 8/29/91 Added ChangeToNew()
|
|
* jonn 9/04/91 Added UserComment accessors
|
|
* jonn 9/05/91 Added IsOKState() and IsConstructedState()
|
|
* terryk 9/11/91 Add LOGON_USER object
|
|
* jonn 9/17/91 Added Parms accessors
|
|
* terryk 9/19/91 Move LOGON_USER back to lmomisc.hxx
|
|
* terryk 10/07/91 type changes for NT
|
|
* terryk 10/21/91 type changes for NT
|
|
* jonn 11/01/91 Added parms filter
|
|
* jonn 12/11/91 Added LogonHours accessors
|
|
* thomaspa 1/21/92 Added Rename() to USER
|
|
* beng 05/07/92 Removed LOGON_HOURS_SETTING elsewhere
|
|
*/
|
|
|
|
#ifndef _LMOUSER_HXX_
|
|
#define _LMOUSER_HXX_
|
|
|
|
#include "lmobj.hxx"
|
|
#include "lhourset.hxx"
|
|
#include "uiassert.hxx"
|
|
|
|
#if defined(UNICODE)
|
|
#define UI_NULL_USERSETINFO_PASSWD SZ(" ")
|
|
#else
|
|
#define UI_NULL_USERSETINFO_PASSWD NULL_USERSETINFO_PASSWD
|
|
#endif
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
NAME: USER
|
|
|
|
SYNOPSIS: Superclass for manipulation of users
|
|
Will eventually support deletion of existing users
|
|
|
|
INTERFACE:
|
|
QueryName
|
|
Returns the user's account name.
|
|
|
|
Rename
|
|
Changes the name of the user account on NT
|
|
|
|
SetName
|
|
Sets the user's account name.
|
|
|
|
|
|
PARENT: LOC_LM_OBJ
|
|
|
|
USES:
|
|
|
|
CAVEATS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
gregj 4/22/91 Created
|
|
gregj 4/29/91 Added ValidateAccount(), use BUFFER
|
|
gregj 5/21/91 Use new LOCATION class
|
|
gregj 5/22/91 Support LOCATION_TYPE constructor
|
|
SimoP 6/13/91 GetInfo and WriteInfo in class USER
|
|
moved public
|
|
thomaspa 1/21/92 Added Rename()
|
|
|
|
**************************************************************************/
|
|
|
|
DLL_CLASS USER : public LOC_LM_OBJ
|
|
{
|
|
private:
|
|
VOID CtAux( const TCHAR *pszAccount ); // constructor helper
|
|
|
|
protected:
|
|
DECL_CLASS_NLS_STR( _nlsAccount, UNLEN ); // account name, may be ""
|
|
|
|
APIERR HandleNullAccount();
|
|
|
|
APIERR W_CloneFrom( const USER & user );
|
|
|
|
virtual APIERR I_Delete( UINT uiForce );
|
|
|
|
public:
|
|
USER(const TCHAR *pszAccount, const TCHAR *pszLocation = NULL);
|
|
USER(const TCHAR *pszAccount, enum LOCATION_TYPE loctype);
|
|
USER(const TCHAR *pszAccount, const LOCATION & loc);
|
|
~USER();
|
|
|
|
const TCHAR *QueryName() const;
|
|
APIERR Rename( const TCHAR *pszAccount );
|
|
APIERR SetName( const TCHAR *pszAccount );
|
|
};
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
NAME: USER_11
|
|
|
|
SYNOPSIS: Wrapper for User APIs, level 11
|
|
|
|
USER_11 does not support WriteInfo or WriteNew, since
|
|
the API does not support NetUserSetInfo[11] or
|
|
NetUserAdd[11].
|
|
|
|
Unlike USER_2, a non-admin without accounts privilege
|
|
may read USER_11 information on him/herself.
|
|
|
|
INTERFACE: Construct with account name and server/domain name
|
|
|
|
I_GetInfo
|
|
Retrieves info about the user, returns a standard
|
|
error code.
|
|
|
|
QueryPriv
|
|
Returns the user's privilege level.
|
|
|
|
QueryAuthFlags
|
|
Returns the user's authorization flags mask.
|
|
|
|
IsPrintOperator
|
|
TRUE if the user is a print operator
|
|
|
|
IsCommOperator
|
|
TRUE if the user is a comm queue operator
|
|
|
|
IsServerOperator
|
|
TRUE if the user is a server operator
|
|
|
|
IsAccountsOperator
|
|
TRUE if the user is an accounts operator
|
|
|
|
QueryComment
|
|
Returns the comment set by administrator
|
|
|
|
QueryUserComment
|
|
Returns the comment set by user
|
|
|
|
QueryFullName
|
|
Returns the user's fullname
|
|
|
|
QueryHomeDir
|
|
Returns the user's home directory
|
|
|
|
QueryParms
|
|
Returns the user's application parameters
|
|
|
|
QueryWorkstations
|
|
Returns the user's valid logon workstations,
|
|
wkstas are separated by " "
|
|
|
|
QueryLogonHours
|
|
Returns the user's logon hours setting
|
|
|
|
QueryPasswordAge
|
|
QueryLastLogon
|
|
QueryLastLogoff
|
|
QueryBadPWCount
|
|
QueryNumLogons
|
|
QueryLogonServer
|
|
QueryCountryCode
|
|
QueryMaxStorage
|
|
QueryCodePage
|
|
All currently unimplemented.
|
|
|
|
SetComment
|
|
SetUserComment
|
|
SetFullName
|
|
SetPriv
|
|
SetAuthFlags
|
|
SetHomeDir
|
|
SetParms
|
|
SetLogonHours
|
|
Set information about the USER_11 object.
|
|
Returns ERROR_GEN_FAILURE if USER_11 obj not valid
|
|
ERROR_INVALID_PARAM if input param invalid
|
|
NERR_Success if ok.
|
|
|
|
TrimParams
|
|
Like LM21 NIF, User Manager trims certain Dialin
|
|
information out of the parms field when a user is
|
|
cloned. This does not happen automatically on
|
|
CloneFrom, instead the caller must call TrimParams
|
|
explicitly.
|
|
|
|
PARENT: USER
|
|
|
|
USES: NLS_STR, LOGON_HOURS_SETTING
|
|
|
|
CAVEATS: (internal) The fields which appear both as member objects
|
|
and in the API buffer should be accessed only as member
|
|
objects. The API buffer is not updated until
|
|
WriteInfo/WriteNew. This allows subclasses to use the
|
|
same accessors.
|
|
|
|
NOTES: The IsXxxxOperator methods are wrappers around
|
|
specific flags in the QueryAuthFlags() return.
|
|
They will always be FALSE if the user is an
|
|
administrator, since only USER privilege accounts
|
|
need operator rights.
|
|
|
|
HISTORY:
|
|
gregj 4/22/91 Created
|
|
gregj 4/29/91 Added unimplemented method placeholders
|
|
gregj 5/22/91 Support LOCATION_TYPE constructor
|
|
jonn 7/22/91 Writable
|
|
jonn 9/17/91 Added parms
|
|
|
|
**************************************************************************/
|
|
|
|
/*
|
|
NT BUGBUG: The following definition of MAX_USER_INFO_SIZE_11
|
|
is not safe for NT. It should be moved to a global header file.
|
|
*/
|
|
#define MAX_USER_INFO_SIZE_11 (sizeof(struct user_info_11) + \
|
|
((MAXCOMMENTSZ+1) * 4) + ((PATHLEN+1) * 2) + MAX_PATH+1 + \
|
|
(8 * (MAX_PATH) + 1) )
|
|
|
|
DLL_CLASS USER_11 : public USER
|
|
{
|
|
|
|
private:
|
|
VOID CtAux(); // constructor helper
|
|
|
|
UINT _uPriv;
|
|
ULONG _flAuth;
|
|
NLS_STR _nlsComment;
|
|
NLS_STR _nlsUserComment;
|
|
NLS_STR _nlsFullName;
|
|
NLS_STR _nlsHomeDir;
|
|
NLS_STR _nlsParms;
|
|
NLS_STR _nlsWorkstations;
|
|
LOGON_HOURS_SETTING _logonhrs;
|
|
|
|
protected:
|
|
APIERR W_CloneFrom( const USER_11 & user11 );
|
|
virtual APIERR W_CreateNew();
|
|
|
|
virtual APIERR I_GetInfo();
|
|
|
|
public:
|
|
USER_11(const TCHAR *pszAccount, const TCHAR *pszLocation = NULL);
|
|
USER_11(const TCHAR *pszAccount, enum LOCATION_TYPE loctype);
|
|
USER_11(const TCHAR *pszAccount, const LOCATION & loc);
|
|
~USER_11();
|
|
|
|
// redefined in LOCAL_USER
|
|
virtual UINT QueryPriv() const;
|
|
virtual ULONG QueryAuthFlags() const;
|
|
|
|
BOOL IsPrintOperator() const;
|
|
BOOL IsCommOperator() const;
|
|
BOOL IsServerOperator() const;
|
|
BOOL IsAccountsOperator() const;
|
|
|
|
inline const TCHAR *QueryComment () const
|
|
{ CHECK_OK(NULL); return _nlsComment.QueryPch(); }
|
|
inline const TCHAR *QueryUserComment () const
|
|
{ CHECK_OK(NULL); return _nlsUserComment.QueryPch(); }
|
|
inline const TCHAR *QueryFullName () const
|
|
{ CHECK_OK(NULL); return _nlsFullName.QueryPch(); }
|
|
inline const TCHAR *QueryHomeDir () const
|
|
{ CHECK_OK(NULL); return _nlsHomeDir.QueryPch(); }
|
|
inline const TCHAR *QueryParms () const
|
|
{ CHECK_OK(NULL); return _nlsParms.QueryPch(); }
|
|
inline const TCHAR *QueryWorkstations () const
|
|
{ CHECK_OK(NULL); return _nlsWorkstations.QueryPch(); }
|
|
inline const LOGON_HOURS_SETTING & QueryLogonHours () const
|
|
{ return _logonhrs; }
|
|
|
|
// unimplemented
|
|
inline LONG QueryPasswordAge() const { return 0L; }
|
|
inline LONG QueryLastLogon() const { return 0L; }
|
|
inline LONG QueryLastLogoff() const { return 0L; }
|
|
inline UINT QueryBadPWCount() const { return 0; }
|
|
inline UINT QueryNumLogons() const { return 0; }
|
|
inline const TCHAR *QueryLogonServer () const { return NULL; }
|
|
inline UINT QueryCountryCode() const { return 0; }
|
|
inline LONG QueryMaxStorage() const { return 0L; }
|
|
inline UINT QueryCodePage() const { return 0; }
|
|
|
|
APIERR SetComment( const TCHAR *pszComment );
|
|
APIERR SetUserComment( const TCHAR *pszUserComment );
|
|
APIERR SetFullName( const TCHAR *pszFullName );
|
|
APIERR SetPriv( UINT uPriv );
|
|
APIERR SetAuthFlags( ULONG flAuth );
|
|
APIERR SetHomeDir( const TCHAR *pszHomeDir );
|
|
APIERR SetParms( const TCHAR *pszParms );
|
|
APIERR SetWorkstations( const TCHAR *pszWorkstations );
|
|
APIERR SetLogonHours( const UCHAR * pLogonHours = NULL,
|
|
UINT unitsperweek = LOGON_HOURS_SETTING::cHoursPerWeek );
|
|
APIERR SetLogonHours( const LOGON_HOURS_SETTING & logonhrs )
|
|
{
|
|
return SetLogonHours( logonhrs.QueryHoursBlock(),
|
|
logonhrs.QueryUnitsPerWeek() );
|
|
}
|
|
|
|
APIERR TrimParams();
|
|
|
|
};
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
NAME: USER_2
|
|
|
|
SYNOPSIS: Wrapper for User APIs, level 2
|
|
|
|
USER_2 must be used whenever the user wishes to use
|
|
WriteInfo or WriteNew.
|
|
|
|
INTERFACE: Construct with account name and server/domain name
|
|
|
|
Interface is as USER_11, except that USER_2 supports
|
|
|
|
I_GetInfo
|
|
Reads in the current state of the object
|
|
|
|
I_WriteInfo
|
|
Writes the current state of the object to the
|
|
API. This write is atomic, either all
|
|
parameters are set or none are set.
|
|
|
|
I_CreateNew
|
|
Sets up the USER_2 object with default values in
|
|
preparation for a call to WriteNew
|
|
|
|
I_WriteNew
|
|
Adds a new user account
|
|
|
|
CloneFrom
|
|
Makes this USER_2 instance an exact copy of the
|
|
parameter USER_2 instance. All fields including
|
|
name and state will be copied. If this operation
|
|
fails, the object will be invalid. The parameter
|
|
must be a USER_2 and not a subclass of USER_2.
|
|
|
|
QueryUserFlags
|
|
Returns the user's user flags
|
|
QueryAccountExpires
|
|
Returns the user's account expires information
|
|
QueryScriptPath
|
|
Returns the user's script path
|
|
|
|
SetUserFlags
|
|
SetAccountExpires
|
|
SetScriptPath
|
|
Set information about the USER_2 object
|
|
Returns error code which is NERR_Success
|
|
on success
|
|
|
|
QueryPassword
|
|
Queries the user password. Note that this
|
|
information may be bogus, since the API does not
|
|
provide this information. Instead, GetInfo() will
|
|
set this to NULL_USERSETINFO_PASSWORD (see access.h).
|
|
SetPassword
|
|
Changes the user password.
|
|
|
|
QueryUserFlag
|
|
SetUserFlag
|
|
Queries/changes any single flag in the user flags
|
|
(usriX_flags).
|
|
|
|
QueryAccountDisabled
|
|
QueryUserCantChangePass
|
|
QueryUserPassRequired
|
|
QueryNoPasswordExpire
|
|
SetAccountDisabled
|
|
SetUserCantChangePass
|
|
SetUserPassRequired
|
|
SetNoPasswordExpire
|
|
Queries/changes specific flags in the user flags:
|
|
account disabled
|
|
user-cannot-change-password
|
|
password-required
|
|
|
|
PARENT: USER_11
|
|
|
|
USES: NLS_STR
|
|
|
|
HISTORY:
|
|
jonn 7/22/91 Created
|
|
jonn 4/27/92 USER_2 and USER_3 virtual dtor
|
|
|
|
**************************************************************************/
|
|
|
|
/*
|
|
NT BUGBUG: The following definition of MAX_USER_INFO_SIZE_2
|
|
is not safe for NT. It should be moved to a global header file.
|
|
*/
|
|
#define MAX_USER_INFO_SIZE_2 (sizeof(struct user_info_2) + \
|
|
((MAXCOMMENTSZ+1) * 4) + ((PATHLEN+1) * 3) + MAX_PATH+1 + \
|
|
(8 * (MAX_PATH) + 1) )
|
|
|
|
DLL_CLASS USER_2 : public USER_11
|
|
{
|
|
|
|
private:
|
|
|
|
UINT _afUserFlags;
|
|
LONG _lAcctExpires;
|
|
NLS_STR _nlsPassword;
|
|
NLS_STR _nlsScriptPath;
|
|
|
|
VOID CtAux(); // constructor helper
|
|
|
|
protected:
|
|
APIERR W_Write(); // helper for I_WriteInfo and I_WriteNew
|
|
|
|
APIERR W_CloneFrom( const USER_2 & user2 );
|
|
virtual APIERR W_CreateNew();
|
|
|
|
virtual APIERR I_GetInfo();
|
|
virtual APIERR I_WriteInfo();
|
|
virtual APIERR I_CreateNew();
|
|
virtual APIERR I_WriteNew();
|
|
virtual APIERR I_ChangeToNew();
|
|
|
|
BOOL QueryUserFlag( UINT afMask ) const;
|
|
APIERR SetUserFlag( BOOL fFlag, UINT afMask );
|
|
|
|
public:
|
|
USER_2(const TCHAR *pszAccount, const TCHAR *pszLocation = NULL);
|
|
USER_2(const TCHAR *pszAccount, enum LOCATION_TYPE loctype);
|
|
USER_2(const TCHAR *pszAccount, const LOCATION & loc);
|
|
virtual ~USER_2();
|
|
|
|
inline const TCHAR * QueryPassword() const
|
|
{ CHECK_OK(NULL); return _nlsPassword.QueryPch(); }
|
|
|
|
// must be a valid password with null-termination
|
|
APIERR SetPassword( const TCHAR *pszPassword );
|
|
|
|
BOOL QueryAccountDisabled() const;
|
|
APIERR SetAccountDisabled( BOOL fAccountDisabled );
|
|
|
|
BOOL QueryUserCantChangePass() const;
|
|
APIERR SetUserCantChangePass( BOOL fUserCantChangePass );
|
|
|
|
BOOL QueryNoPasswordExpire() const;
|
|
APIERR SetNoPasswordExpire( BOOL fNoPasswordExpire );
|
|
|
|
BOOL QueryUserPassRequired() const;
|
|
APIERR SetUserPassRequired( BOOL fUserPassRequired );
|
|
|
|
BOOL QueryLockout() const;
|
|
APIERR SetLockout( BOOL fLockout );
|
|
|
|
APIERR CloneFrom( const USER_2 & user2 );
|
|
|
|
inline const TCHAR * QueryScriptPath() const
|
|
{ CHECK_OK(NULL); return _nlsScriptPath.QueryPch(); }
|
|
inline LONG QueryAccountExpires() const
|
|
{ CHECK_OK(0L); return _lAcctExpires; }
|
|
inline UINT QueryUserFlags() const
|
|
{ CHECK_OK(0); return _afUserFlags; }
|
|
|
|
APIERR SetScriptPath( const TCHAR * pszPath );
|
|
APIERR SetAccountExpires( LONG lExpires );
|
|
APIERR SetUserFlags( UINT afFlags );
|
|
};
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
NAME: LOCAL_USER
|
|
|
|
SYNOPSIS: Local user info class
|
|
|
|
INTERFACE:
|
|
LOCAL_USER()
|
|
Constructor. Construct the object with a
|
|
domain name or server name; the two are
|
|
distinguished by the leading \\. Any error
|
|
(server/domain not found, etc.) will be
|
|
reported at GetInfo time. A NULL (default)
|
|
parameter means the logon domain. A password
|
|
for share-level servers can also be specified.
|
|
|
|
I_GetInfo()
|
|
Gets information about the logged on user,
|
|
pertaining to the specified domain or server.
|
|
Returns a standard LANMAN error code.
|
|
ERROR_INVALID_PASSWORD (86) usually indicates
|
|
that it's a share-level server.
|
|
|
|
QueryPriv()
|
|
Returns the logged on user's privilege level.
|
|
|
|
QueryAuthFlags()
|
|
Returns the logged on user's authorization
|
|
flags (operator rights).
|
|
|
|
IsShareLevel()
|
|
Returns TRUE if the named server is share level
|
|
(and the given password was valid for ADMIN$).
|
|
|
|
PARENT: USER_11
|
|
|
|
HISTORY:
|
|
gregj 4/16/91 Created
|
|
gregj 4/22/91 Derived from USER_11
|
|
gregj 4/29/91 Added IsShareLevel()
|
|
gregj 5/22/91 Support LOCATION_TYPE constructor
|
|
|
|
**************************************************************************/
|
|
|
|
DLL_CLASS LOCAL_USER : public USER_11
|
|
{
|
|
protected:
|
|
BOOL _fAdminConnect; // TRUE if ADMIN$ use made
|
|
TCHAR _szPassword [PWLEN+3]; // ADMIN$ password
|
|
virtual APIERR I_GetInfo();
|
|
|
|
public:
|
|
LOCAL_USER( const TCHAR *pszLocation = NULL, const TCHAR *pszPassword = NULL );
|
|
LOCAL_USER( enum LOCATION_TYPE loctype );
|
|
~LOCAL_USER();
|
|
|
|
UINT QueryPriv() const;
|
|
ULONG QueryAuthFlags() const;
|
|
BOOL IsShareLevel() const;
|
|
};
|
|
|
|
#endif // _LMOUSER_HXX_
|