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.
163 lines
5.2 KiB
163 lines
5.2 KiB
/*****************************************************************************/
|
|
|
|
|
|
|
|
/* Copyright (c) 1999-2001 Microsoft Corporation, All Rights Reserved /
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
//=================================================================
|
|
|
|
//
|
|
|
|
// ObjAccessRights.CPP -- Class for obtaining effective access
|
|
|
|
// rights on an unspecified object for a particular
|
|
|
|
// user or group.
|
|
|
|
//
|
|
|
|
// Copyright (c) 1999-2001 Microsoft Corporation, All Rights Reserved
|
|
//
|
|
// Revisions: 6/29/99 a-kevhu Created
|
|
//
|
|
//=================================================================
|
|
|
|
|
|
|
|
#include "precomp.h"
|
|
|
|
#ifdef NTONLY
|
|
|
|
|
|
#include <assertbreak.h>
|
|
#include "AdvApi32Api.h"
|
|
#include "accctrl.h"
|
|
#include "sid.h"
|
|
#include "AccessEntryList.h"
|
|
#include "AccessRights.h"
|
|
#include "ObjAccessRights.h"
|
|
#include "ImpLogonUser.h"
|
|
#include "aclapi.h"
|
|
#include "DACL.h"
|
|
|
|
|
|
// Default initialization...
|
|
CObjAccessRights::CObjAccessRights(bool fUseCurThrTok /* = false */)
|
|
: CAccessRights(fUseCurThrTok)
|
|
{
|
|
}
|
|
|
|
CObjAccessRights::CObjAccessRights(LPCWSTR wstrObjName, SE_OBJECT_TYPE ObjectType, bool fUseCurThrTok /* = false */)
|
|
: CAccessRights(fUseCurThrTok)
|
|
{
|
|
m_dwError = SetObj(wstrObjName, ObjectType);
|
|
}
|
|
|
|
CObjAccessRights::CObjAccessRights(const USER user, USER_SPECIFIER usp)
|
|
: CAccessRights(user, usp)
|
|
{
|
|
}
|
|
|
|
CObjAccessRights::CObjAccessRights(const USER user, LPCWSTR wstrObjName, SE_OBJECT_TYPE ObjectType, USER_SPECIFIER usp)
|
|
: CAccessRights(user, usp)
|
|
{
|
|
m_dwError = SetObj(wstrObjName, ObjectType);
|
|
}
|
|
|
|
|
|
|
|
// Members clean up after themselves. Nothing to do here.
|
|
CObjAccessRights::~CObjAccessRights()
|
|
{
|
|
}
|
|
|
|
// Extracts the Obj's acl, and stores a copy of it.
|
|
DWORD CObjAccessRights::SetObj(LPCWSTR wstrObjName, SE_OBJECT_TYPE ObjectType)
|
|
{
|
|
DWORD dwRet = E_FAIL;
|
|
PACL pacl = NULL;
|
|
PSECURITY_DESCRIPTOR psd = NULL;
|
|
CAdvApi32Api *pAdvApi32 = NULL;
|
|
|
|
|
|
if(wcslen(wstrObjName) != 0)
|
|
{
|
|
pAdvApi32 = (CAdvApi32Api*) CResourceManager::sm_TheResourceManager.GetResource(g_guidAdvApi32Api, NULL);
|
|
if(pAdvApi32 == NULL) return E_FAIL;
|
|
|
|
CRelResource RelMe(&CResourceManager::sm_TheResourceManager,g_guidAdvApi32Api,pAdvApi32 );
|
|
|
|
|
|
if(pAdvApi32->GetNamedSecurityInfoW(_bstr_t(wstrObjName),
|
|
ObjectType,
|
|
DACL_SECURITY_INFORMATION,
|
|
NULL,
|
|
NULL,
|
|
&pacl,
|
|
NULL,
|
|
&psd,
|
|
&dwRet))
|
|
{
|
|
if(dwRet == ERROR_SUCCESS && psd != NULL)
|
|
{
|
|
OnDelete<HLOCAL,HLOCAL(*)(HLOCAL),LocalFree> FreeMeSD(psd);
|
|
|
|
|
|
if(pacl != NULL) // might be null in the case of a null dacl!
|
|
{
|
|
if(!SetAcl(pacl))
|
|
{
|
|
dwRet = ERROR_INVALID_PARAMETER;
|
|
}
|
|
else
|
|
{
|
|
m_chstrObjName = wstrObjName;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// We have a security descriptor, we returned ERROR_SUCCESS from GetNamedSecurityInfo, so this
|
|
// means we have a null dacl. In this case, we will create a NULL dacl using our security classes -
|
|
// more overhead, but will happen relatively infrequently.
|
|
CDACL newnulldacl;
|
|
if(newnulldacl.CreateNullDACL())
|
|
{
|
|
if((dwRet = newnulldacl.ConfigureDACL(pacl)) == ERROR_SUCCESS)
|
|
{
|
|
if(pacl != NULL) // might be null in the case of a null dacl!
|
|
{
|
|
OnDelete<void *,void(__cdecl *)(void *),free> FreeMeACL(pacl);
|
|
|
|
if(!SetAcl(pacl))
|
|
{
|
|
dwRet = ERROR_INVALID_PARAMETER;
|
|
}
|
|
else
|
|
{
|
|
m_chstrObjName = wstrObjName;
|
|
}
|
|
// Since the memory we used for pacl, in this case, is not part of psd, and therefor
|
|
// won't be freed via the call to LocalFree(psd), we free it here.
|
|
|
|
pacl = NULL;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
return dwRet;
|
|
}
|
|
|
|
|
|
|
|
#endif
|