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.
 
 
 
 
 
 

277 lines
9.3 KiB

/////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1998-2002 Microsoft Corporation
//
// Module Name:
// AclBase.h
//
// Description:
// Implementation of the ISecurityInformation interface. This interface
// is the new common security UI in NT 5.0.
//
// Implementation File:
// AclBase.cpp
//
// Author:
// Galen Barbee (galenb) February 6, 1998
// From \nt\private\admin\snapin\filemgmt\permpage.h
// by JonN
//
// Revision History:
//
// Notes:
//
/////////////////////////////////////////////////////////////////////////////
#ifndef _ACLBASE_H
#define _ACLBASE_H
/////////////////////////////////////////////////////////////////////////////
// Include Files
/////////////////////////////////////////////////////////////////////////////
#ifndef _ACLUI_H_
#include <aclui.h> // for ISecurityInformation
#endif // _ACLUI_H_
#include "CluAdmEx.h"
#include <ObjSel.h>
//
// Stuff used for initializing the Object Picker below
//
#define DSOP_FILTER_COMMON1 ( DSOP_FILTER_INCLUDE_ADVANCED_VIEW \
| DSOP_FILTER_USERS \
| DSOP_FILTER_UNIVERSAL_GROUPS_SE \
| DSOP_FILTER_GLOBAL_GROUPS_SE \
| DSOP_FILTER_COMPUTERS \
)
#define DSOP_FILTER_COMMON2 ( DSOP_FILTER_COMMON1 \
| DSOP_FILTER_WELL_KNOWN_PRINCIPALS \
| DSOP_FILTER_DOMAIN_LOCAL_GROUPS_SE \
)
#define DSOP_FILTER_COMMON3 ( DSOP_FILTER_COMMON2 \
| DSOP_FILTER_BUILTIN_GROUPS \
)
#define DSOP_FILTER_DL_COMMON1 ( DSOP_DOWNLEVEL_FILTER_USERS \
| DSOP_DOWNLEVEL_FILTER_GLOBAL_GROUPS \
)
#define DSOP_FILTER_DL_COMMON2 ( DSOP_FILTER_DL_COMMON1 \
| DSOP_DOWNLEVEL_FILTER_ALL_WELLKNOWN_SIDS \
)
#define DSOP_FILTER_DL_COMMON3 ( DSOP_FILTER_DL_COMMON2 \
| DSOP_DOWNLEVEL_FILTER_LOCAL_GROUPS \
)
//
// Documentation of the DSOP_SCOPE_INIT_INFO struct so you can see how the macros below
// fill it in...
//
/*
{ // DSOP_SCOPE_INIT_INFO
cbSize,
flType,
flScope,
{ // DSOP_FILTER_FLAGS
{ // DSOP_UPLEVEL_FILTER_FLAGS
flBothModes,
flMixedModeOnly,
flNativeModeOnly
},
flDownlevel
},
pwzDcName,
pwzADsPath,
hr // OUT
}
*/
#define DECLARE_SCOPE(t,f,b,m,n,d) \
{ sizeof(DSOP_SCOPE_INIT_INFO), (t), (f|DSOP_SCOPE_FLAG_DEFAULT_FILTER_GROUPS|DSOP_SCOPE_FLAG_DEFAULT_FILTER_USERS), { { (b), (m), (n) }, (d) }, NULL, NULL, S_OK }
//
// The domain to which the target computer is joined.
// Make 2 scopes, one for uplevel domains, the other for downlevel.
//
#define JOINED_DOMAIN_SCOPE(f) \
DECLARE_SCOPE(DSOP_SCOPE_TYPE_UPLEVEL_JOINED_DOMAIN,(f),0,(DSOP_FILTER_COMMON2 & ~(DSOP_FILTER_UNIVERSAL_GROUPS_SE|DSOP_FILTER_DOMAIN_LOCAL_GROUPS_SE)),DSOP_FILTER_COMMON2,0), \
DECLARE_SCOPE(DSOP_SCOPE_TYPE_DOWNLEVEL_JOINED_DOMAIN,(f),0,0,0,DSOP_FILTER_DL_COMMON2)
//
// The domain for which the target computer is a Domain Controller.
// Make 2 scopes, one for uplevel domains, the other for downlevel.
//
#define JOINED_DOMAIN_SCOPE_DC(f) \
DECLARE_SCOPE(DSOP_SCOPE_TYPE_UPLEVEL_JOINED_DOMAIN,(f),0,(DSOP_FILTER_COMMON3 & ~DSOP_FILTER_UNIVERSAL_GROUPS_SE),DSOP_FILTER_COMMON3,0), \
DECLARE_SCOPE(DSOP_SCOPE_TYPE_DOWNLEVEL_JOINED_DOMAIN,(f),0,0,0,DSOP_FILTER_DL_COMMON3)
//
// Target computer scope. Computer scopes are always treated as
// downlevel (i.e., they use the WinNT provider).
//
#define TARGET_COMPUTER_SCOPE(f)\
DECLARE_SCOPE(DSOP_SCOPE_TYPE_TARGET_COMPUTER,(f),0,0,0,DSOP_FILTER_DL_COMMON3)
//
// The Global Catalog
//
#define GLOBAL_CATALOG_SCOPE(f) \
DECLARE_SCOPE(DSOP_SCOPE_TYPE_GLOBAL_CATALOG,(f),DSOP_FILTER_COMMON1|DSOP_FILTER_WELL_KNOWN_PRINCIPALS,0,0,0)
//
// The domains in the same forest (enterprise) as the domain to which
// the target machine is joined. Note these can only be DS-aware
//
#define ENTERPRISE_SCOPE(f) \
DECLARE_SCOPE(DSOP_SCOPE_TYPE_ENTERPRISE_DOMAIN,(f),DSOP_FILTER_COMMON1,0,0,0)
//
// Domains external to the enterprise but trusted directly by the
// domain to which the target machine is joined.
//
#define EXTERNAL_SCOPE(f) \
DECLARE_SCOPE(DSOP_SCOPE_TYPE_EXTERNAL_UPLEVEL_DOMAIN|DSOP_SCOPE_TYPE_EXTERNAL_DOWNLEVEL_DOMAIN,\
(f),DSOP_FILTER_COMMON1,0,0,DSOP_DOWNLEVEL_FILTER_USERS|DSOP_DOWNLEVEL_FILTER_GLOBAL_GROUPS)
//
// Workgroup scope. Only valid if the target computer is not joined
// to a domain.
//
#define WORKGROUP_SCOPE(f) \
DECLARE_SCOPE(DSOP_SCOPE_TYPE_WORKGROUP,(f),0,0,0, DSOP_FILTER_DL_COMMON1|DSOP_DOWNLEVEL_FILTER_LOCAL_GROUPS )
//
// Array of Default Scopes
//
static const DSOP_SCOPE_INIT_INFO g_aDefaultScopes[] =
{
JOINED_DOMAIN_SCOPE(DSOP_SCOPE_FLAG_STARTING_SCOPE),
TARGET_COMPUTER_SCOPE(0),
GLOBAL_CATALOG_SCOPE(0),
ENTERPRISE_SCOPE(0),
EXTERNAL_SCOPE(0),
};
//
// Same as above, but without the Target Computer. Used when the target is a Domain Controller.
//
//
// KB: 21-MAY-2002 GalenB
//
// This array of scopes is not currently being used since these scopes are only interestng for a mixed mode
// domain where all of the member nodes of the cluster are domain controllers or backup domain controllers.
// This is the only configuration where domain local groups can be used in a cluster SD when the default
// scopes above will not allow the user to pick them.
//
/*
static const DSOP_SCOPE_INIT_INFO g_aDCScopes[] =
{
JOINED_DOMAIN_SCOPE_DC(DSOP_SCOPE_FLAG_STARTING_SCOPE),
GLOBAL_CATALOG_SCOPE(0),
ENTERPRISE_SCOPE(0),
EXTERNAL_SCOPE(0),
};
*/
/////////////////////////////////////////////////////////////////////////////
// Forward Class Declarations
/////////////////////////////////////////////////////////////////////////////
class CSecurityInformation;
/////////////////////////////////////////////////////////////////////////////
// External Class Declarations
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// CSecurityInformation security wrapper
/////////////////////////////////////////////////////////////////////////////
class CSecurityInformation : public ISecurityInformation, public CComObjectRoot, public IDsObjectPicker
{
DECLARE_NOT_AGGREGATABLE(CSecurityInformation)
BEGIN_COM_MAP(CSecurityInformation)
COM_INTERFACE_ENTRY(ISecurityInformation)
COM_INTERFACE_ENTRY(IDsObjectPicker)
END_COM_MAP()
#ifndef END_COM_MAP_ADDREF
// *** IUnknown methods ***
STDMETHOD_(ULONG, AddRef)( void )
{
return InternalAddRef();
}
STDMETHOD_(ULONG, Release)( void )
{
ULONG l = InternalRelease();
if (l == 0)
{
delete this;
}
return l;
}
#endif
// *** ISecurityInformation methods ***
STDMETHOD(GetObjectInformation)( PSI_OBJECT_INFO pObjectInfo );
STDMETHOD(GetSecurity)( SECURITY_INFORMATION RequestedInformation,
PSECURITY_DESCRIPTOR * ppSecurityDescriptor,
BOOL fDefault ) = 0;
STDMETHOD(SetSecurity)( SECURITY_INFORMATION SecurityInformation,
PSECURITY_DESCRIPTOR pSecurityDescriptor );
STDMETHOD(GetAccessRights)( const GUID * pguidObjectType,
DWORD dwFlags,
PSI_ACCESS * ppAccess,
ULONG * pcAccesses,
ULONG * piDefaultAccess );
STDMETHOD(MapGeneric)( const GUID * pguidObjectType,
UCHAR * pAceFlags,
ACCESS_MASK * pMask );
STDMETHOD(GetInheritTypes)( PSI_INHERIT_TYPE * ppInheritTypes,
ULONG * pcInheritTypes );
STDMETHOD(PropertySheetPageCallback)( HWND hwnd, UINT uMsg, SI_PAGE_TYPE uPage );
// IDsObjectPicker
STDMETHODIMP Initialize( PDSOP_INIT_INFO pInitInfo );
STDMETHODIMP InvokeDialog( HWND hwndParent, IDataObject ** ppdoSelection );
protected:
CSecurityInformation( void );
~CSecurityInformation( void );
HRESULT HrLocalAccountsInSD( IN PSECURITY_DESCRIPTOR pSD, OUT PBOOL pFound );
PGENERIC_MAPPING m_pShareMap;
PSI_ACCESS m_psiAccess;
int m_nDefAccess;
int m_nAccessElems;
DWORD m_dwFlags;
CString m_strServer;
CString m_strNode;
int m_nLocalSIDErrorMessageID;
IDsObjectPicker * m_pObjectPicker;
LONG m_cRef;
};
#endif //_ACLBASE_H