324 lines
10 KiB
C++
324 lines
10 KiB
C++
//*************************************************************
|
|
//
|
|
// Microsoft Confidential. Copyright (c) Microsoft Corporation 1999. All rights reserved
|
|
//
|
|
// File: RsopInc.h
|
|
//
|
|
// Description: Headers for utility functions
|
|
//
|
|
// History: 8-26-99 NishadM Created
|
|
//
|
|
//*************************************************************
|
|
|
|
#ifndef __RSOPINC_H__
|
|
#define __RSOPINC_H__
|
|
|
|
//****************************************************
|
|
// Definitions used in constructing the name spaces.
|
|
//
|
|
// PM Stands for Planning Mode Provider
|
|
// SM stands for Snapshot Mode Provider
|
|
//
|
|
// DIAG for diagnostic logging
|
|
//****************************************************
|
|
|
|
#define RSOP_MOF_SCHEMA_VERSION 0x00210000
|
|
|
|
#define RSOP_NS_ROOT L"\\\\.\\Root\\Rsop"
|
|
#define RSOP_NS_PM_ROOT RSOP_NS_ROOT
|
|
#define RSOP_NS_SM_ROOT RSOP_NS_ROOT
|
|
#define RSOP_NS_DIAG_ROOT RSOP_NS_ROOT
|
|
#define RSOP_NS_ROOT_LEN 20
|
|
|
|
// Garbage collectable name spaces
|
|
#define RSOP_NS_TEMP_PREFIX L"NS"
|
|
#define RSOP_NS_TEMP_FMT L"\\\\.\\Root\\Rsop\\"RSOP_NS_TEMP_PREFIX L"%s"
|
|
|
|
#define RSOP_NS_TEMP_LEN 100
|
|
|
|
#define RSOP_NS_PM_FMT RSOP_NS_TEMP_FMT
|
|
#define RSOP_NS_SM_FMT RSOP_NS_TEMP_FMT
|
|
|
|
// user offsets
|
|
#define RSOP_NS_USER_OFFSET L"User"
|
|
#define RSOP_NS_PM_USER_OFFSET RSOP_NS_USER_OFFSET
|
|
#define RSOP_NS_SM_USER_OFFSET RSOP_NS_USER_OFFSET
|
|
#define RSOP_NS_DIAG_ROOTUSER_OFFSET RSOP_NS_USER_OFFSET
|
|
|
|
// The code assumes that this is a Sid when the name is generated and
|
|
// and when users are enumerated in snapshot provider.
|
|
|
|
#define RSOP_NS_DIAG_USER_OFFSET_FMT L"User\\%s"
|
|
|
|
// machine offsets
|
|
#define RSOP_NS_MACHINE_OFFSET L"Computer"
|
|
#define RSOP_NS_PM_MACHINE_OFFSET RSOP_NS_MACHINE_OFFSET
|
|
#define RSOP_NS_SM_MACHINE_OFFSET RSOP_NS_MACHINE_OFFSET
|
|
#define RSOP_NS_DIAG_MACHINE_OFFSET RSOP_NS_MACHINE_OFFSET
|
|
|
|
#define RSOP_NS_MAX_OFFSET_LEN 20
|
|
|
|
// user
|
|
#define RSOP_NS_USER L"\\\\.\\Root\\Rsop\\User"
|
|
#define RSOP_NS_SM_USER RSOP_NS_USER
|
|
#define RSOP_NS_PM_USER RSOP_NS_USER
|
|
#define RSOP_NS_DIAG_USERROOT RSOP_NS_USER
|
|
|
|
#define RSOP_NS_DIAG_USER_FMT L"\\\\.\\Root\\Rsop\\User\\%s"
|
|
|
|
// machine
|
|
#define RSOP_NS_MACHINE L"\\\\.\\Root\\Rsop\\Computer"
|
|
#define RSOP_NS_SM_MACHINE RSOP_NS_MACHINE
|
|
#define RSOP_NS_PM_MACHINE RSOP_NS_MACHINE
|
|
#define RSOP_NS_DIAG_MACHINE RSOP_NS_MACHINE
|
|
|
|
// remote name spaces
|
|
#define RSOP_NS_REMOTE_ROOT_FMT L"\\\\%s\\Root\\Rsop"
|
|
#define RSOP_NS_SM_REMOTE_ROOT_FMT RSOP_NS_REMOTE_ROOT_FMT
|
|
#define RSOP_NS_PM_REMOTE_ROOT_FMT RSOP_NS_REMOTE_ROOT_FMT
|
|
|
|
// user
|
|
#define RSOP_NS_REMOTE_USER_FMT L"\\\\%s\\Root\\Rsop\\User"
|
|
#define RSOP_NS_SM_REMOTE_USER_FMT RSOP_NS_REMOTE_USER_FMT
|
|
#define RSOP_NS_PM_REMOTE_USER_FMT RSOP_NS_REMOTE_USER_FMT
|
|
#define RSOP_NS_DIAG_REMOTE_USERROOT_FMT RSOP_NS_REMOTE_USER_FMT
|
|
|
|
#define RSOP_NS_DIAG_REMOTE_USER_FMT L"\\\\%s\\Root\\Rsop\\User\\%s"
|
|
|
|
// machine
|
|
#define RSOP_NS_REMOTE_MACHINE_FMT L"\\\\%s\\Root\\Rsop\\Computer"
|
|
#define RSOP_NS_SM_REMOTE_MACHINE_FMT RSOP_NS_REMOTE_MACHINE_FMT
|
|
#define RSOP_NS_PM_REMOTE_MACHINE_FMT RSOP_NS_REMOTE_MACHINE_FMT
|
|
|
|
// check to make sure that the namespace is under root\rsop
|
|
#define RSOP_NS_ROOT_CHK L"root\\rsop\\"
|
|
|
|
#define RSOP_ALL_PERMS (WBEM_ENABLE | WBEM_METHOD_EXECUTE | WBEM_FULL_WRITE_REP | WBEM_PARTIAL_WRITE_REP | \
|
|
WBEM_WRITE_PROVIDER | WBEM_REMOTE_ACCESS | READ_CONTROL | WRITE_DAC)
|
|
|
|
#define RSOP_READ_PERMS (WBEM_ENABLE | WBEM_METHOD_EXECUTE | WBEM_REMOTE_ACCESS | READ_CONTROL )
|
|
|
|
// WMI bits passed as generic mask into AccessCheck
|
|
|
|
#define WMI_GENERIC_READ 1
|
|
#define WMI_GENERIC_WRITE 0x1C
|
|
#define WMI_GENERIC_EXECUTE 0x2
|
|
#define WMI_GENERIC_ALL 0x6001f
|
|
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#define DEFAULT_NAMESPACE_TTL_MINUTES 1440
|
|
|
|
HRESULT
|
|
CopyNameSpace( LPCWSTR wszSrc,
|
|
LPCWSTR wszDest,
|
|
BOOL bCopyInstances,
|
|
BOOL* pbAbort,
|
|
IWbemLocator* pWbemLocator );
|
|
|
|
|
|
|
|
/*
|
|
HRESULT
|
|
SetupNewNameSpacePlanningMode( LPWSTR *pwszNameSpace,
|
|
LPWSTR szRemoteComputer,
|
|
IWbemLocator *pWbemLocator,
|
|
PSECURITY_DESCRIPTOR pSDUser,
|
|
PSECURITY_DESCRIPTOR pSDMach );
|
|
|
|
HRESULT
|
|
SetupNewNameSpaceDiagMode( LPWSTR *pwszNameSpace,
|
|
LPWSTR szRemoteComputer,
|
|
LPWSTR szUserSid,
|
|
IWbemLocator *pWbemLocator);
|
|
*/
|
|
|
|
// SetupNewNameSpace flags
|
|
#define SETUP_NS_PM 0x1
|
|
#define SETUP_NS_SM 0x2
|
|
#define SETUP_NS_SM_NO_USER 0x4
|
|
#define SETUP_NS_SM_NO_COMPUTER 0x8
|
|
#define SETUP_NS_SM_INTERACTIVE 0x10
|
|
|
|
|
|
HRESULT
|
|
SetNameSpaceSecurity( LPCWSTR szNamespace,
|
|
PSECURITY_DESCRIPTOR pSD,
|
|
IWbemLocator* pWbemLocator);
|
|
|
|
|
|
HRESULT
|
|
GetNameSpaceSecurity( LPCWSTR szNamespace,
|
|
PSECURITY_DESCRIPTOR *ppSD,
|
|
IWbemLocator* pWbemLocator);
|
|
|
|
HRESULT
|
|
SetupNewNameSpace(
|
|
LPWSTR *pwszNameSpace,
|
|
LPWSTR szRemoteComputer,
|
|
LPWSTR szUserSid,
|
|
PSID pSid,
|
|
IWbemLocator *pWbemLocator,
|
|
DWORD dwFlags,
|
|
DWORD *pdwExtendedInfo);
|
|
|
|
HRESULT
|
|
ProviderDeleteRsopNameSpace( IWbemLocator *pWbemLocator,
|
|
LPWSTR szNameSpace,
|
|
HANDLE hToken,
|
|
LPWSTR szSidString,
|
|
DWORD dwFlags);
|
|
|
|
|
|
BOOL IsInteractiveNameSpace(WCHAR *pwszNameSpace, WCHAR *szSid);
|
|
HRESULT GetInteractiveNameSpace(WCHAR *szSid, LPWSTR *szNameSpace);
|
|
|
|
|
|
// copy flags
|
|
#define NEW_NS_FLAGS_COPY_CLASSES 1 // Copy Instances
|
|
#define NEW_NS_FLAGS_COPY_SD 2 // Copy Security Descriptor
|
|
#define NEW_NS_FLAGS_COPY_INSTS 4 // Copy Classes
|
|
|
|
HRESULT
|
|
CreateAndCopyNameSpace( IWbemLocator *pWbemLocator,
|
|
LPWSTR szSrcNameSpace,
|
|
LPWSTR szDstRootNameSpace,
|
|
LPWSTR szDstRelNameSpace,
|
|
DWORD dwFlags,
|
|
PSECURITY_DESCRIPTOR pSecDesc,
|
|
LPWSTR *szDstNameSpaceOut);
|
|
|
|
// WMI doesn't like '-' in names. so to create an entry in WMI space
|
|
// using Sid use these 2 utility functions.
|
|
|
|
void ConvertSidToWMIName(LPTSTR lpSid, LPTSTR lpWmiName);
|
|
void ConvertWMINameToSid(LPTSTR lpWmiName, LPTSTR lpSid);
|
|
|
|
HRESULT
|
|
DeleteNameSpace( WCHAR *pwszNameSpace, WCHAR *pwszParentNameSpace, IWbemLocator *pWbemLocator );
|
|
HRESULT
|
|
DeleteRsopNameSpace( WCHAR *pwszNameSpace, IWbemLocator *pWbemLocator );
|
|
|
|
HRESULT
|
|
GetWbemServicesPtr( LPCWSTR wszNameSpace,
|
|
IWbemLocator** ppLocator,
|
|
IWbemServices** ppServices );
|
|
|
|
|
|
/*
|
|
typedef struct __tagPrincipal
|
|
{
|
|
LPWSTR szName; // e.g. Administrators, "Domain Admins"
|
|
bool bLocal; // e.g. true, false
|
|
} Principal;
|
|
*/
|
|
|
|
#ifdef __cplusplus
|
|
} // extern "C" {
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
|
|
/*
|
|
class CPrincipals
|
|
{
|
|
private:
|
|
Principal* m_pPrincipals;
|
|
DWORD m_nPrincipals;
|
|
bool m_bNormalized;
|
|
public:
|
|
CPrincipals( Principal* pPrin, DWORD dwPrin = 0 ) : m_pPrincipals(pPrin), m_nPrincipals(dwPrin)
|
|
{
|
|
};
|
|
~CPrincipals()
|
|
{
|
|
if ( m_bNormalized )
|
|
{
|
|
for ( DWORD i = 0 ; i < m_nPrincipals ; i++ )
|
|
{
|
|
if ( !m_pPrincipals[i].bLocal && m_pPrincipals[i].szName )
|
|
{
|
|
LocalFree( m_pPrincipals[i].szName );
|
|
}
|
|
}
|
|
}
|
|
};
|
|
HRESULT NormalizePrincipals( LPWSTR szDomainName )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
for ( DWORD i = 0 ; i < m_nPrincipals ; i++ )
|
|
{
|
|
if ( !m_pPrincipals[i].bLocal )
|
|
{
|
|
LPWSTR sz = ( LPWSTR )LocalAlloc( LPTR, sizeof( WCHAR ) * ( wcslen(szDomainName) + wcslen(m_pPrincipals[i].szName) + 2 ) );
|
|
|
|
if ( sz )
|
|
{
|
|
wcscpy( sz, szDomainName );
|
|
wcscat( sz, L"\\" );
|
|
wcscat( sz, m_pPrincipals[i].szName );
|
|
}
|
|
else
|
|
{
|
|
hr = GetLastError();
|
|
}
|
|
m_pPrincipals[i].szName = sz;
|
|
}
|
|
}
|
|
m_bNormalized = true;
|
|
return hr;
|
|
};
|
|
void GetPrincipals( DWORD nCount, LPWSTR* pszNames )
|
|
{
|
|
for ( DWORD i = 0 ; i < m_nPrincipals && i < nCount ; i ++ )
|
|
{
|
|
pszNames[i] = m_pPrincipals[i].szName;
|
|
}
|
|
};
|
|
};
|
|
*/
|
|
|
|
class CFailRetStatus
|
|
{
|
|
|
|
private:
|
|
IWbemObjectSink* m_pResponseHandler; // We don't own m_pResponseHandler
|
|
HRESULT m_hr;
|
|
|
|
public:
|
|
CFailRetStatus( IWbemObjectSink* pResponseHandler )
|
|
: m_pResponseHandler(pResponseHandler),
|
|
m_hr( 0 )
|
|
{
|
|
}
|
|
|
|
~CFailRetStatus()
|
|
{
|
|
if ( m_pResponseHandler )
|
|
m_pResponseHandler->SetStatus( WBEM_STATUS_COMPLETE, m_hr, NULL, NULL );
|
|
}
|
|
|
|
void SetError( HRESULT hr )
|
|
{
|
|
m_hr = hr;
|
|
}
|
|
|
|
};
|
|
|
|
#ifndef MAX
|
|
#define MAX(a,b) (((a)>(b))?(a):(b))
|
|
#endif
|
|
|
|
#ifndef MIN
|
|
#define MIN(a,b) (((a)<(b))?(a):(b))
|
|
#endif
|
|
|
|
|
|
#endif
|
|
|
|
#endif // __RSOPINC_H__
|