477 lines
11 KiB
C++
477 lines
11 KiB
C++
//***************************************************************************
|
|
//
|
|
// Copyright (c) 1998-1999 Microsoft Corporation
|
|
//
|
|
// PRIVILEGE.CPP
|
|
//
|
|
// alanbos 30-Sep-98 Created.
|
|
//
|
|
// Defines the implementation of CSWbemPrivilege
|
|
//
|
|
//***************************************************************************
|
|
|
|
#include "precomp.h"
|
|
|
|
#ifndef _UNICODE
|
|
#include <mbstring.h>
|
|
#endif
|
|
|
|
typedef struct PrivilegeDef {
|
|
WbemPrivilegeEnum privilege;
|
|
TCHAR *tName;
|
|
OLECHAR *monikerName;
|
|
} PrivilegeDef;
|
|
|
|
#define WBEMS_MAX_NUM_PRIVILEGE 27
|
|
|
|
static PrivilegeDef s_privilegeDefMap [WBEMS_MAX_NUM_PRIVILEGE] = {
|
|
{ wbemPrivilegeCreateToken, SE_CREATE_TOKEN_NAME, L"CreateToken" },
|
|
{ wbemPrivilegePrimaryToken, SE_ASSIGNPRIMARYTOKEN_NAME, L"PrimaryToken" },
|
|
{ wbemPrivilegeLockMemory, SE_LOCK_MEMORY_NAME, L"LockMemory" },
|
|
{ wbemPrivilegeIncreaseQuota, SE_INCREASE_QUOTA_NAME, L"IncreaseQuota" },
|
|
{ wbemPrivilegeMachineAccount, SE_MACHINE_ACCOUNT_NAME, L"MachineAccount" },
|
|
{ wbemPrivilegeTcb, SE_TCB_NAME, L"Tcb" },
|
|
{ wbemPrivilegeSecurity, SE_SECURITY_NAME, L"Security" },
|
|
{ wbemPrivilegeTakeOwnership, SE_TAKE_OWNERSHIP_NAME, L"TakeOwnership" },
|
|
{ wbemPrivilegeLoadDriver, SE_LOAD_DRIVER_NAME, L"LoadDriver" },
|
|
{ wbemPrivilegeSystemProfile, SE_SYSTEM_PROFILE_NAME, L"SystemProfile" },
|
|
{ wbemPrivilegeSystemtime, SE_SYSTEMTIME_NAME, L"SystemTime" },
|
|
{ wbemPrivilegeProfileSingleProcess, SE_PROF_SINGLE_PROCESS_NAME, L"ProfileSingleProcess" },
|
|
{ wbemPrivilegeIncreaseBasePriority, SE_INC_BASE_PRIORITY_NAME, L"IncreaseBasePriority" },
|
|
{ wbemPrivilegeCreatePagefile, SE_CREATE_PAGEFILE_NAME, L"CreatePagefile" },
|
|
{ wbemPrivilegeCreatePermanent, SE_CREATE_PERMANENT_NAME, L"CreatePermanent" },
|
|
{ wbemPrivilegeBackup, SE_BACKUP_NAME, L"Backup" },
|
|
{ wbemPrivilegeRestore, SE_RESTORE_NAME, L"Restore" },
|
|
{ wbemPrivilegeShutdown, SE_SHUTDOWN_NAME, L"Shutdown" },
|
|
{ wbemPrivilegeDebug, SE_DEBUG_NAME, L"Debug" },
|
|
{ wbemPrivilegeAudit, SE_AUDIT_NAME, L"Audit" },
|
|
{ wbemPrivilegeSystemEnvironment, SE_SYSTEM_ENVIRONMENT_NAME, L"SystemEnvironment" },
|
|
{ wbemPrivilegeChangeNotify, SE_CHANGE_NOTIFY_NAME, L"ChangeNotify" },
|
|
{ wbemPrivilegeRemoteShutdown, SE_REMOTE_SHUTDOWN_NAME, L"RemoteShutdown" },
|
|
{ wbemPrivilegeUndock, SE_UNDOCK_NAME, L"Undock" },
|
|
{ wbemPrivilegeSyncAgent, SE_SYNC_AGENT_NAME, L"SyncAgent" },
|
|
{ wbemPrivilegeEnableDelegation, SE_ENABLE_DELEGATION_NAME, L"EnableDelegation" },
|
|
{ wbemPrivilegeManageVolume, SE_MANAGE_VOLUME_NAME, L"ManageVolume" }
|
|
};
|
|
|
|
TCHAR *CSWbemPrivilege::GetNameFromId (WbemPrivilegeEnum iPrivilege)
|
|
{
|
|
DWORD i = iPrivilege - 1;
|
|
return (WBEMS_MAX_NUM_PRIVILEGE > i) ?
|
|
s_privilegeDefMap [i].tName : NULL;
|
|
}
|
|
|
|
OLECHAR *CSWbemPrivilege::GetMonikerNameFromId (WbemPrivilegeEnum iPrivilege)
|
|
{
|
|
DWORD i = iPrivilege - 1;
|
|
return (WBEMS_MAX_NUM_PRIVILEGE > i) ?
|
|
s_privilegeDefMap [i].monikerName : NULL;
|
|
}
|
|
|
|
bool CSWbemPrivilege::GetIdFromMonikerName (OLECHAR *pName, WbemPrivilegeEnum &iPrivilege)
|
|
{
|
|
bool status = false;
|
|
|
|
if (pName)
|
|
{
|
|
for (DWORD i = 0; i < WBEMS_MAX_NUM_PRIVILEGE; i++)
|
|
{
|
|
if (0 == _wcsnicmp (pName, s_privilegeDefMap [i].monikerName,
|
|
wcslen (s_privilegeDefMap [i].monikerName)))
|
|
{
|
|
// Success
|
|
iPrivilege = s_privilegeDefMap [i].privilege;
|
|
status = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return status;
|
|
}
|
|
|
|
bool CSWbemPrivilege::GetIdFromName (BSTR bsName, WbemPrivilegeEnum &iPrivilege)
|
|
{
|
|
bool status = false;
|
|
|
|
if (bsName)
|
|
{
|
|
#ifdef _UNICODE
|
|
for (DWORD i = 0; i < WBEMS_MAX_NUM_PRIVILEGE; i++)
|
|
{
|
|
if (0 == _wcsicmp (bsName, s_privilegeDefMap [i].tName))
|
|
{
|
|
// Success
|
|
iPrivilege = s_privilegeDefMap [i].privilege;
|
|
status = true;
|
|
break;
|
|
}
|
|
}
|
|
#else
|
|
// Convert bsName to a multibyte string
|
|
size_t mbsNameLen = wcstombs (NULL, bsName, 0);
|
|
char *mbsName = new char [mbsNameLen + 1];
|
|
|
|
if (mbsName)
|
|
{
|
|
wcstombs (mbsName, bsName, mbsNameLen);
|
|
mbsName [mbsNameLen] = NULL;
|
|
|
|
for (DWORD i = 0; i < WBEMS_MAX_NUM_PRIVILEGE; i++)
|
|
{
|
|
if (0 == _mbsicmp ((unsigned char *)mbsName, (unsigned char *)(s_privilegeDefMap [i].tName)))
|
|
{
|
|
// Success
|
|
iPrivilege = s_privilegeDefMap [i].privilege;
|
|
status = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
delete [] mbsName;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
return status;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// CSWbemPrivilege::CSWbemPrivilege
|
|
//
|
|
// CONSTRUCTOR
|
|
//
|
|
//***************************************************************************
|
|
|
|
CSWbemPrivilege::CSWbemPrivilege (
|
|
WbemPrivilegeEnum iPrivilege,
|
|
LUID &luid,
|
|
bool bIsEnabled
|
|
)
|
|
{
|
|
m_Dispatch.SetObj (this, IID_ISWbemPrivilege,
|
|
CLSID_SWbemPrivilege, L"SWbemPrivilege");
|
|
m_cRef=1;
|
|
|
|
m_privilege = iPrivilege;
|
|
m_Luid = luid;
|
|
m_bIsEnabled = bIsEnabled;
|
|
|
|
InterlockedIncrement(&g_cObj);
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// CSWbemPrivilege::~CSWbemPrivilege
|
|
//
|
|
// DESTRUCTOR
|
|
//
|
|
//***************************************************************************
|
|
|
|
CSWbemPrivilege::~CSWbemPrivilege (void)
|
|
{
|
|
InterlockedDecrement(&g_cObj);
|
|
}
|
|
|
|
//***************************************************************************
|
|
// HRESULT CSWbemPrivilege::QueryInterface
|
|
// long CSWbemPrivilege::AddRef
|
|
// long CSWbemPrivilege::Release
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Standard Com IUNKNOWN functions.
|
|
//
|
|
//***************************************************************************
|
|
|
|
STDMETHODIMP CSWbemPrivilege::QueryInterface (
|
|
|
|
IN REFIID riid,
|
|
OUT LPVOID *ppv
|
|
)
|
|
{
|
|
*ppv=NULL;
|
|
|
|
if (IID_IUnknown==riid)
|
|
*ppv = reinterpret_cast<IUnknown*>(this);
|
|
else if (IID_ISWbemPrivilege==riid)
|
|
*ppv = (ISWbemPrivilege *)this;
|
|
else if (IID_IDispatch==riid)
|
|
*ppv = (IDispatch *)this;
|
|
else if (IID_ISupportErrorInfo==riid)
|
|
*ppv = (ISupportErrorInfo *)this;
|
|
else if (IID_IProvideClassInfo==riid)
|
|
*ppv = (IProvideClassInfo *)this;
|
|
|
|
if (NULL!=*ppv)
|
|
{
|
|
((LPUNKNOWN)*ppv)->AddRef();
|
|
return NOERROR;
|
|
}
|
|
|
|
return ResultFromScode(E_NOINTERFACE);
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CSWbemPrivilege::AddRef(void)
|
|
{
|
|
long l = InterlockedIncrement(&m_cRef);
|
|
return l;
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CSWbemPrivilege::Release(void)
|
|
{
|
|
long l = InterlockedDecrement(&m_cRef);
|
|
if (0L!=l)
|
|
return l;
|
|
delete this;
|
|
return 0;
|
|
}
|
|
|
|
//***************************************************************************
|
|
// HRESULT CSWbemPrivilege::InterfaceSupportsErrorInfo
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Standard Com ISupportErrorInfo functions.
|
|
//
|
|
//***************************************************************************
|
|
|
|
STDMETHODIMP CSWbemPrivilege::InterfaceSupportsErrorInfo (IN REFIID riid)
|
|
{
|
|
return (IID_ISWbemPrivilege == riid) ? S_OK : S_FALSE;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// SCODE CSWbemPrivilege::get_Identifier
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Retrieve the privilege identifier
|
|
//
|
|
// PARAMETERS:
|
|
//
|
|
// pIsEnabled holds the value on return
|
|
//
|
|
// RETURN VALUES:
|
|
//
|
|
// WBEM_S_NO_ERROR success
|
|
// WBEM_E_INVALID_PARAMETER bad input parameters
|
|
// WBEM_E_FAILED otherwise
|
|
//
|
|
//***************************************************************************
|
|
|
|
HRESULT CSWbemPrivilege::get_Identifier (
|
|
WbemPrivilegeEnum *pPrivilege
|
|
)
|
|
{
|
|
HRESULT hr = WBEM_E_FAILED;
|
|
|
|
ResetLastErrors ();
|
|
|
|
if (NULL == pPrivilege)
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
else
|
|
{
|
|
*pPrivilege = m_privilege;
|
|
hr = WBEM_S_NO_ERROR;
|
|
}
|
|
|
|
if (FAILED(hr))
|
|
m_Dispatch.RaiseException (hr);
|
|
|
|
return hr;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// SCODE CSWbemPrivilege::get_IsEnabled
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Retrieve the override state
|
|
//
|
|
// PARAMETERS:
|
|
//
|
|
// pIsEnabled holds the value on return
|
|
//
|
|
// RETURN VALUES:
|
|
//
|
|
// WBEM_S_NO_ERROR success
|
|
// WBEM_E_INVALID_PARAMETER bad input parameters
|
|
// WBEM_E_FAILED otherwise
|
|
//
|
|
//***************************************************************************
|
|
|
|
HRESULT CSWbemPrivilege::get_IsEnabled (
|
|
VARIANT_BOOL *pIsEnabled
|
|
)
|
|
{
|
|
HRESULT hr = WBEM_E_FAILED;
|
|
|
|
ResetLastErrors ();
|
|
|
|
if (NULL == pIsEnabled)
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
else
|
|
{
|
|
*pIsEnabled = (m_bIsEnabled) ? VARIANT_TRUE : VARIANT_FALSE;
|
|
hr = WBEM_S_NO_ERROR;
|
|
}
|
|
|
|
if (FAILED(hr))
|
|
m_Dispatch.RaiseException (hr);
|
|
|
|
return hr;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// SCODE CSWbemPrivilege::put_IsEnabled
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Set the override state
|
|
//
|
|
// PARAMETERS:
|
|
//
|
|
// bIsEnabled the new value
|
|
//
|
|
// RETURN VALUES:
|
|
//
|
|
// WBEM_S_NO_ERROR success
|
|
// WBEM_E_INVALID_PARAMETER bad input parameters
|
|
// WBEM_E_FAILED otherwise
|
|
//
|
|
//***************************************************************************
|
|
|
|
HRESULT CSWbemPrivilege::put_IsEnabled (
|
|
VARIANT_BOOL bIsEnabled
|
|
)
|
|
{
|
|
m_bIsEnabled = (bIsEnabled) ? true : false;
|
|
return WBEM_S_NO_ERROR;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// SCODE CSWbemPrivilege::get_Name
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Retrieve the privilege name
|
|
//
|
|
// PARAMETERS:
|
|
//
|
|
// pName holds the value on return
|
|
//
|
|
// RETURN VALUES:
|
|
//
|
|
// WBEM_S_NO_ERROR success
|
|
// WBEM_E_INVALID_PARAMETER bad input parameters
|
|
// WBEM_E_FAILED otherwise
|
|
//
|
|
//***************************************************************************
|
|
|
|
HRESULT CSWbemPrivilege::get_Name (
|
|
BSTR *pName
|
|
)
|
|
{
|
|
HRESULT hr = WBEM_E_FAILED;
|
|
|
|
ResetLastErrors ();
|
|
|
|
if (NULL == pName)
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
else
|
|
{
|
|
TCHAR *tName = GetNameFromId (m_privilege);
|
|
|
|
if (tName)
|
|
{
|
|
// Have a valid name - now copy it to a BSTR
|
|
|
|
#ifdef _UNICODE
|
|
if (*pName = SysAllocString (tName))
|
|
hr = WBEM_S_NO_ERROR;
|
|
else
|
|
hr = WBEM_E_OUT_OF_MEMORY;
|
|
#else
|
|
size_t tNameLen = strlen (tName);
|
|
OLECHAR *nameW = new OLECHAR [tNameLen + 1];
|
|
|
|
if (nameW)
|
|
{
|
|
mbstowcs (nameW, tName, tNameLen);
|
|
nameW [tNameLen] = NULL;
|
|
*pName = SysAllocString (nameW);
|
|
delete [] nameW;
|
|
hr = WBEM_S_NO_ERROR;
|
|
}
|
|
else
|
|
hr = WBEM_E_OUT_OF_MEMORY;
|
|
#endif
|
|
}
|
|
}
|
|
|
|
if (FAILED(hr))
|
|
m_Dispatch.RaiseException (hr);
|
|
|
|
return hr;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// SCODE CSWbemPrivilege::get_DisplayName
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Retrieve the privilege display name
|
|
//
|
|
// PARAMETERS:
|
|
//
|
|
// pDisplayName holds the value on return
|
|
//
|
|
// RETURN VALUES:
|
|
//
|
|
// WBEM_S_NO_ERROR success
|
|
// WBEM_E_INVALID_PARAMETER bad input parameters
|
|
// WBEM_E_FAILED otherwise
|
|
//
|
|
//***************************************************************************
|
|
|
|
HRESULT CSWbemPrivilege::get_DisplayName (
|
|
BSTR *pDisplayName
|
|
)
|
|
{
|
|
HRESULT hr = WBEM_E_FAILED;
|
|
|
|
ResetLastErrors ();
|
|
|
|
if (NULL == pDisplayName)
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
else
|
|
{
|
|
TCHAR *tName = GetNameFromId (m_privilege);
|
|
|
|
if (tName)
|
|
{
|
|
CSWbemSecurity::LookupPrivilegeDisplayName (tName, pDisplayName);
|
|
hr = WBEM_S_NO_ERROR;
|
|
}
|
|
}
|
|
|
|
if (FAILED(hr))
|
|
m_Dispatch.RaiseException (hr);
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
void CSWbemPrivilege::GetLUID (PLUID pLuid)
|
|
{
|
|
if (pLuid)
|
|
*pLuid = m_Luid;
|
|
}
|