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.
 
 
 
 
 
 

636 lines
20 KiB

//+--------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1994 - 1997.
//
// File: rsoproot.h
//
// Contents: Definitions for the RSOP Snap-In classes
//
// Classes: CRSOPComponentData - Root RSOP snap-in node
// CRSOPComponentDataCF - class factory for RSOPComponentData
//
// Functions:
//
// History: 09-13-1999 stevebl Created
//
//---------------------------------------------------------------------------
#include "RSOPQuery.h"
//
// RSOP gpo list data structure
//
typedef struct tagGPOLISTITEM {
LPTSTR lpGPOName;
LPTSTR lpDSPath;
LPTSTR lpSOM;
LPTSTR lpUnescapedSOM;
LPTSTR lpFiltering;
LPBYTE pSD;
DWORD dwVersion;
BOOL bApplied;
struct tagGPOLISTITEM * pNext;
} GPOLISTITEM, *LPGPOLISTITEM;
//
// RSOP CSE data structure
//
typedef struct tagCSEITEM {
LPTSTR lpName;
LPTSTR lpGUID;
DWORD dwStatus;
ULONG ulLoggingStatus;
SYSTEMTIME BeginTime;
SYSTEMTIME EndTime;
BOOL bUser;
LPSOURCEENTRY lpEventSources;
struct tagCSEITEM *pNext;
} CSEITEM, *LPCSEITEM;
//
// CRSOPGPOLists class
//
class CRSOPGPOLists
{
public:
CRSOPGPOLists()
{
m_pUserGPOList = NULL;
m_pComputerGPOList = NULL;
}
~CRSOPGPOLists()
{
if ( m_pUserGPOList != NULL )
{
FreeGPOListData( m_pUserGPOList );
m_pUserGPOList = NULL;
}
if ( m_pComputerGPOList != NULL )
{
FreeGPOListData( m_pComputerGPOList );
m_pComputerGPOList = NULL;
}
}
void Build( LPTSTR szWMINameSpace );
LPGPOLISTITEM GetUserList()
{ return m_pUserGPOList; }
LPGPOLISTITEM GetComputerList()
{ return m_pComputerGPOList; }
private:
static void FreeGPOListData(LPGPOLISTITEM lpList);
static void BuildGPOList (LPGPOLISTITEM * lpList, LPTSTR lpNamespace);
static BOOL AddGPOListNode(LPTSTR lpGPOName, LPTSTR lpDSPath, LPTSTR lpSOM, LPTSTR lpFiltering,
DWORD dwVersion, BOOL bFiltering, LPBYTE pSD, DWORD dwSDSize,
LPGPOLISTITEM *lpList);
private:
LPGPOLISTITEM m_pUserGPOList;
LPGPOLISTITEM m_pComputerGPOList;
};
//
// CRSOPCSELists class
//
class CRSOPCSELists
{
public:
CRSOPCSELists( const BOOL& bViewIsArchivedData )
: m_bViewIsArchivedData( bViewIsArchivedData )
{
m_bNoQuery = FALSE;
m_szTargetMachine = NULL;
m_pUserCSEList = NULL;
m_pComputerCSEList = NULL;
m_bUserCSEError = FALSE;
m_bComputerCSEError = FALSE;
m_bUserGPCoreError = FALSE;
m_bComputerGPCoreError = FALSE;
m_bUserGPCoreWarning = FALSE;
m_bComputerGPCoreWarning = FALSE;
m_pEvents = new CEvents;
}
~CRSOPCSELists()
{
if ( m_pEvents != NULL )
{
delete m_pEvents;
m_pEvents = NULL;
}
if ( m_pUserCSEList != NULL )
{
FreeCSEData( m_pUserCSEList );
m_pUserCSEList = NULL;
}
if ( m_pComputerCSEList != NULL )
{
FreeCSEData( m_pComputerCSEList );
m_pComputerCSEList = NULL;
}
}
void Build( LPRSOP_QUERY pQuery, LPTSTR szWMINameSpace, BOOL bGetEventLogErrors );
public:
LPCSEITEM GetUserList()
{ return m_pUserCSEList; }
LPCSEITEM GetComputerList()
{ return m_pComputerCSEList; }
BOOL GetUserCSEError()
{ return m_bUserCSEError; }
BOOL GetComputerCSEError()
{ return m_bComputerCSEError; }
BOOL GetUserGPCoreError()
{ return m_bUserGPCoreError; }
BOOL GetComputerGPCoreError()
{ return m_bComputerGPCoreError; }
BOOL GetUserGPCoreWarning()
{ return m_bUserGPCoreWarning; }
BOOL GetComputerGPCoreWarning()
{ return m_bComputerGPCoreWarning; }
CEvents* GetEvents()
{ return m_pEvents; }
private:
void BuildCSEList( LPRSOP_QUERY pQuery, LPCSEITEM * lpList, LPTSTR lpNamespace, BOOL bUser, BOOL *bCSEError, BOOL *bGPCoreError );
void FreeCSEData( LPCSEITEM lpList );
static BOOL AddCSENode( LPTSTR lpName, LPTSTR lpGUID, DWORD dwStatus,
ULONG ulLoggingStatus, SYSTEMTIME *pBeginTime, SYSTEMTIME *pEndTime, BOOL bUser,
LPCSEITEM *lpList, BOOL *bCSEError, BOOL *bGPCoreError, LPSOURCEENTRY lpSources );
void GetEventLogSources( IWbemServices * pNamespace,
LPTSTR lpCSEGUID, LPTSTR lpComputerName,
SYSTEMTIME *BeginTime, SYSTEMTIME *EndTime,
LPSOURCEENTRY *lpSources );
void QueryRSoPPolicySettingStatusInstances( LPTSTR lpNamespace );
private:
const BOOL& m_bViewIsArchivedData;
BOOL m_bNoQuery;
LPTSTR m_szTargetMachine;
// CSE data
LPCSEITEM m_pUserCSEList;
LPCSEITEM m_pComputerCSEList;
BOOL m_bUserCSEError;
BOOL m_bComputerCSEError;
BOOL m_bUserGPCoreError;
BOOL m_bComputerGPCoreError;
BOOL m_bUserGPCoreWarning;
BOOL m_bComputerGPCoreWarning;
// Event log data
CEvents* m_pEvents;
};
//
// CRSOPComponentData class
//
class CRSOPComponentData:
public IComponentData,
public IExtendPropertySheet2,
public IExtendContextMenu,
public IPersistStreamInit,
public ISnapinHelp
{
protected:
BOOL m_bPostXPBuild;
ULONG m_cRef;
HWND m_hwndFrame;
BOOL m_bOverride; // RM: Overrides the loading of a .MSC file and uses commandline parameters instead (integration with DSA)
BOOL m_bRefocusInit;
BOOL m_bArchiveData;
BOOL m_bViewIsArchivedData;
TCHAR m_szArchivedDataGuid[50];
LPCONSOLENAMESPACE2 m_pScope;
LPCONSOLE m_pConsole;
HSCOPEITEM m_hRoot;
HSCOPEITEM m_hMachine;
HSCOPEITEM m_hUser;
BOOL m_bRootExpanded;
HMODULE m_hRichEdit;
DWORD m_dwLoadFlags;
// RSOP query and results
BOOL m_bInitialized;
LPTSTR m_szDisplayName;
LPRSOP_QUERY m_pRSOPQuery;
LPRSOP_QUERY_RESULTS m_pRSOPQueryResults;
// Extended error lists
CRSOPGPOLists m_GPOLists;
CRSOPCSELists m_CSELists;
BOOL m_bGetExtendedErrorInfo;
IStream * m_pStm;
BOOL m_bNamespaceSpecified; // boolean flag to indicate tha the namespace was
// specified. special actions need to be taken to
// prevent the namespace from getting deleted.
public:
//
// Constructors/destructor
//
CRSOPComponentData();
~CRSOPComponentData();
public:
//
// IUnknown methods
//
STDMETHODIMP QueryInterface(REFIID, LPVOID FAR *);
STDMETHODIMP_(ULONG) AddRef();
STDMETHODIMP_(ULONG) Release();
public:
//
// Implemented IComponentData methods
//
STDMETHODIMP Initialize(LPUNKNOWN pUnknown);
STDMETHODIMP CreateComponent(LPCOMPONENT* ppComponent);
STDMETHODIMP QueryDataObject(MMC_COOKIE cookie, DATA_OBJECT_TYPES type, LPDATAOBJECT* ppDataObject);
STDMETHODIMP Destroy(void);
STDMETHODIMP Notify(LPDATAOBJECT lpDataObject, MMC_NOTIFY_TYPE event, LPARAM arg, LPARAM param);
STDMETHODIMP GetDisplayInfo(LPSCOPEDATAITEM pItem);
STDMETHODIMP CompareObjects(LPDATAOBJECT lpDataObjectA, LPDATAOBJECT lpDataObjectB);
private:
//
// IComponentData helper methods
//
HRESULT SetRootNode();
HRESULT EnumerateScopePane ( HSCOPEITEM hParent );
public:
//
// Implemented IExtendPropertySheet2 methods
//
STDMETHODIMP CreatePropertyPages(LPPROPERTYSHEETCALLBACK lpProvider,
LONG_PTR handle, LPDATAOBJECT lpDataObject);
STDMETHODIMP QueryPagesFor(LPDATAOBJECT lpDataObject);
STDMETHODIMP GetWatermarks(LPDATAOBJECT lpIDataObject, HBITMAP* lphWatermark,
HBITMAP* lphHeader, HPALETTE* lphPalette, BOOL* pbStretch);
private:
//
// IExtendPropertySheet2 helper methods
//
HRESULT IsSnapInManager (LPDATAOBJECT lpDataObject);
HRESULT IsNode (LPDATAOBJECT lpDataObject, MMC_COOKIE cookie);
public:
//
// Implemented IExtendContextMenu methods
//
STDMETHODIMP AddMenuItems(LPDATAOBJECT piDataObject, LPCONTEXTMENUCALLBACK pCallback,
LONG *pInsertionAllowed);
STDMETHODIMP Command(LONG lCommandID, LPDATAOBJECT piDataObject);
public:
//
// Implemented IPersistStreamInit interface members
//
STDMETHODIMP GetClassID(CLSID *pClassID);
STDMETHODIMP IsDirty(VOID);
STDMETHODIMP Load(IStream *pStm);
STDMETHODIMP Save(IStream *pStm, BOOL fClearDirty);
STDMETHODIMP GetSizeMax(ULARGE_INTEGER *pcbSize);
STDMETHODIMP InitNew(VOID);
private:
//
// IPersistStreamInit helper methods
//
STDMETHODIMP CopyFileToMSC (LPTSTR lpFileName, IStream *pStm);
STDMETHODIMP CreateNameSpace (LPTSTR lpNameSpace, LPTSTR lpParentNameSpace);
STDMETHODIMP CopyMSCToFile (IStream *pStm, LPTSTR *lpMofFileName);
STDMETHODIMP BuildDisplayName (void);
HRESULT LoadStringList( IStream* pStm, DWORD* pCount, LPTSTR** paszStringList );
HRESULT SaveStringList( IStream* pStm, DWORD count, LPTSTR* aszStringList );
private:
//
// RSOP initialization helper methods
//
HRESULT InitializeRSOPFromMSC(DWORD dwFlags);
HRESULT DeleteArchivedRSOPNamespace();
public:
//
// Helpers for IRSOPInformation (Used by CRSOPDataObject)
//
STDMETHODIMP GetNamespace(DWORD dwSection, LPOLESTR pszNamespace, INT ccMaxLength);
STDMETHODIMP GetFlags(DWORD * pdwFlags);
STDMETHODIMP GetEventLogEntryText(LPOLESTR pszEventSource, LPOLESTR pszEventLogName,
LPOLESTR pszEventTime, DWORD dwEventID, LPOLESTR *ppszText);
public:
//
// Implemented ISnapinHelp interface members
//
STDMETHODIMP GetHelpTopic(LPOLESTR *lpCompiledHelpFile);
public:
//
// Member attribute access functions
//
BOOL IsPostXPBuild() { return m_bPostXPBuild; }
HSCOPEITEM GetMachineScope() { return m_hMachine; }
HSCOPEITEM GetUserScope() { return m_hUser; }
bool IsNamespaceInitialized() const { return m_bInitialized != 0; };
bool HasDisplayName() const { return (m_szDisplayName != NULL); };
LPCTSTR GetDisplayName() const { return m_szDisplayName; };
BOOL ComputerGPCoreErrorExists() { return m_CSELists.GetComputerGPCoreError(); }
BOOL ComputerGPCoreWarningExists() { return m_CSELists.GetComputerGPCoreWarning(); }
BOOL ComputerCSEErrorExists() { return m_CSELists.GetComputerCSEError(); }
BOOL UserGPCoreErrorExists() { return m_CSELists.GetUserGPCoreError(); }
BOOL UserGPCoreWarningExists() { return m_CSELists.GetUserGPCoreWarning(); }
BOOL UserCSEErrorExists() { return m_CSELists.GetUserCSEError(); }
private:
//
// Property page methods
//
HRESULT SetupFonts();
HFONT m_BigBoldFont;
HFONT m_BoldFont;
private:
//
// Dialog handlers
//
static INT_PTR CALLBACK RSOPGPOListMachineProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
static INT_PTR CALLBACK RSOPGPOListUserProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
static INT_PTR CALLBACK RSOPErrorsMachineProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
static INT_PTR CALLBACK RSOPErrorsUserProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
static INT_PTR CALLBACK QueryDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
private:
//
// Dialog event handlers
//
void OnEdit(HWND hDlg);
void OnSecurity(HWND hDlg);
void OnRefreshDisplay(HWND hDlg);
void OnContextMenu(HWND hDlg, LPARAM lParam);
void OnSaveAs (HWND hDlg);
private:
//
// Dialog helper methods
//
void InitializeErrorsDialog(HWND hDlg, LPCSEITEM lpList);
void RefreshErrorInfo (HWND hDlg);
static HRESULT WINAPI ReadSecurityDescriptor (LPCWSTR lpGPOPath, SECURITY_INFORMATION si, PSECURITY_DESCRIPTOR *pSD, LPARAM lpContext);
static HRESULT WINAPI WriteSecurityDescriptor (LPCWSTR lpGPOPath, SECURITY_INFORMATION si, PSECURITY_DESCRIPTOR pSD, LPARAM lpContext);
private:
//
// Graphical GPO list usage methods
//
void FillGPOList(HWND hDlg, DWORD dwListID, LPGPOLISTITEM lpList,
BOOL bSOM, BOOL bFiltering, BOOL bVersion, BOOL bInitial);
void PrepGPOList(HWND hList, BOOL bSOM, BOOL bFiltering,
BOOL bVersion, DWORD dwCount);
private:
//
// Dialog methods for loading RSOP data from archive
//
static INT_PTR CALLBACK InitArchivedRsopDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
STDMETHODIMP InitializeRSOPFromArchivedData(IStream *pStm);
private:
//
// Context menu event handler
//
HRESULT InitializeRSOP( BOOL bShowWizard );
HRESULT EvaluateParameters(LPWSTR szNamespacePref,
LPWSTR szTarget);
private:
//
// Persistence help methods
//
void SetDirty(VOID) { m_bDirty = TRUE; }
void ClearDirty(VOID) { m_bDirty = FALSE; }
BOOL ThisIsDirty(VOID) { return m_bDirty; }
BOOL m_bDirty;
};
//
// class factory
//
class CRSOPComponentDataCF : public IClassFactory
{
protected:
ULONG m_cRef;
public:
CRSOPComponentDataCF();
~CRSOPComponentDataCF();
// IUnknown methods
STDMETHODIMP QueryInterface(REFIID, LPVOID FAR *);
STDMETHODIMP_(ULONG) AddRef();
STDMETHODIMP_(ULONG) Release();
// IClassFactory methods
STDMETHODIMP CreateInstance(LPUNKNOWN, REFIID, LPVOID FAR *);
STDMETHODIMP LockServer(BOOL);
};
//
// AboutGPE class factory
//
class CRSOPCMenuCF : public IClassFactory
{
protected:
LONG m_cRef;
public:
CRSOPCMenuCF();
~CRSOPCMenuCF();
// IUnknown methods
STDMETHODIMP QueryInterface(REFIID, LPVOID FAR *);
STDMETHODIMP_(ULONG) AddRef();
STDMETHODIMP_(ULONG) Release();
// IClassFactory methods
STDMETHODIMP CreateInstance(LPUNKNOWN, REFIID, LPVOID FAR *);
STDMETHODIMP LockServer(BOOL);
};
#define RSOP_LAUNCH_PLANNING 1
#define RSOP_LAUNCH_LOGGING 2
//
// Group Policy Hint types
//
typedef enum _RSOP_POLICY_HINT_TYPE {
RSOPHintUnknown = 0, // No link information available
RSOPHintMachine, // a machine
RSOPHintUser, // a user
RSOPHintSite, // a site
RSOPHintDomain, // a domain
RSOPHintOrganizationalUnit, // a organizational unit
} RSOP_POLICY_HINT_TYPE, *PRSOP_POLICY_HINT_TYPE;
class CRSOPCMenu : public IExtendContextMenu
{
protected:
LONG m_cRef;
LPWSTR m_lpDSObject;
LPWSTR m_szDomain;
LPWSTR m_szDN;
RSOP_POLICY_HINT_TYPE m_rsopHint;
static unsigned int m_cfDSObjectName;
public:
CRSOPCMenu();
~CRSOPCMenu();
// IUnknown methods
STDMETHODIMP QueryInterface(REFIID, LPVOID FAR *);
STDMETHODIMP_(ULONG) AddRef();
STDMETHODIMP_(ULONG) Release();
// IExtencContextMenu methods
STDMETHODIMP AddMenuItems(LPDATAOBJECT piDataObject,
LPCONTEXTMENUCALLBACK piCallback,
long * pInsertionAllowed);
STDMETHODIMP Command(long lCommandID, LPDATAOBJECT piDataObject);
};
//
// Save console defines
//
#define RSOP_PERSIST_DATA_VERSION 5 // version number in msc file
#define MSC_RSOP_FLAG_DIAGNOSTIC 0x00000001 // Diagnostic mode vs planning mode
#define MSC_RSOP_FLAG_ARCHIVEDATA 0x00000002 // RSoP data is archived also
#define MSC_RSOP_FLAG_SLOWLINK 0x00000004 // Slow link simulation in planning mode
#define MSC_RSOP_FLAG_NOUSER 0x00000008 // Do not display user data
#define MSC_RSOP_FLAG_NOCOMPUTER 0x00000010 // Do not display computer data
#define MSC_RSOP_FLAG_LOOPBACK_REPLACE 0x00000020 // Simulate loopback replace mode.
#define MSC_RSOP_FLAG_LOOPBACK_MERGE 0x00000040 // Simulate loopback merge mode.
#define MSC_RSOP_FLAG_USERDENIED 0x00000080 // User denied access
#define MSC_RSOP_FLAG_COMPUTERDENIED 0x00000100 // Computer denied access
#define MSC_RSOP_FLAG_COMPUTERWQLFILTERSTRUE 0x00000200
#define MSC_RSOP_FLAG_USERWQLFILTERSTRUE 0x00000400
#define MSC_RSOP_FLAG_NOGETEXTENDEDERRORINFO 0x00000800
#define MSC_RSOP_FLAG_NO_DATA 0xf0000000 // No RSoP data was saved - only empty snapin
//
// RSOP Command line switches
//
#define RSOP_CMD_LINE_START TEXT("/Rsop") // base to all group policy command line switches
#define RSOP_MODE TEXT("/RsopMode:") // Rsop Mode Planning/Logging 0 is logging, 1 is planning
#define RSOP_USER_OU_PREF TEXT("/RsopUserOu:") // Rsop User OU preference
#define RSOP_COMP_OU_PREF TEXT("/RsopCompOu:") // Rsop Comp OU Preference
#define RSOP_USER_NAME TEXT("/RsopUser:") // Rsop User Name
#define RSOP_COMP_NAME TEXT("/RsopComp:") // Rsop Comp Name
#define RSOP_SITENAME TEXT("/RsopSite:") // Rsop Site Name
#define RSOP_DCNAME_PREF TEXT("/RsopDc:") // DC Name that the tool should connect to
#define RSOP_NAMESPACE TEXT("/RsopNamespace:") // namespace that the tool should use
#define RSOP_TARGETCOMP TEXT("/RsopTargetComp:") // machine on which the rsop was originally run
// for displaying in the UI and to get eventlog data
//
// Various flags to decide which prop sheets to show
//
#define RSOP_NOMSC 1
#define RSOPMSC_OVERRIDE 2
#define RSOPMSC_NOOVERRIDE 4