|
|
//***************************************************************************
//
// 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; }
|