Leaked source code of windows server 2003
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.
 
 
 
 
 
 

721 lines
22 KiB

/*++
Copyright (c) Microsoft Corporation
Module Name:
wsuser.cpp
Abstract:
This file can be used to initializes all the objects for access token ,
user, groups , privileges and displays the user name with respective
security identifiers (SID), privileges, logon identifier (logon ID)
in the current access token on a local system or a remote system.
Authors:
Christophe Robert
Revision History:
02-July-2001 : Updated by Wipro Technologies.
--*/
//common header files needed for this file
#include "pch.h"
#include "CommonHeaderFiles.h"
WsUser::WsUser ( VOID )
/*++
Routine Description:
This function intializes the members of WsUser class.
Arguments:
None
Return Value:
None
--*/
{
// intialize member variables
lpLogonId = NULL ;
lpPriv = NULL ;
lpwGroups = NULL ;
dwnbGroups = 0 ;
}
WsUser::~WsUser ( VOID )
/*++
Routine Description:
This function deallocates the members of WsUser class.
Arguments:
None
Return Value:
None
--*/
{
/// sub-local varible
WORD wloop = 0 ;
//release memory
if(NULL != lpLogonId){
delete lpLogonId ;
}
//release memory
if(NULL != lpPriv) {
for(wloop = 0 ; wloop < dwnbPriv ; wloop++){
delete lpPriv[wloop] ;
}
FreeMemory ((LPVOID *) &lpPriv) ;
}
//release memory
if(NULL != lpwGroups) {
for(wloop = 0 ; wloop < dwnbGroups ; wloop++){
delete lpwGroups[wloop] ;
}
FreeMemory ((LPVOID *) &lpwGroups ) ;
}
}
DWORD
WsUser::Init ( VOID )
/*++
Routine Description:
This function initializes all objects for access token , user, groups and privileges.
Arguments:
None
Return Value:
EXIT_FAILURE : On failure
EXIT_SUCCESS : On success
--*/
{
//sub-local variable
DWORD dwErr = 0 ;
// Open current token
if((dwErr = wToken.Open()) != EXIT_SUCCESS){
ShowLastErrorEx ( stderr, SLE_TYPE_ERROR | SLE_SYSTEM );
// return 1 for failure
return EXIT_FAILURE ;
}
// Get SIDs
if((dwErr = wToken.InitUserSid (&wUserSid)) != EXIT_SUCCESS){
// display an error message with respect to the GetLastError()
ShowLastErrorEx ( stderr, SLE_TYPE_ERROR | SLE_SYSTEM );
//return 1 for failure
return EXIT_FAILURE ;
}
// Get Groups
if((dwErr = wToken.InitGroups (&lpwGroups, &lpLogonId, &dwnbGroups))
!= EXIT_SUCCESS){
// display an error message with respect to the GetLastError()
ShowLastErrorEx ( stderr, SLE_TYPE_ERROR | SLE_SYSTEM );
//return 1 for failure
return EXIT_FAILURE ;
}
// Get Privileges
if((dwErr = wToken.InitPrivs (&lpPriv, &dwnbPriv)) != EXIT_SUCCESS){
// display an error message with respect to GetLastError()
ShowLastErrorEx ( stderr, SLE_TYPE_ERROR | SLE_SYSTEM );
//return 1 for failure
return EXIT_FAILURE ;
}
//return 0 for success
return EXIT_SUCCESS ;
}
DWORD
WsUser::DisplayGroups (
IN DWORD dwFormatType
)
/*++
Routine Description:
This function displays the group names.
Arguments:
[IN] DWORD dwFormatType : Format type i.,e LIST, CSV or TABLE
Return Value:
EXIT_SUCCESS : On success
EXIT_FAILURE : On failure
--*/
{
//sub-local variables
DWORD dwArrSize = 0 ;
DWORD dwColCount = 0 ;
DWORD dw = 0 ;
DWORD dwCount = 0 ;
WORD wloop = 0 ;
DWORD dwGroupNameColLen = 0;
DWORD dwGroupNameLen = 0;
DWORD dwGroupTmpNameLen = 0;
DWORD dwGroupSidColLen = 0;
DWORD dwGroupSidLen = 0;
DWORD dwGroupTmpSidLen = 0;
DWORD dwGroupAttribColLen = 0;
DWORD dwGroupAttribLen = 0;
DWORD dwGroupTmpAttribLen = 0;
DWORD dwGroupTypeCol = 0;
DWORD dwGroupType = 0;
DWORD dwGroupTmpType = 0;
DWORD SidNameUse = 0;
DWORD dwSize = 0;
WCHAR wszGroupName[ 2 * MAX_RES_STRING ];
WCHAR wszGroupSid [ MAX_RES_STRING ];
LPCWSTR wszPartialName = NULL;
WCHAR wszDomainAttr[MAX_STRING_LENGTH] ;
WCHAR wszSidType[MAX_STRING_LENGTH] ;
WCHAR wszDomainAttrib[ 2 * MAX_RES_STRING ];
WCHAR wszSidName[ 2 * MAX_RES_STRING ];
// initialize the variables
SecureZeroMemory ( wszGroupName, SIZE_OF_ARRAY(wszGroupName) );
SecureZeroMemory ( wszGroupSid, SIZE_OF_ARRAY(wszGroupSid) );
SecureZeroMemory ( wszDomainAttr, SIZE_OF_ARRAY(wszDomainAttr) );
SecureZeroMemory ( wszSidType, SIZE_OF_ARRAY(wszSidType) );
SecureZeroMemory ( wszDomainAttrib, SIZE_OF_ARRAY(wszDomainAttrib) );
SecureZeroMemory ( wszSidName, SIZE_OF_ARRAY(wszSidName) );
// get the maximum length of group name and sid
for( wloop = 0 , dwCount = 0 ; wloop < dwnbGroups ; wloop++ , dwCount++ ) {
// display group names along with the SID for a specified format.
if ( EXIT_SUCCESS != ( lpwGroups[wloop]->DisplayGroupName ( wszGroupName, wszGroupSid, &SidNameUse ) ) )
{
return EXIT_FAILURE;
}
dwSize = SIZE_OF_ARRAY(wszDomainAttrib);
wToken.GetDomainAttributes(wToken.dwDomainAttributes[wloop], wszDomainAttrib, dwSize);
//get attributes
StringCopy(wszDomainAttr, wszDomainAttrib, SIZE_OF_ARRAY(wszSidType));
dwSize = SIZE_OF_ARRAY(wszSidName);
GetDomainType ( SidNameUse , wszSidName, dwSize );
//get type
StringCopy(wszSidType, wszSidName, SIZE_OF_ARRAY(wszSidType));;
// block the domain\None name
wszPartialName = FindString ( wszGroupSid, STRING_SID, 0 );
if ( ( NULL != wszPartialName ) || ( 0 == StringLength (wszGroupName, 0) ) )
{
wszPartialName = NULL;
dwCount--;
continue;
}
// get the max length of group name
dwGroupTmpNameLen = StringLengthInBytes(wszGroupName);
if ( dwGroupNameLen < dwGroupTmpNameLen )
{
dwGroupNameLen = dwGroupTmpNameLen;
}
// get the max length of type
dwGroupTmpType = StringLengthInBytes (wszSidType);
if ( dwGroupType < dwGroupTmpType )
{
dwGroupType = dwGroupTmpType;
}
// get the max length of SID
dwGroupTmpSidLen = StringLengthInBytes (wszGroupSid);
if ( dwGroupSidLen < dwGroupTmpSidLen )
{
dwGroupSidLen = dwGroupTmpSidLen;
}
// get the max length of Attributes
dwGroupTmpAttribLen = StringLengthInBytes (wszDomainAttr);
if ( dwGroupAttribLen < dwGroupTmpAttribLen )
{
dwGroupAttribLen = dwGroupTmpAttribLen;
}
}
//
//To avoid localization problems, get the maximum length of column name and
// values of respective columns
//
// Get the maximum length of a column name "Group Name"
dwGroupNameColLen = StringLengthInBytes( GetResString(IDS_COL_GROUP_NAME) );
if ( dwGroupNameColLen > dwGroupNameLen )
{
dwGroupNameLen = dwGroupNameColLen;
}
// Get the maximum length of a column name "Type"
dwGroupTypeCol = StringLengthInBytes( GetResString(IDS_COL_TYPE_GROUP) );
if ( dwGroupTypeCol > dwGroupType )
{
dwGroupType = dwGroupTypeCol;
}
// Get the maximum length of a column name "SID"
dwGroupSidColLen = StringLengthInBytes( GetResString(IDS_COL_GROUP_SID) );
if ( dwGroupSidColLen > dwGroupSidLen )
{
dwGroupSidLen = dwGroupSidColLen;
}
// Get the maximum length of a column name "Attributes"
dwGroupAttribColLen = StringLengthInBytes( GetResString(IDS_COL_ATTRIBUTE) );
if ( dwGroupAttribColLen > dwGroupAttribLen )
{
dwGroupAttribLen = dwGroupAttribColLen;
}
// defining the verbose columns with actual length of values
TCOLUMNS pVerboseCols[] =
{
{L"\0",dwGroupNameLen, SR_TYPE_STRING, COL_FORMAT_STRING, NULL, NULL},
{L"\0",dwGroupType,SR_TYPE_STRING,COL_FORMAT_STRING,NULL,NULL},
{L"\0",dwGroupSidLen,SR_TYPE_STRING,COL_FORMAT_STRING,NULL,NULL},
{L"\0",dwGroupAttribLen,SR_TYPE_STRING,COL_FORMAT_STRING,NULL,NULL},
};
// get the size of pVerboseCols
dwArrSize = SIZE_OF_ARRAY( pVerboseCols );
//Load the column names for verbose mode
for( dwColCount = IDS_COL_GROUP_NAME , dw = 0 ; dwColCount <= IDS_COL_ATTRIBUTE;
dwColCount++, dw++)
{
StringCopy (pVerboseCols[dw].szColumn , GetResString(dwColCount), MAX_RES_STRING);
}
// create a dynamic array
TARRAY pColData = CreateDynamicArray();
if ( NULL == pColData )
{
SetLastError ((DWORD)E_OUTOFMEMORY);
SaveLastError();
ShowLastErrorEx ( stderr, SLE_TYPE_ERROR | SLE_INTERNAL );
return EXIT_FAILURE;
}
//loop through and display the group names
for( wloop = 0 , dwCount = 0 ; wloop < dwnbGroups ; wloop++ , dwCount++ ) {
// display the group name and SID
if ( EXIT_SUCCESS != ( lpwGroups[wloop]->DisplayGroupName ( wszGroupName, wszGroupSid, &SidNameUse ) ) )
{
DestroyDynamicArray(&pColData);
return EXIT_FAILURE;
}
dwSize = SIZE_OF_ARRAY(wszDomainAttrib);
wToken.GetDomainAttributes(wToken.dwDomainAttributes[wloop], wszDomainAttrib, dwSize );
//get attributes
StringCopy(wszDomainAttr, wszDomainAttrib, SIZE_OF_ARRAY(wszSidType));
dwSize = SIZE_OF_ARRAY(wszSidName);
GetDomainType ( SidNameUse , wszSidName, dwSize);
//get type
StringCopy(wszSidType, wszSidName, SIZE_OF_ARRAY(wszSidType));
// block the domain\None name
wszPartialName = FindString ( wszGroupSid, STRING_SID, 0 );
if ( ( NULL != wszPartialName ) || ( 0 == StringLength (wszGroupName, 0) ) )
{
wszPartialName = NULL;
dwCount--;
continue;
}
//Start appending to the 2D array
DynArrayAppendRow(pColData,dwArrSize);
//Insert the user name
DynArraySetString2(pColData, dwCount, GROUP_NAME_COL_NUMBER, _X(wszGroupName), 0);
//Insert the domain type
DynArraySetString2(pColData, dwCount, GROUP_TYPE_COL_NUMBER, wszSidType, 0);
//Insert the SID string
DynArraySetString2(pColData, dwCount, GROUP_SID_COL_NUMBER, _X(wszGroupSid), 0);
//Insert Attributes
DynArraySetString2(pColData, dwCount, GROUP_ATT_COL_NUMBER, wszDomainAttr, 0);
}
// 1) If the display format is CSV.. then we should not display column headings..
// 2) If /NH is specified ...then we should not display column headings..
if ( !(( SR_FORMAT_CSV == dwFormatType ) || ((dwFormatType & SR_HIDECOLUMN) == SR_HIDECOLUMN)))
{
// display heading before displaying group name information
ShowMessage ( stdout, L"\n" );
ShowMessage ( stdout, GetResString ( IDS_LIST_GROUP_NAMES ) );
ShowMessage ( stdout, GetResString ( IDS_DISPLAY_GROUP_DASH ) );
}
// display atual group names along with SIDs
ShowResults(dwArrSize, pVerboseCols, dwFormatType, pColData);
// release memory
DestroyDynamicArray(&pColData);
// return success
return EXIT_SUCCESS ;
}
DWORD
WsUser::DisplayLogonId ()
/*++
Routine Description:
This function displays the logon ID.
Arguments:
[IN] DWORD dwFormatType : Format type i.,e LIST, CSV or TABLE
Return Value:
EXIT_SUCCESS : On success
EXIT_FAILURE : On failure
--*/
{
// sub-local variables
WCHAR wszSid [ MAX_RES_STRING ] ;
// initialize the variables
SecureZeroMemory ( wszSid, SIZE_OF_ARRAY(wszSid) );
DWORD dwRet = 0 ;
// get logon id
if ( EXIT_SUCCESS != ( dwRet = lpLogonId->DisplaySid ( wszSid ) ) )
{
return dwRet;
}
// display logon id
ShowMessage ( stdout, _X(wszSid) );
ShowMessage ( stdout, L"\n" );
return EXIT_SUCCESS ;
}
DWORD
WsUser::DisplayPrivileges (
IN DWORD dwFormatType
)
/*++
Routine Description:
This function displays the privileges
Arguments:
[IN] DWORD dwFormatType : Format type i.,e LIST, CSV or TABLE
Return Value:
EXIT_SUCCESS : On success
EXIT_FAILURE : On failure
--*/
{
//sub-local variables
WCHAR wszPrivName [ MAX_RES_STRING ];
WCHAR wszPrivDisplayName [ MAX_RES_STRING ];
WCHAR wszState [ MAX_RES_STRING ];
DWORD dwErr = 0 ;
WORD wloop = 0 ;
DWORD dwColCount = 0 ;
DWORD dwCount = 0 ;
DWORD dw = 0 ;
DWORD dwArrSize = 0 ;
DWORD dwStateColLen = 0;
DWORD dwPrivNameColLen = 0;
DWORD dwPrivDescColLen = 0;
DWORD dwStateLen = 0;
DWORD dwTmpStateLen = 0;
DWORD dwPrivNameLen = 0;
DWORD dwTmpPrivNameLen = 0;
DWORD dwPrivDispNameLen = 0;
DWORD dwTmpPrivDispNameLen = 0;
// initialize the variables
SecureZeroMemory ( wszPrivName, SIZE_OF_ARRAY(wszPrivName) );
SecureZeroMemory ( wszPrivDisplayName, SIZE_OF_ARRAY(wszPrivDisplayName) );
SecureZeroMemory ( wszState, SIZE_OF_ARRAY(wszState) );
// get the length of state, pivilege name, and display name
for( wloop = 0 , dwCount = 0 ; wloop < dwnbPriv ; wloop++, dwCount++) {
// check whether the privilege is enabled or not
if(lpPriv[wloop]->IsEnabled() == TRUE )
{
// copy the status as .. enabled..
StringCopy ( wszState, GetResString ( IDS_STATE_ENABLED ), SIZE_OF_ARRAY(wszState) );
}
else
{
// copy the status as .. disabled..
StringCopy ( wszState, GetResString ( IDS_STATE_DISABLED ), SIZE_OF_ARRAY(wszState) );
}
// get the privilege name and description
if((dwErr = lpPriv[wloop]->GetName ( wszPrivName)) != EXIT_SUCCESS ||
(dwErr = lpPriv[wloop]->GetDisplayName ( wszPrivName, wszPrivDisplayName ))
!= EXIT_SUCCESS){
// return GetLastError()
return dwErr ;
}
// get the length of state
dwTmpStateLen = StringLengthInBytes (wszState);
if ( dwStateLen < dwTmpStateLen )
{
dwStateLen = dwTmpStateLen;
}
// get the length privilege name
dwTmpPrivNameLen = StringLengthInBytes (wszPrivName);
if ( dwPrivNameLen < dwTmpPrivNameLen )
{
dwPrivNameLen = dwTmpPrivNameLen;
}
// get the length of privilege display name
dwTmpPrivDispNameLen = StringLengthInBytes (wszPrivDisplayName);
if ( dwPrivDispNameLen < dwTmpPrivDispNameLen )
{
dwPrivDispNameLen = dwTmpPrivDispNameLen;
}
}
//
//To avoid localization problems, get the maximum length of column name and
// values of respective columns
//
// Get the maximum length of a column name "Privilege Name"
dwPrivNameColLen = StringLengthInBytes( GetResString(IDS_COL_PRIV_NAME) );
if ( dwPrivNameColLen > dwPrivNameLen )
{
dwPrivNameLen = dwPrivNameColLen;
}
// Get the maximum length of a column name "Privilege Description"
dwPrivDescColLen = StringLengthInBytes( GetResString(IDS_COL_PRIV_DESC) );
if ( dwPrivDescColLen > dwPrivDispNameLen )
{
dwPrivDispNameLen = dwPrivDescColLen;
}
// Get the maximum length of a column name "State"
dwStateColLen = StringLengthInBytes ( GetResString(IDS_COL_PRIV_STATE));
if ( dwStateColLen > dwStateLen )
{
dwStateLen = dwStateColLen;
}
// create a dynamic array
TARRAY pColData = CreateDynamicArray();
// defining verbose columns
TCOLUMNS pVerboseCols[] =
{
{L"\0",dwPrivNameLen, SR_TYPE_STRING, COL_FORMAT_STRING, NULL, NULL},
{L"\0",dwPrivDispNameLen,SR_TYPE_STRING,COL_FORMAT_STRING,NULL,NULL},
{L"\0",dwStateLen,SR_TYPE_STRING,COL_FORMAT_STRING,NULL,NULL}
};
// get number of columns
dwArrSize = SIZE_OF_ARRAY( pVerboseCols );
//Load the column names for verbose mode
for( dwColCount = IDS_COL_PRIV_NAME , dw = 0 ; dwColCount <= IDS_COL_PRIV_STATE;
dwColCount++, dw++)
{
StringCopy (pVerboseCols[dw].szColumn , GetResString(dwColCount), MAX_RES_STRING);
}
// get the pivilege name, display name and state
for( wloop = 0 , dwCount = 0 ; wloop < dwnbPriv ; wloop++, dwCount++) {
if(lpPriv[wloop]->IsEnabled() == TRUE )
{
// copy the status as ... enabled..
StringCopy ( wszState, GetResString ( IDS_STATE_ENABLED ), SIZE_OF_ARRAY(wszState) );
}
else
{
// copy the status as .. disabled..
StringCopy ( wszState, GetResString ( IDS_STATE_DISABLED ), SIZE_OF_ARRAY(wszState) );
}
if((dwErr = lpPriv[wloop]->GetName ( wszPrivName)) != EXIT_SUCCESS ||
(dwErr = lpPriv[wloop]->GetDisplayName ( wszPrivName, wszPrivDisplayName ))
!= EXIT_SUCCESS){
// release memory
DestroyDynamicArray(&pColData);
// return GetLastError()
return dwErr ;
}
//Start appending to the 2D array
DynArrayAppendRow( pColData, dwArrSize );
//Insert the privilege name
DynArraySetString2(pColData, dwCount, PRIVNAME_COL_NUMBER, _X(wszPrivName), 0);
//Insert the privilege display name
DynArraySetString2(pColData, dwCount, PRIVDESC_COL_NUMBER, _X(wszPrivDisplayName), 0);
//Insert the state
DynArraySetString2(pColData, dwCount, PRIVSTATE_COL_NUMBER, _X(wszState), 0);
}
// 1) If the display format is CSV.. then we should not display column headings..
// 2) If /NH is specified ...then we should not display column headings..
if ( !(( SR_FORMAT_CSV == dwFormatType ) || ((dwFormatType & SR_HIDECOLUMN) == SR_HIDECOLUMN)))
{
// display the the headings before displaying the actual values
ShowMessage ( stdout, L"\n" );
ShowMessage ( stdout, GetResString ( IDS_LIST_PRIV_NAMES ) );
ShowMessage ( stdout, GetResString ( IDS_DISPLAY_PRIV_DASH ) );
}
// display privilege name, description and status values
ShowResults(dwArrSize, pVerboseCols, dwFormatType, pColData);
// release memory
DestroyDynamicArray(&pColData);
// return success
return EXIT_SUCCESS ;
}
DWORD
WsUser::DisplayUser (
IN DWORD dwFormatType,
IN DWORD dwNameFormat
)
/*++
Routine Description:
This function calls the methods to display the user name and SID.
Arguments:
[IN] DWORD dwFormatType : Format type i.,e LIST, CSV or TABLE
[IN] DWORD dwNameFormat : Name format either UPN or FQDN
Return Value:
EXIT_SUCCESS : On success
EXIT_FAILURE : On failure
--*/
{
// sub-local variables
DWORD dwRetVal = 0;
// get logged-on user name
dwRetVal = wUserSid.DisplayAccountName ( dwFormatType, dwNameFormat );
if( 0 != dwRetVal )
{
// return GetLastError()
return dwRetVal;
}
// return success
return EXIT_SUCCESS ;
}
VOID
WsUser::GetDomainType (
IN DWORD NameUse,
OUT LPWSTR szSidNameUse,
IN DWORD dwSize
)
/*++
Routine Description:
Gets the domain type
Arguments:
[IN] NameUse : Specifies SDI use name value
[OUT] szSidNameUse : Buffer for SID Name
[IN] dwSize : size of Sid name
Return Value:
EXIT_SUCCESS : On success
EXIT_FAILURE : On failure
--*/
{
//local variables
WCHAR szSidType[2 * MAX_STRING_LENGTH];
// initialize the variables
SecureZeroMemory ( szSidType, SIZE_OF_ARRAY(szSidType) );
//store appropriate type name with respect to NameUse value.
switch( NameUse )
{
case SidTypeUser:
StringCopy ( szSidType, GetResString(IDS_TYPE_USER), SIZE_OF_ARRAY(szSidType) );
break;
case SidTypeGroup:
StringCopy ( szSidType, GetResString(IDS_TYPE_GROUP), SIZE_OF_ARRAY(szSidType) );
break;
case SidTypeDomain:
StringCopy ( szSidType, GetResString(IDS_TYPE_DOMAIN), SIZE_OF_ARRAY(szSidType) );
break;
case SidTypeAlias:
StringCopy ( szSidType, GetResString(IDS_TYPE_ALIAS), SIZE_OF_ARRAY(szSidType) );
break;
case SidTypeWellKnownGroup:
StringCopy ( szSidType, GetResString(IDS_TYPE_WELLKNOWN), SIZE_OF_ARRAY(szSidType) );
break;
case SidTypeDeletedAccount:
StringCopy ( szSidType, GetResString(IDS_TYPE_DELETACCOUNT), SIZE_OF_ARRAY(szSidType) );
break;
case SidTypeInvalid:
StringCopy ( szSidType, GetResString(IDS_TYPE_INVALIDSID), SIZE_OF_ARRAY(szSidType) );
break;
case SidTypeUnknown:
default:
StringCopy ( szSidType, GetResString(IDS_TYPE_UNKNOWN), SIZE_OF_ARRAY(szSidType) );
break;
}
// Copy SID Name
StringCopy (szSidNameUse, szSidType, dwSize);
//return success
return;
}