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.
 
 
 
 
 
 

241 lines
9.5 KiB

/*---------------------------------------------------------------------------
File: RightsTranslator.cpp
Comments: Functions to translate user rights
(c) Copyright 1999, Mission Critical Software, Inc., All Rights Reserved
Proprietary and confidential to Mission Critical Software, Inc.
REVISION LOG ENTRY
Revision By: Christy Boles
Revised on 02/25/99 19:57:16
---------------------------------------------------------------------------
*/
#include "StdAfx.h"
#include "Mcs.h"
#include "WorkObj.h"
#include "SecTrans.h"
#include "STArgs.hpp"
#include "SidCache.hpp"
#include "SDStat.hpp"
#include "TxtSid.h"
#include "ErrDct.hpp"
//#import "\bin\McsDctWorkerObjects.tlb"
#import "WorkObj.tlb"
extern TErrorDct err;
DWORD
TranslateUserRights(
WCHAR const * serverName, // in - name of server to translate groups on
SecurityTranslatorArgs * stArgs, // in - translation settings
TSDRidCache * cache, // in - translation table
TSDResolveStats * stat // in - stats on items modified
)
{
// DWORD rc = 0;
HRESULT hr;
SAFEARRAY * pRights = NULL;
SAFEARRAY * pUsers = NULL;
TAcctNode * node = NULL;
_bstr_t server = serverName;
MCSDCTWORKEROBJECTSLib::IUserRightsPtr pLsa(CLSID_UserRights);
WCHAR currPath[500];
DWORD mode = stArgs->TranslationMode();
BOOL bUseMapFile = stArgs->UsingMapFile();
//
// If server name is not null then use specified name for generated messages. If specified
// server name is null that means the user rights translation is being performed on the
// local machine therefore retrieve the local machine name and use it for generated messages.
//
WCHAR szServerName[LEN_Computer];
if (serverName && *serverName)
{
wcsncpy(szServerName, serverName, LEN_Computer);
szServerName[LEN_Computer - 1] = L'\0';
}
else
{
DWORD dwSize = LEN_Computer;
if (!GetComputerName(szServerName, &dwSize))
{
szServerName[0] = L'\0';
}
}
if ( pLsa == NULL )
{
return E_FAIL;
}
pLsa->NoChange = stArgs->NoChange();
if ( stArgs->TranslationMode() == REPLACE_SECURITY || stArgs->TranslationMode() == REMOVE_SECURITY )
{
err.MsgWrite(0,DCT_MSG_USER_RIGHTS_ONLY_ADDS);
stArgs->SetTranslationMode(ADD_SECURITY);
}
// Get a list of all the rights
hr = pLsa->raw_GetRights(server,&pRights);
if ( SUCCEEDED(hr) )
{
LONG nRights = 0;
long ndx[1];
hr = SafeArrayGetUBound(pRights,1,&nRights);
if ( SUCCEEDED(hr) )
{
for ( long i = 0 ; i <= nRights && !stArgs->Cache()->IsCancelled(); i++ )
{
BSTR right;
ndx[0] = i;
hr = SafeArrayGetElement(pRights,ndx,&right);
if ( SUCCEEDED(hr) )
{
swprintf(currPath,L"%s\\%s",szServerName,(WCHAR*)right);
if( stat )
{
stat->DisplayPath(currPath);
}
// Get a list of users who have this right
hr = pLsa->raw_GetUsersWithRight(server,right,&pUsers);
if ( SUCCEEDED(hr))
{
LONG nUsers = 0;
hr = SafeArrayGetUBound(pUsers,1,&nUsers);
if ( SUCCEEDED(hr) )
{
BSTR user;
PSID pSid = NULL;
// PSID pTgt = NULL;
for ( long j = 0 ; j <= nUsers ; j++ )
{
ndx[0] = j;
hr = SafeArrayGetElement(pUsers,ndx,&user);
if ( SUCCEEDED(hr))
{
// Get the user's sid
pSid = SidFromString(user);
if ( pSid )
{
stat->IncrementExamined(userright);
// Lookup the user in the cache
if (!bUseMapFile)
node = cache->Lookup(pSid);
else
node = cache->LookupWODomain(pSid);
if ( node )
{
if ( node == (TAcctNode*)-1 )
{
node = NULL;
}
if ( node && node->IsValidOnTgt() )
{
// Found the account in the cache
// remove the right from the source user
if ( (stArgs->TranslationMode() == REMOVE_SECURITY ||stArgs->TranslationMode() == REPLACE_SECURITY) )
{
hr = pLsa->raw_RemoveUserRight(server,user,right);
if ( FAILED(hr))
{
err.SysMsgWrite(ErrE,hr,DCT_MSG_REMOVE_RIGHT_FAILED_SSSD,
(WCHAR*)right,node->GetAcctName(),szServerName,hr);
stat->IncrementSkipped(userright);
}
else
{
err.MsgWrite(0,DCT_MSG_REMOVED_RIGHT_SSSS,szServerName,right,stArgs->Source(),node->GetAcctName());
}
}
if ( SUCCEEDED(hr) )
{
stat->IncrementChanged(userright);
PSID sid = NULL;
if (!bUseMapFile)
sid = cache->GetTgtSid(node);
else
sid = cache->GetTgtSidWODomain(node);
if ( sid )
{
WCHAR strSid[200];
DWORD lenStrSid = DIM(strSid);
GetTextualSid(sid,strSid,&lenStrSid);
if ( (stArgs->TranslationMode() != REMOVE_SECURITY) )
{
hr = pLsa->raw_AddUserRight(server,SysAllocString(strSid),right);
if ( FAILED(hr) )
{
err.SysMsgWrite(ErrE,hr,DCT_MSG_ADD_RIGHT_FAILED_SSSD,
(WCHAR*)right,node->GetAcctName(),szServerName,hr);
}
else
{
err.MsgWrite(0,DCT_MSG_ADDED_RIGHT_SSSS,szServerName,right,stArgs->Target(),node->GetAcctName());
}
}
free(sid);
}
}
}
}
FreeSid(pSid);
}
else
{
err.MsgWrite(ErrW,DCT_MSG_INVALID_SID_STRING_S,user);
}
SysFreeString(user);
}
}
}
else
{
err.SysMsgWrite(ErrE,hr,DCT_MSG_USERS_WITH_RIGHT_COUNT_FAILED_SSD,(WCHAR*)right,szServerName,hr);
}
SafeArrayDestroy(pUsers);
}
else
{
err.MsgWrite(ErrE,DCT_MSG_GET_USERS_WITH_RIGHT_FAILED_SSD,(WCHAR*)right,szServerName,hr);
}
SysFreeString(right);
}
else
{
err.MsgWrite(ErrE,DCT_MSG_LIST_RIGHTS_FAILED_SD,szServerName,hr);
break;
}
}
}
else
{
err.MsgWrite(ErrE,DCT_MSG_LIST_RIGHTS_FAILED_SD,szServerName,hr);
}
SafeArrayDestroy(pRights);
}
else
{
err.MsgWrite(ErrE,DCT_MSG_LIST_RIGHTS_FAILED_SD,szServerName,hr);
}
if( stat )
{
stat->DisplayPath(L"");
}
// set the translation mode back to its original value
stArgs->SetTranslationMode(mode);
return hr;
}