|
|
//+--------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1998
//
// File: ScripLog.cpp
//
// Contents:
//
// History: 9-Aug-99 NishadM Created
//
//---------------------------------------------------------------------------
#include "gptext.h"
#include "scriplog.h"
#include <wbemtime.h>
//
// macros
//
#define MakeScriptId( wszKey, wszGpoId, wszSomId, wszType ) \
wszKey = (LPWSTR) LocalAlloc( LPTR, (wcslen(wszGpoId) + wcslen(wszSomId) + wcslen(wszType) + 3) * sizeof(WCHAR) ); \ if ( wszKey ) \ { \ wcscpy( wszKey, wszGpoId );wcscat( wszKey, L"-" ); \ wcscat( wszKey, wszSomId );wcscat( wszKey, L"-" ); \ wcscat( wszKey, wszType ); \ }
//*************************************************************
//
// CScriptsLogger::CScriptsLogger()
//
// Purpose: Constructor
//
// Parameters: pWbemServices - Wbem services
//
//*************************************************************
CScriptsLogger::CScriptsLogger( IWbemServices *pWbemServices ) : m_bInitialized(FALSE), m_pWbemServices(pWbemServices) { //
// Policy Object, RSOP_PolicySetting in MOF
//
m_xbstrPath = L"__PATH"; if ( !m_xbstrPath ) return;
m_xbstrId = L"id"; if ( !m_xbstrId ) return;
m_xbstrName = L"name"; if ( !m_xbstrName ) return;
m_xbstrGPO = L"GPOID"; if ( !m_xbstrGPO ) return;
m_xbstrSOM = L"SOMID"; if ( !m_xbstrSOM ) return;
m_xbstrOrderClass = L"precedence"; if ( !m_xbstrOrderClass ) return;
//
// Script Policy Object, RSOP_ScriptPolicySetting in MOF
//
m_xbstrScriptPolicySetting = L"RSOP_ScriptPolicySetting"; if ( !m_xbstrScriptPolicySetting ) return;
//
// ScriptType field of RSOP_ScriptPolicySetting in the MOF
//
m_xbstrScriptType = L"ScriptType"; if ( !m_xbstrScriptType ) return;
//
// ScriptList field of RSOP_ScriptPolicySetting in MOF
//
m_xbstrScriptList = L"ScriptList"; if ( !m_xbstrScriptList ) return;
//
// Order field of RSOP_ScriptPolicySetting in MOF
//
m_xbstrOrder = L"scriptOrder"; if ( !m_xbstrOrder ) return;
//
// WBEM version of CF for RSOP_ScriptPolicySetting
//
HRESULT hr = m_pWbemServices->GetObject( m_xbstrScriptPolicySetting, 0L, 0, &m_xScriptPolicySetting, 0 ); if ( FAILED(hr) ) { return; }
//
// individual script commands, RSOP_ScriptCmd in MOF
//
m_xbstrScriptCommand = L"RSOP_ScriptCmd"; if ( !m_xbstrScriptCommand ) return;
//
// Script field of RSOP_ScriptCmd
//
m_xbstrScript = L"Script"; if ( !m_xbstrScript ) return;
//
// Arguments field of RSOP_ScriptCmd
//
m_xbstrArguments = L"Arguments"; if ( !m_xbstrArguments ) return;
//
// executionTime field of RSOP_ScriptCmd
//
m_xbstrExecutionTime = L"executionTime"; if ( !m_xbstrExecutionTime ) return;
//
// WBEM version of CF for RSOP_ScriptCmd
//
hr = m_pWbemServices->GetObject( m_xbstrScriptCommand, 0L, 0, &m_xScriptCommand, 0 ); if ( FAILED(hr) ) { return; }
//
// spawn an instance of RSOP_ScriptPolicySetting
//
hr = m_xScriptPolicySetting->SpawnInstance( 0, &m_pInstance ); if ( FAILED (hr) ) { DebugMsg((DM_WARNING, TEXT("CScriptsLogger::Log: spawn instance failed, %d."), hr )); return; }
m_bInitialized = TRUE; }
//*************************************************************
//
// CScriptsLogger::Log()
//
// Purpose: Logs an instance of registry policy object
//
//
//*************************************************************
HRESULT CScriptsLogger::Log(PRSOP_ScriptList pList, LPWSTR wszGPOID, LPWSTR wszSOMID, LPWSTR wszRSOPGPOID, DWORD cOrder ) { HRESULT hr = S_OK; VARIANT var;
//
// if CScriptsLogger is initialized
//
if ( !m_bInitialized ) { DebugMsg((DM_WARNING, TEXT("CScriptsLogger::Log: object not initialized."))); return E_UNEXPECTED; }
//
// create a SafeArray of commands
//
XSafeArray xSafeArray = MakeSafeArrayOfScripts( pList );
if ( !xSafeArray ) { hr = HRESULT_FROM_WIN32( GetLastError() ); DebugMsg((DM_WARNING, TEXT("CScriptsLogger::Log: could not create safe array of scripts."))); return hr; }
//
// set "id" for RSOP_PolicySetting
//
LPCWSTR wszType = ScriptTypeString( GetScriptType(pList) ); XPtrLF<WCHAR> wszId; MakeScriptId( wszId, wszGPOID, wszSOMID, wszType );
if ( wszId ) { XBStr xId( wszId ); if ( !xId ) { DebugMsg((DM_WARNING, TEXT("CScriptsLogger::Log: ID is NULL."))); return E_OUTOFMEMORY; }
var.vt = VT_BSTR; var.bstrVal = xId; hr = m_pInstance->Put( m_xbstrId, 0, &var, 0 ); if ( FAILED (hr) ) { DebugMsg((DM_WARNING, TEXT("CScriptsLogger::Log: put failed, %d."), hr )); return hr; } } else { hr = HRESULT_FROM_WIN32( GetLastError() ); DebugMsg((DM_WARNING, TEXT("CScriptsLogger::Log: memory allocation failed."))); return hr; }
//
// set "name" for RSOP_PolicySetting
//
XBStr xName( L"Group Policy Object Scripts" ); var.vt = VT_BSTR; var.bstrVal = xName; hr = m_pInstance->Put( m_xbstrName, 0, &var, 0 ); if ( FAILED (hr) ) { DebugMsg((DM_WARNING, TEXT("CScriptsLogger::Log: put name failed, %d."), hr )); return hr; }
//
// set "GPOID" for RSOP_PolicySetting
//
var.vt = VT_BSTR; var.bstrVal = wszRSOPGPOID; hr = m_pInstance->Put( m_xbstrGPO, 0, &var, 0 ); if ( FAILED (hr) ) { DebugMsg((DM_WARNING, TEXT("CScriptsLogger::Log: put GPOID failed, %d."), hr )); return hr; }
//
// set "SOMID" for RSOP_PolicySetting
//
var.vt = VT_BSTR; var.bstrVal = wszSOMID; hr = m_pInstance->Put( m_xbstrSOM, 0, &var, 0 ); if ( FAILED (hr) ) { DebugMsg((DM_WARNING, TEXT("CScriptsLogger::Log: put SOMID failed, %d."), hr )); return hr; }
//
// set "precedence" for RSOP_PolicySetting
//
var.vt = VT_I4; var.lVal = 1; hr = m_pInstance->Put( m_xbstrOrderClass, 0, &var, 0 ); if ( FAILED (hr) ) { DebugMsg((DM_WARNING, TEXT("CScriptsLogger::Log: put mergeOrder_Class failed, %d."), hr )); return hr; }
//
// set the "ScriptType" for RSOP_ScriptPolicySetting
//
var.vt = VT_I4; var.lVal = (LONG) GetScriptType(pList); hr = m_pInstance->Put( m_xbstrScriptType, 0, &var, 0 ); if ( FAILED (hr) ) { DebugMsg((DM_WARNING, TEXT("CScriptsLogger::Log: put ScriptType failed, %d."), hr )); return hr; }
//
// set the "ScriptList" for RSOP_ScriptPolicySetting
//
var.vt = VT_ARRAY | VT_UNKNOWN; var.parray = xSafeArray; hr = m_pInstance->Put( m_xbstrScriptList, 0, &var, 0 ); if ( FAILED (hr) ) { DebugMsg((DM_WARNING, TEXT("CScriptsLogger::Log: put ScriptList failed, %d."), hr )); return hr; }
//
// set the "Order" for RSOP_ScriptPolicySetting
//
var.vt = VT_I4; var.lVal = cOrder; hr = m_pInstance->Put( m_xbstrOrder, 0, &var, 0 ); if ( FAILED (hr) ) { DebugMsg((DM_WARNING, TEXT("CScriptsLogger::Log: put Order failed, %d."), hr )); return hr; }
//
// commit the instance of RSOP_ScriptPolicySetting
//
hr = m_pWbemServices->PutInstance( m_pInstance, WBEM_FLAG_CREATE_OR_UPDATE, NULL, NULL );
return hr; }
HRESULT CScriptsLogger::Update( PRSOP_ScriptList pList, LPCWSTR wszGPOID, LPCWSTR wszSOMID ) { if ( !m_bInitialized ) { DebugMsg((DM_WARNING, TEXT("CScriptsLogger::Update: object not initialized."))); return E_UNEXPECTED; }
XInterface<IEnumWbemClassObject> xEnum;
//
// create an enumeration of RSOP_ScriptPolicySetting objects
//
HRESULT hr = m_pWbemServices->CreateInstanceEnum( m_xbstrScriptPolicySetting, WBEM_FLAG_SHALLOW, NULL, &xEnum ); if ( FAILED(hr) ) { DebugMsg((DM_WARNING, TEXT("CScriptsLogger::Update: CreateInstanceEnum() failed, %d."), hr )); return hr; }
ULONG ulReturned = 1; LONG TIMEOUT = -1; LPWSTR wszId; LPCWSTR wszType = ScriptTypeString( GetScriptType( pList ) );
MakeScriptId( wszId, wszGPOID, wszSOMID, wszType );
if ( !wszId ) { hr = HRESULT_FROM_WIN32( GetLastError() ); DebugMsg((DM_WARNING, TEXT("CScriptsLogger::Update: memory allocation error, %d."), hr )); return hr; }
XPtrLF<WCHAR> xId = wszId;
while ( ulReturned == 1 && SUCCEEDED( hr ) ) { XInterface<IWbemClassObject> xInstance; //
// for every object
//
hr = xEnum->Next( TIMEOUT, 1, &xInstance, &ulReturned );
if ( FAILED( hr ) ) { DebugMsg((DM_WARNING, TEXT("CScriptsLogger::Update: enumeration failed, %d."), hr )); } else if ( ulReturned == 1 ) { VARIANT var;
VariantInit( &var );
//
// get the "id" from RSOP_ScriptPolicySetting
//
hr = xInstance->Get( m_xbstrId, 0L, &var, 0, 0 ); if ( SUCCEEDED(hr) ) { XVariant xVar(&var); if ( !wcscmp( var.bstrVal, wszId ) ) { XSafeArray xSafeArray = MakeSafeArrayOfScripts( pList );
if ( xSafeArray ) {
//
// set the "ScriptList" for RSOP_ScriptPolicySetting
//
VARIANT var2; var2.vt = VT_ARRAY | VT_UNKNOWN; var2.parray = xSafeArray;
hr = xInstance->Put( m_xbstrScriptList, 0, &var2, 0 ); if ( SUCCEEDED (hr) ) { //
// commit the instance of RSOP_ScriptPolicySetting
//
hr = m_pWbemServices->PutInstance( xInstance, WBEM_FLAG_UPDATE_ONLY, NULL, NULL );
if ( FAILED( hr ) ) { DebugMsg((DM_WARNING, TEXT("CScriptsLogger::Update: PutInstance() failed, %d."), hr )); } } else { DebugMsg((DM_WARNING, TEXT("CScriptsLogger::Update: Put ScriptList failed, %d."), hr )); } } else { DebugMsg((DM_WARNING, TEXT("CScriptsLogger::Update: could not create safearray."))); } } } else { DebugMsg((DM_WARNING, TEXT("CScriptsLogger::Update: pInstance->Get() failed, %d."), hr )); } } }
return hr; }
HRESULT CScriptsLogger::Delete( PRSOP_ScriptList pList ) { if ( !m_bInitialized ) { DebugMsg((DM_WARNING, TEXT("CScriptsLogger::Delete: object not initialized."))); return E_UNEXPECTED; }
XInterface<IEnumWbemClassObject> xEnum;
//
// create an enumeration of RSOP_ScriptPolicySetting objects
//
HRESULT hr = m_pWbemServices->CreateInstanceEnum( m_xbstrScriptPolicySetting, WBEM_FLAG_SHALLOW, NULL, &xEnum ); if ( FAILED(hr) ) { DebugMsg((DM_WARNING, TEXT("CScriptsLogger::Delete: could not enumerate instances."))); }
ULONG ulReturned = 1; LONG TIMEOUT = -1; ScriptType type = GetScriptType( pList );
while ( ulReturned == 1 ) { XInterface<IWbemClassObject> xInstance; //
// for every object
//
hr = xEnum->Next( TIMEOUT, 1, &xInstance, &ulReturned );
if ( FAILED( hr ) ) { DebugMsg((DM_WARNING, TEXT("CScriptsLogger::Delete: could not get next instance, %d."), hr)); } else if ( ulReturned == 1 ) { VARIANT var; VariantInit( &var );
//
// get the "type" from RSOP_ScriptPolicySetting
//
hr = xInstance->Get( m_xbstrScriptType, 0L, &var, 0, 0 ); if ( SUCCEEDED(hr) ) { //
// if type field matches,
//
if ( var.lVal == (long) type ) { hr = xInstance->Get( m_xbstrPath, 0L, &var, 0, 0 ); if ( SUCCEEDED(hr) ) { //
// delete the instance
// we could optimize and return here but,
// by not doing so, we cleanup all the objects
//
hr = m_pWbemServices->DeleteInstance( var.bstrVal, 0L, 0, 0 ); if ( FAILED( hr ) ) { DebugMsg((DM_WARNING, TEXT("CScriptsLogger::Delete: could not delete instance, %d."), hr )); } } else { DebugMsg((DM_WARNING, TEXT("CScriptsLogger::Delete: could not get type value, %d."), hr)); }
VariantClear( &var ); } } else { DebugMsg((DM_WARNING, TEXT("CScriptsLogger::Delete: could not get type, %d."), hr)); } } }
return hr; }
IUnknown* CScriptsLogger::PutScriptCommand( LPCWSTR wszCommand, LPCWSTR wszParams, SYSTEMTIME* pExecTime ) { IUnknown* pUnk = 0;
//
// if CScriptsLogger is initialized
//
if ( !m_bInitialized ) { DebugMsg((DM_WARNING, TEXT("CScriptsLogger::PutScriptCommand: object not initialized."))); return pUnk; }
IWbemClassObject* pInstance = 0;
//
// spawn an instance of RSOP_ScriptCmd
//
HRESULT hr = m_xScriptCommand->SpawnInstance( 0, &pInstance ); if ( FAILED (hr) ) { DebugMsg((DM_WARNING, TEXT("CScriptsLogger::PutScriptCommand: spawn instance failed, %d."), hr )); return pUnk; }
XInterface<IWbemClassObject> xInstance( pInstance ); VARIANT var;
//
// set the Script field for RSOP_ScriptCmd
//
XBStr xCommand( ( LPWSTR ) wszCommand );
var.vt = VT_BSTR; var.bstrVal = xCommand; hr = pInstance->Put( m_xbstrScript, 0, &var, 0 ); if ( FAILED (hr) ) { DebugMsg((DM_WARNING, TEXT("CScriptsLogger::PutScriptCommand: put Script failed, %d."), hr )); return pUnk; }
//
// set the Arguments field for RSOP_ScriptCmd
//
XBStr xParams( ( LPWSTR ) wszParams );
var.vt = VT_BSTR; var.bstrVal = xParams; hr = pInstance->Put( m_xbstrArguments, 0, &var, 0 ); if ( FAILED (hr) ) { DebugMsg((DM_WARNING, TEXT("CScriptsLogger::PutScriptCommand: put Arguments failed, %d."), hr )); return pUnk; }
//
// set the executionTime field for RSOP_ScriptCmd
//
XBStr xExecutionTime;
hr = SystemTimeToWbemTime( *pExecTime, xExecutionTime ); if ( FAILED (hr) ) { DebugMsg((DM_WARNING, TEXT("CScriptsLogger::PutScriptCommand: put SystemTimeToWbemTime failed, %d."), hr )); return pUnk; } var.vt = VT_BSTR; var.bstrVal = xExecutionTime; hr = pInstance->Put( m_xbstrExecutionTime, 0, &var, 0 ); if ( FAILED (hr) ) { DebugMsg((DM_WARNING, TEXT("CScriptsLogger::PutScriptCommand: put executionTime failed, %d."), hr )); return pUnk; }
pInstance->QueryInterface( IID_IUnknown, (void **)&pUnk);
return pUnk; }
LPSAFEARRAY CScriptsLogger::MakeSafeArrayOfScripts( PRSOP_ScriptList pList ) { SAFEARRAYBOUND arrayBound[1];
arrayBound[0].lLbound = 0; arrayBound[0].cElements = GetScriptCount( pList );
//
// create a SafeArray of RSOP_ScriptCmd
//
SAFEARRAY *pSafeArray = SafeArrayCreate( VT_UNKNOWN, 1, arrayBound );
if ( pSafeArray ) { DWORD nCommand = GetScriptCount( pList );
if ( nCommand ) { LPCWSTR szCommand = 0, szParams = 0; void* pv; long dwIndex = 0; SYSTEMTIME* pExecTime = 0; //
// populate the array
//
GetFirstScript( pList, &pv, &szCommand, &szParams, &pExecTime );
do { IUnknown* pUnk = PutScriptCommand( szCommand, szParams, pExecTime );
SafeArrayPutElement( pSafeArray, &dwIndex, pUnk );
nCommand--; dwIndex++;
GetNextScript( pList, &pv, &szCommand, &szParams, &pExecTime );
} while ( nCommand ); } }
return pSafeArray; }
//*************************************************************
//
// LogScriptsRsopData()
//
// Purpose: Logs scripts Rsop data to Cimom database
//
// Return: True if successful
//
//*************************************************************
HRESULT LogScriptsRsopData( RSOPScriptList pScriptList, IWbemServices* pWbemServices, LPCWSTR wszGPOID, LPCWSTR wszSOMID, LPCWSTR wszRSOPGPOID, DWORD cOrder )
{ PRSOP_ScriptList pList = (PRSOP_ScriptList) pScriptList; HRESULT hr = E_POINTER; void* pv = 0;
if ( wszGPOID && wszSOMID && pWbemServices && pScriptList ) { CScriptsLogger scriptsLogger( pWbemServices );
//
// RSOP logging for scripts ext
//
hr = scriptsLogger.Log( pList, (LPWSTR)wszGPOID, (LPWSTR)wszSOMID, (LPWSTR)wszRSOPGPOID, cOrder ); }
return hr; }
HRESULT UpdateScriptsRsopData( RSOPScriptList pScriptList, IWbemServices* pWbemServices, LPCWSTR wszGPOID, LPCWSTR wszSOMID ) { PRSOP_ScriptList pList = (PRSOP_ScriptList) pScriptList; HRESULT hr = E_POINTER; void* pv = 0;
if ( wszGPOID && pWbemServices && wszSOMID && pScriptList ) { CScriptsLogger scriptsLogger( pWbemServices );
//
// RSOP update for scripts
//
hr = scriptsLogger.Update( pList, wszGPOID, wszSOMID ); }
return hr; }
//*************************************************************
//
// DeleteScriptsRsopData()
//
// Purpose: Logs scripts Rsop data to Cimom database
//
// Return: True if successful
//
//*************************************************************
HRESULT DeleteScriptsRsopData( RSOPScriptList pScriptList, IWbemServices* pWbemServices ) { PRSOP_ScriptList pList = (PRSOP_ScriptList) pScriptList; HRESULT hr = E_POINTER; void* pv = 0;
if ( pWbemServices && pScriptList ) { CScriptsLogger scriptsLogger( pWbemServices );
//
// delete all previous instances of RSOP_ScriptPolicySetting
// with matching type
//
hr = scriptsLogger.Delete( pList ); }
return hr; }
LPWSTR GetNamespace( IWbemServices* pWbemServices ) { LPWSTR szNamespace = 0;
if ( pWbemServices ) { BSTR bstrClass = SysAllocString( L"RSOP_ScriptPolicySetting" );
if ( bstrClass ) { IEnumWbemClassObject *pEnum; HRESULT hr;
hr = pWbemServices->CreateInstanceEnum( bstrClass, WBEM_FLAG_SHALLOW, 0, &pEnum ); if ( SUCCEEDED ( hr ) ) { IWbemClassObject *pInstance = 0; ULONG ulReturned = 1;
hr = pEnum->Next( -1, 1, &pInstance, &ulReturned ); if ( SUCCEEDED( hr ) ) { BSTR bstrPath = SysAllocString( L"__PATH" ); VARIANT var; VariantInit( &var );
hr = pInstance->Get( bstrPath, 0L, &var, 0, 0 ); if ( SUCCEEDED( hr ) ) { szNamespace = wcschr( var.bstrVal, L':' );
if ( szNamespace ) { *szNamespace = 0; } szNamespace = (LPWSTR) LocalAlloc( LPTR, ( wcslen( var.bstrVal ) + 1 ) * sizeof(WCHAR) );
if ( szNamespace ) { wcscpy( szNamespace, var.bstrVal ); } else { DebugMsg((DM_WARNING, TEXT("GetNamespace: failed to allocate memory, %d."), GetLastError() )); } VariantClear(&var); } else { DebugMsg((DM_WARNING, TEXT("GetNamespace: failed to get __PATH, %d."), hr )); } pInstance->Release(); } else { DebugMsg((DM_WARNING, TEXT("GetNamespace: failed to get instance, %d."), hr )); } pEnum->Release(); } else { DebugMsg((DM_WARNING, TEXT("GetNamespace: failed to enumerate instances, %d."), hr )); } SysFreeString( bstrClass ); } else { DebugMsg((DM_WARNING, TEXT("GetNamespace: failed to allocate memory, %d."), GetLastError() )); } } else { DebugMsg((DM_WARNING, TEXT("GetNamespace: bad IWbemServices pointer."))); } return szNamespace; }
|