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.
632 lines
19 KiB
632 lines
19 KiB
|
|
//*************************************************************
|
|
//
|
|
// Resultant set of policy
|
|
//
|
|
// Microsoft Confidential
|
|
// Copyright (c) Microsoft Corporation 1995
|
|
// All rights reserved
|
|
//
|
|
// History: 15-July-2000 NishadM Created
|
|
//
|
|
//*************************************************************
|
|
|
|
#include "uenv.h"
|
|
#include <wbemcli.h>
|
|
#include "SmartPtr.h"
|
|
#include "WbemTime.h"
|
|
#include <strsafe.h>
|
|
|
|
//*************************************************************
|
|
//
|
|
// RsopSetPolicySettingStatus
|
|
//
|
|
// Purpose: Creates create instances of RSOP_PolicySettingStatus and
|
|
// links them to RSOP_PolicySetting
|
|
//
|
|
// Parameters:
|
|
// dwFlags - flags
|
|
// pServices - namespace
|
|
// pSettingInstance - instance of RSOP_PolicySetting
|
|
// nLinks - number of setting statuses
|
|
// pStatus - setting status information
|
|
//
|
|
// Returns: S_OK if successful
|
|
//
|
|
//*************************************************************
|
|
|
|
HRESULT
|
|
RsopSetPolicySettingStatus( DWORD,
|
|
IWbemServices* pServices,
|
|
IWbemClassObject* pSettingInstance,
|
|
DWORD nLinks,
|
|
POLICYSETTINGSTATUSINFO* pStatus )
|
|
{
|
|
HRESULT hr;
|
|
|
|
//
|
|
// validate arguments
|
|
//
|
|
if ( !pServices || !pSettingInstance || !nLinks || !pStatus )
|
|
{
|
|
DebugMsg( ( DM_WARNING, L"SetPolicySettingStatus: invalid arguments" ) );
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
//
|
|
// get the RSoP_PolicySettingStatus class
|
|
//
|
|
XBStr bstr = L"RSoP_PolicySettingStatus";
|
|
XInterface<IWbemClassObject> xClassStatus;
|
|
hr = pServices->GetObject( bstr,
|
|
WBEM_FLAG_RETURN_WBEM_COMPLETE,
|
|
0,
|
|
&xClassStatus,
|
|
0 );
|
|
if ( FAILED( hr ) )
|
|
{
|
|
DebugMsg( ( DM_WARNING, L"SetPolicySettingStatus: GetObject failed, 0x%x", hr ) );
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// spawn the RSoP_PolicySettingStatus instance
|
|
//
|
|
XInterface<IWbemClassObject> xInstStatus;
|
|
hr = xClassStatus->SpawnInstance( 0, &xInstStatus );
|
|
if ( FAILED (hr) )
|
|
{
|
|
DebugMsg( ( DM_WARNING, L"SetPolicySettingStatus: SpawnInstance failed, 0x%x", hr ) );
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// get the RSoP_PolicySettingLink class
|
|
//
|
|
XInterface<IWbemClassObject> xClassLink;
|
|
|
|
bstr = L"RSoP_PolicySettingLink";
|
|
hr = pServices->GetObject( bstr,
|
|
WBEM_FLAG_RETURN_WBEM_COMPLETE,
|
|
0,
|
|
&xClassLink,
|
|
0 );
|
|
if ( FAILED( hr ) )
|
|
{
|
|
DebugMsg( ( DM_WARNING, L"SetPolicySettingStatus: GetObject failed, 0x%x", hr ) );
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// spawn the RSoP_PolicySettingLink class
|
|
//
|
|
XInterface<IWbemClassObject> xInstLink;
|
|
hr = xClassLink->SpawnInstance( 0, &xInstLink );
|
|
if ( FAILED (hr) )
|
|
{
|
|
DebugMsg( ( DM_WARNING, L"SetPolicySettingStatus: SpawnInstance failed, 0x%x", hr ) );
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// get the class name of the instance
|
|
//
|
|
VARIANT varClass;
|
|
VariantInit( &varClass );
|
|
XVariant xVarClass(&varClass);
|
|
|
|
bstr = L"__CLASS";
|
|
hr = pSettingInstance->Get( bstr,
|
|
0,
|
|
xVarClass,
|
|
0,
|
|
0 );
|
|
if ( FAILED (hr) )
|
|
{
|
|
DebugMsg( ( DM_WARNING, L"SetPolicySettingStatus: Get __CLASS failed, 0x%x", hr ) );
|
|
return hr;
|
|
}
|
|
|
|
if ( varClass.vt == VT_NULL || varClass.vt == VT_EMPTY )
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
|
|
//
|
|
// get the [key] of the RSoP_PolicySetting instance
|
|
//
|
|
VARIANT varId;
|
|
VariantInit( &varId );
|
|
XVariant xVarId(&varId);
|
|
XBStr bstrid = L"id";
|
|
XBStr bstrPath = L"__RELPATH";
|
|
|
|
hr = pSettingInstance->Get( bstrPath,
|
|
0,
|
|
xVarId,
|
|
0,
|
|
0 );
|
|
if ( FAILED (hr) )
|
|
{
|
|
DebugMsg( ( DM_WARNING, L"SetPolicySettingStatus: Get id failed, 0x%x", hr ) );
|
|
return hr;
|
|
}
|
|
|
|
LPWSTR szSetting = varId.bstrVal;
|
|
|
|
//
|
|
// set the setting value
|
|
//
|
|
VARIANT var;
|
|
XBStr bstrVal;
|
|
XBStr bstrsetting = L"setting";
|
|
XBStr bstreventSource = L"eventSource";
|
|
XBStr bstreventLogName = L"eventLogName";
|
|
XBStr bstreventID = L"eventID";
|
|
XBStr bstreventTime = L"eventTime";
|
|
XBStr bstrstatus = L"status";
|
|
XBStr bstrerrorCode = L"errorCode";
|
|
|
|
//
|
|
// for each info.
|
|
//
|
|
for ( DWORD i = 0 ; i < nLinks ; i++ )
|
|
{
|
|
//
|
|
// RSoP_PolicySettingStatus
|
|
//
|
|
|
|
const DWORD dwGuidLength = 64;
|
|
WCHAR szGuid[dwGuidLength];
|
|
LPWSTR szPolicyStatusKey;
|
|
|
|
if ( !pStatus[i].szKey )
|
|
{
|
|
//
|
|
// caller did not specify a key. generate it.
|
|
//
|
|
GUID guid;
|
|
|
|
//
|
|
// create the [key]
|
|
//
|
|
hr = CoCreateGuid( &guid );
|
|
if ( FAILED(hr) )
|
|
{
|
|
DebugMsg( ( DM_WARNING, L"SetPolicySettingStatus: CoCreateGuid failed, 0x%x", hr ) );
|
|
return hr;
|
|
}
|
|
|
|
hr = StringCchPrintf( szGuid,
|
|
dwGuidLength,
|
|
L"{%08lX-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
|
|
guid.Data1,
|
|
guid.Data2,
|
|
guid.Data3,
|
|
guid.Data4[0], guid.Data4[1],
|
|
guid.Data4[2], guid.Data4[3],
|
|
guid.Data4[4], guid.Data4[5],
|
|
guid.Data4[6], guid.Data4[7] );
|
|
|
|
if(FAILED(hr))
|
|
return hr;
|
|
|
|
bstrVal = szPolicyStatusKey = szGuid;
|
|
if (!bstrVal)
|
|
{
|
|
DebugMsg( ( DM_WARNING, L"SetPolicySettingStatus: Could not allocate memory") );
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// caller specified a key. use it.
|
|
//
|
|
bstrVal = szPolicyStatusKey = pStatus[i].szKey;
|
|
if (!bstrVal)
|
|
{
|
|
DebugMsg( ( DM_WARNING, L"SetPolicySettingStatus: Could not allocate memory") );
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
}
|
|
|
|
var.vt = VT_BSTR;
|
|
var.bstrVal = bstrVal;
|
|
//
|
|
// set the id
|
|
//
|
|
hr = xInstStatus->Put( bstrid,
|
|
0,
|
|
&var,
|
|
0 );
|
|
if ( FAILED (hr) )
|
|
{
|
|
DebugMsg( ( DM_WARNING, L"SetPolicySettingStatus: Put id failed, 0x%x", hr ) );
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// set the eventSource
|
|
//
|
|
if ( pStatus[i].szEventSource )
|
|
{
|
|
var.vt = VT_BSTR;
|
|
bstrVal = pStatus[i].szEventSource;
|
|
var.bstrVal = bstrVal;
|
|
|
|
hr = xInstStatus->Put( bstreventSource,
|
|
0,
|
|
&var,
|
|
0 );
|
|
if ( FAILED (hr) )
|
|
{
|
|
DebugMsg( ( DM_WARNING, L"SetPolicySettingStatus: Put eventSource failed, 0x%x", hr ) );
|
|
return hr;
|
|
}
|
|
}
|
|
|
|
//
|
|
// set the eventLogName
|
|
//
|
|
if ( pStatus[i].szEventLogName )
|
|
{
|
|
var.vt = VT_BSTR;
|
|
bstrVal = pStatus[i].szEventLogName;
|
|
var.bstrVal = bstrVal;
|
|
|
|
hr = xInstStatus->Put( bstreventLogName,
|
|
0,
|
|
&var,
|
|
0 );
|
|
if ( FAILED (hr) )
|
|
{
|
|
DebugMsg( ( DM_WARNING, L"SetPolicySettingStatus: Put eventLogName failed, 0x%x", hr ) );
|
|
return hr;
|
|
}
|
|
}
|
|
|
|
//
|
|
// set the eventID
|
|
//
|
|
var.vt = VT_I4;
|
|
var.lVal = pStatus[i].dwEventID;
|
|
|
|
hr = xInstStatus->Put( bstreventID,
|
|
0,
|
|
&var,
|
|
0 );
|
|
if ( FAILED (hr) )
|
|
{
|
|
DebugMsg( ( DM_WARNING, L"SetPolicySettingStatus: Put eventID failed, 0x%x", hr ) );
|
|
return hr;
|
|
}
|
|
|
|
XBStr xTimeLogged;
|
|
|
|
//
|
|
// convert SYSTEMTIME to WBEM time
|
|
//
|
|
hr = SystemTimeToWbemTime( pStatus[i].timeLogged, xTimeLogged );
|
|
if ( FAILED (hr) )
|
|
{
|
|
DebugMsg( ( DM_WARNING, L"SetPolicySettingStatus: SystemTimeToWbemTime failed, 0x%x", hr ) );
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// set the eventTime
|
|
//
|
|
var.vt = VT_BSTR;
|
|
var.bstrVal = xTimeLogged;
|
|
|
|
hr = xInstStatus->Put( bstreventTime,
|
|
0,
|
|
&var,
|
|
0 );
|
|
if ( FAILED (hr) )
|
|
{
|
|
DebugMsg( ( DM_WARNING, L"SetPolicySettingStatus: Put eventTime failed, 0x%x", hr ) );
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// set the errorCode
|
|
//
|
|
var.vt = VT_I4;
|
|
var.lVal = pStatus[i].dwErrorCode;
|
|
|
|
hr = xInstStatus->Put( bstrerrorCode,
|
|
0,
|
|
&var,
|
|
0 );
|
|
if ( FAILED (hr) )
|
|
{
|
|
DebugMsg( ( DM_WARNING, L"SetPolicySettingStatus: Put errorCode failed, 0x%x", hr ) );
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// set the status
|
|
//
|
|
var.vt = VT_I4;
|
|
var.lVal = pStatus[i].status;
|
|
|
|
hr = xInstStatus->Put( bstrstatus,
|
|
0,
|
|
&var,
|
|
0 );
|
|
if ( FAILED (hr) )
|
|
{
|
|
DebugMsg( ( DM_WARNING, L"SetPolicySettingStatus: Put status failed, 0x%x", hr ) );
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// commit the RSOP_PolicySettingStatus
|
|
//
|
|
hr = pServices->PutInstance(xInstStatus,
|
|
WBEM_FLAG_CREATE_OR_UPDATE,
|
|
0,
|
|
0 );
|
|
if ( FAILED (hr) )
|
|
{
|
|
DebugMsg( ( DM_WARNING, L"SetPolicySettingStatus: PutInstance RSOP_PolicySettingStatus failed, 0x%x", hr ) );
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// RSoP_PolicySettingLink
|
|
//
|
|
|
|
var.vt = VT_BSTR;
|
|
bstrVal = szSetting;
|
|
if (!bstrVal)
|
|
{
|
|
DebugMsg(( DM_WARNING, L"SetPolicySettingStatus: Could not allocate memory"));
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
var.bstrVal = bstrVal;
|
|
|
|
hr = xInstLink->Put(bstrsetting,
|
|
0,
|
|
&var,
|
|
0);
|
|
if ( FAILED (hr) )
|
|
{
|
|
DebugMsg( ( DM_WARNING, L"SetPolicySettingStatus: Put setting failed, 0x%x", hr ) );
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// create the second key
|
|
//
|
|
const DWORD dwStatusLength = 96;
|
|
WCHAR szStatus[dwStatusLength];
|
|
|
|
//
|
|
// e.g. RSoP_PolicySettingStatus.id="{00000000-0000-0000-000000000000}"
|
|
//
|
|
hr = StringCchPrintf( szStatus, dwStatusLength, L"RSoP_PolicySettingStatus.id=\"%s\"", szPolicyStatusKey );
|
|
|
|
if( FAILED(hr) )
|
|
{
|
|
DebugMsg( ( DM_WARNING, L"SetPolicySettingStatus: StringCchPrintf failed, 0x%x", hr ) );
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// set the status
|
|
//
|
|
bstrVal = szStatus;
|
|
if (!bstrVal)
|
|
{
|
|
DebugMsg(( DM_WARNING, L"SetPolicySettingStatus: Could not allocate memory"));
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
var.bstrVal = bstrVal;
|
|
|
|
hr = xInstLink->Put(bstrstatus,
|
|
0,
|
|
&var,
|
|
0);
|
|
if ( FAILED (hr) )
|
|
{
|
|
DebugMsg( ( DM_WARNING, L"SetPolicySettingStatus: Put status failed, 0x%x", hr ) );
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// commit the RSOP_PolicySettingLink
|
|
//
|
|
hr = pServices->PutInstance(xInstLink,
|
|
WBEM_FLAG_CREATE_OR_UPDATE,
|
|
0,
|
|
0 );
|
|
if ( FAILED (hr) )
|
|
{
|
|
DebugMsg( ( DM_WARNING, L"SetPolicySettingStatus: PutInstance RSOP_PolicySettingLink failed, 0x%x", hr ) );
|
|
return hr;
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
//*************************************************************
|
|
//
|
|
// RsopResetPolicySettingStatus
|
|
//
|
|
// Purpose: Creates create instances of RSOP_PolicySettingStatus and
|
|
// links them to RSOP_PolicySetting
|
|
//
|
|
// Parameters:
|
|
// dwFlags - flags
|
|
// pServices - namespace
|
|
// pSettingInstance - instance of RSOP_PolicySetting
|
|
//
|
|
// Returns: S_OK if successful
|
|
//
|
|
//*************************************************************
|
|
|
|
#define RESET_QUERY_TEMPLATE L"REFERENCES OF {%s} WHERE ResultClass = RSOP_PolicySettingLink"
|
|
|
|
HRESULT
|
|
RsopResetPolicySettingStatus( DWORD,
|
|
IWbemServices* pServices,
|
|
IWbemClassObject* pSettingInstance )
|
|
{
|
|
// query for the RSOP_PolicySettingLink
|
|
// for every RSOP_PolicySettingLink query for the RSoP_PolicySettingLink.status
|
|
// delete the RSoP_PolicySettingStatus
|
|
// delete the RSOP_PolicySettingLink
|
|
|
|
if ( !pServices || !pSettingInstance )
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
//
|
|
// get the [key] of the RSoP_PolicySetting instance
|
|
//
|
|
VARIANT varId;
|
|
VariantInit( &varId );
|
|
XVariant xVarId(&varId);
|
|
XBStr bstrRelPath = L"__RELPATH";
|
|
|
|
HRESULT hr;
|
|
|
|
hr = pSettingInstance->Get( bstrRelPath,
|
|
0,
|
|
xVarId,
|
|
0,
|
|
0 );
|
|
if ( FAILED (hr) )
|
|
{
|
|
DebugMsg( ( DM_WARNING, L"RsopResetPolicySettingStatus: Get __RELPATH failed, 0x%x", hr ) );
|
|
return hr;
|
|
}
|
|
|
|
if ( varId.vt == VT_NULL || varId.vt == VT_EMPTY )
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
|
|
DWORD dwIdSize = wcslen(varId.bstrVal);
|
|
|
|
//
|
|
// Create a query for all references of the object
|
|
//
|
|
|
|
//
|
|
// Query template
|
|
//
|
|
|
|
DWORD dwQryLength = dwIdSize + lstrlen(RESET_QUERY_TEMPLATE) + 1;
|
|
XPtrLF<WCHAR> szQuery = LocalAlloc( LPTR, sizeof(WCHAR) * (dwQryLength) );
|
|
|
|
if ( !szQuery )
|
|
{
|
|
DebugMsg( ( DM_WARNING, L"RsopResetPolicySettingStatus: LocalAlloc failed, 0x%x", GetLastError() ) );
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
hr = StringCchPrintf( szQuery, dwQryLength, RESET_QUERY_TEMPLATE, varId.bstrVal );
|
|
|
|
if(FAILED(hr))
|
|
return hr;
|
|
|
|
XBStr bstrLanguage = L"WQL";
|
|
XBStr bstrQuery = szQuery;
|
|
XInterface<IEnumWbemClassObject> pEnum;
|
|
XBStr bstrPath = L"__PATH";
|
|
XBStr bstrStatus = L"status";
|
|
|
|
//
|
|
// search for RSOP_ExtensionEventSourceLink
|
|
//
|
|
hr = pServices->ExecQuery( bstrLanguage,
|
|
bstrQuery,
|
|
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_ENSURE_LOCATABLE | WBEM_FLAG_RETURN_IMMEDIATELY,
|
|
0,
|
|
&pEnum );
|
|
if ( SUCCEEDED( hr ) )
|
|
{
|
|
DWORD dwReturned;
|
|
|
|
do
|
|
{
|
|
XInterface<IWbemClassObject> xInst;
|
|
|
|
dwReturned = 0;
|
|
|
|
hr = pEnum->Next( WBEM_INFINITE,
|
|
1,
|
|
&xInst,
|
|
&dwReturned );
|
|
if ( SUCCEEDED( hr ) && dwReturned == 1 )
|
|
{
|
|
//
|
|
// delete RSoP_PolicySettingStatus
|
|
//
|
|
VARIANT varStatus;
|
|
VariantInit( &varStatus );
|
|
XVariant xVarStatus( &varStatus );
|
|
|
|
hr = xInst->Get(bstrStatus,
|
|
0,
|
|
&varStatus,
|
|
0,
|
|
0 );
|
|
if ( SUCCEEDED( hr ) )
|
|
{
|
|
hr = pServices->DeleteInstance( varStatus.bstrVal,
|
|
0L,
|
|
0,
|
|
0 );
|
|
if ( SUCCEEDED( hr ) )
|
|
{
|
|
//
|
|
// delete RSoP_PolicySettingLink
|
|
//
|
|
|
|
VARIANT varLink;
|
|
VariantInit( &varLink );
|
|
hr = xInst->Get(bstrPath,
|
|
0L,
|
|
&varLink,
|
|
0,
|
|
0 );
|
|
if ( SUCCEEDED(hr) )
|
|
{
|
|
XVariant xVarLink( &varLink );
|
|
|
|
hr = pServices->DeleteInstance( varLink.bstrVal,
|
|
0L,
|
|
0,
|
|
0 );
|
|
if ( FAILED( hr ) )
|
|
{
|
|
return hr;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
} while ( SUCCEEDED( hr ) && dwReturned == 1 );
|
|
}
|
|
|
|
if ( hr == S_FALSE )
|
|
{
|
|
hr = S_OK;
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
|