Windows2003-3790/termsrv/wmi/tscfgwmi/winstation.cpp
2020-09-30 16:53:55 +02:00

8672 lines
269 KiB
C++

/******************************************************************
Copyright (C) 2000 Microsoft Corp.
Terms.CPP -- WMI provider class implementation
Generated by Microsoft WMI Code Generation Engine
TO DO: - See individual function headers
- When linking, make sure you link to framedyd.lib &
msvcrtd.lib (debug) or framedyn.lib & msvcrt.lib (retail).
Description:
******************************************************************/
#include "stdafx.h"
#include <fwcommon.h> // This must be the first include.
#include "Winstation.h"
#include "registry.h"
#include "winsta.h"
#include "resource.h"
#include <regapi.h>
#include <sddl.h>
#include <provider.h>
#include <Iphlpapi.h>
#define ARRAYSIZE( rg ) sizeof( rg ) / sizeof( rg[0] )
#define GUID_LENGTH 40
TCHAR tchErrorMessage[ 80 ] = {0};
const static WCHAR* pErrorClass = L"\\\\.\\root\\cimv2:TerminalError";
#define TS_PATH_WINSTATION TEXT("SYSTEM\\CurrentControlSet\\Control\\Terminal Server\\Winstations\\")
//=--------------------
DWORD
GetUserSid(LPCTSTR pwszAccountName,
LPCTSTR pwszServerName,
PSID* ppUserSid)
{
DWORD cbSid = 0;
DWORD cbDomain = 0;
PSID pSID = NULL;
LPTSTR pszDomain = NULL;
BOOL bStatus;
DWORD dwStatus = ERROR_SUCCESS;
SID_NAME_USE seUse;
bStatus = LookupAccountName(pwszServerName,
pwszAccountName,
NULL,
&cbSid,
NULL,
&cbDomain,
&seUse);
if(!bStatus)
{
dwStatus = GetLastError();
if(dwStatus != ERROR_INSUFFICIENT_BUFFER)
{
goto Cleanup;
}
}
dwStatus = ERROR_SUCCESS;
pSID = (PSID)LocalAlloc(LMEM_FIXED, cbSid );
pszDomain = (LPTSTR)LocalAlloc(LMEM_FIXED, sizeof(TCHAR) * (cbDomain + 1));
if(pSID == NULL || pszDomain == NULL)
{
dwStatus = GetLastError();
goto Cleanup;
}
bStatus = LookupAccountName(pwszServerName,
pwszAccountName,
pSID,
&cbSid,
pszDomain,
&cbDomain,
&seUse);
if(!bStatus)
{
dwStatus = GetLastError();
goto Cleanup;
}
*ppUserSid = pSID;
pSID = NULL;
Cleanup:
if(pszDomain != NULL)
{
LocalFree(pszDomain);
}
if(pSID != NULL)
{
LocalFree(pSID);
}
return dwStatus;
}
/*****************************************************************************
*
* FUNCTION : CWin32_Terminal::CWin32_Terminal
*
* DESCRIPTION : Constructor
*
* INPUTS : none
*
* RETURNS : nothing
*
* COMMENTS : Calls the Provider constructor.
*
*****************************************************************************/
CWin32_Terminal::CWin32_Terminal (LPCWSTR lpwszName, LPCWSTR lpwszNameSpace ) : Provider( lpwszName, lpwszNameSpace )
{
int retval = 1;
if ( g_hInstance != NULL)
{
TRC2((TB, "CWin32_Terminal_ctor"));
_tcscpy(m_szEnableTerminal, _T("fEnableTerminal"));
_tcscpy(m_szTerminalName, _T("TerminalName"));
_tcscpy(m_szNewTerminalName, _T("NewTerminalName"));
_tcscpy(m_szEnable, _T("Enable"));
_tcscpy(m_szRename, _T("Rename"));
_tcscpy(m_szDelete, _T("Delete"));
}
}
//==================
/*****************************************************************************
*
* FUNCTION : CWin32_Terminal::~CWin32_Terminal
* DESCRIPTION : Destructor
* INPUTS : none
* RETURNS : nothing
*****************************************************************************/
CWin32_Terminal::~CWin32_Terminal ()
{
}
//==================
/*****************************************************************************
*
* FUNCTION : CWin32_Terminal::EnumerateInstances
*
* DESCRIPTION : Returns all the instances of this class.
*
* INPUTS : A pointer to the MethodContext for communication with WinMgmt.
* A long that contains the flags described in
* IWbemServices::CreateInstanceEnumAsync. Note that the following
* flags are handled by (and filtered out by) WinMgmt:
* WBEM_FLAG_DEEP, WBEM_FLAG_SHALLOW, WBEM_FLAG_RETURN_IMMEDIATELY,
* WBEM_FLAG_FORWARD_ONLY, WBEM_FLAG_BIDIRECTIONAL
*
* RETURNS : WBEM_S_NO_ERROR if successful
*
* COMMENTS : All instances on the machine are returned here and
* all properties that this class knows how to populate must
* be filled in. If there are no instances, return
* WBEM_S_NO_ERROR.
*****************************************************************************/
HRESULT CWin32_Terminal::EnumerateInstances (MethodContext* pMethodContext, long lFlags )
{
HRESULT hr = WBEM_S_NO_ERROR;
ULONG ulNum = 0;
ULONG ulSize = 0;
ULONG ulTerminals = 0;
PWS pWS = NULL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
hr = StackObj.m_pCfgComp->GetWinstationList(&ulTerminals, &ulSize, &pWS);
TRC2((TB,"Terminal@EnumerateInstances: GetWinstationList ret 0x%x" , hr ));
if( SUCCEEDED( hr ) && pWS != NULL )
{
for ( ulNum = 0; ulNum < ulTerminals && SUCCEEDED( hr ) ; ulNum++)
{
if(_tcsicmp(pWS[ulNum].Name, L"Console") == 0)
continue;
CInstance* pInstance = CreateNewInstance(pMethodContext);
if( pInstance == NULL)
{
ERR((TB,"Terminal@EnumerateInstances: CreateNewInstance failed"));
hr = WBEM_E_OUT_OF_MEMORY;
break;
}
hr = LoadPropertyValues( pInstance, BIT_ALL_PROPERTIES, &pWS[ ulNum ] );
if (SUCCEEDED( hr ) )
{
hr = pInstance->Commit();
}
pInstance->Release( );
}
}
if( pWS != NULL)
{
CoTaskMemFree(pWS);
}
return hr;
}
//=--------------------
/*****************************************************************************
*
* FUNCTION : CWin32_Terminal::GetObject
*
* DESCRIPTION : Find a single instance based on the key property, TerminalName.
*
* INPUTS : A pointer to a CInstance object containing the key properties.
* A long that contains the flags described in
* IWbemServices::GetObjectAsync.
*
* RETURNS : WBEM_S_NO_ERROR if the instance can be found
* WBEM_E_NOT_FOUND if the instance described by the key properties
* could not be found
* WBEM_E_FAILED if the instance could be found but another error
* occurred.
*
*****************************************************************************/
HRESULT CWin32_Terminal::GetObject ( CInstance* pInstance, long lFlags, CFrameworkQuery &Query )
{
HRESULT hr = WBEM_E_NOT_FOUND;
LONG lSize;
ULONGLONG ulRequiredProperties = 0;
PWS pWS = NULL;
CHString chTermName;
TRC2((TB,"TSCFGWMI!CWin32_Terminal_GetObject"));
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
if( pInstance == NULL )
{
ERR((TB,"Terminal@GetObject: invalid pointer" ));
return WBEM_E_ILLEGAL_NULL;
}
pInstance->GetCHString(m_szTerminalName, chTermName);
if( chTermName.GetLength() > WINSTATIONNAME_LENGTH)
{
return WBEM_E_VALUE_OUT_OF_RANGE;
}
if( chTermName.IsEmpty() != 0)
{
return WBEM_E_ILLEGAL_NULL;
}
if(_tcsicmp(chTermName, L"Console") == 0)
{
return WBEM_E_NOT_SUPPORTED;
}
if (Query.IsPropertyRequired(m_szTerminalName))
ulRequiredProperties |= BIT_TERMINALNAME;
if (Query.IsPropertyRequired(m_szEnableTerminal))
ulRequiredProperties |= BIT_FENABLETERMINAL;
hr = StackObj.m_pCfgComp->GetWSInfo( ( LPTSTR )( LPCTSTR )chTermName, &lSize, &pWS);
if( SUCCEEDED (hr) && pWS != NULL )
{
hr = LoadPropertyValues(pInstance, ulRequiredProperties, pWS);
}
else
{
hr = WBEM_E_INVALID_OBJECT;
}
if( pWS != NULL )
{
CoTaskMemFree(pWS);
}
return hr ;
}
//=--------------------
/*****************************************************************************
*
* FUNCTION : CWin32_Terminal::ExecQuery
*
* DESCRIPTION : You are passed a method context to use in the creation of
* instances that satisfy the query, and a CFrameworkQuery
* which describes the query. Create and populate all
* instances which satisfy the query. You may return more
* instances or more properties than are requested and WinMgmt
* will post filter out any that do not apply.
* There are two different ways query processing
* can be used to improve performance.
*
* Method 1 - Returns data for only those fields that were requested. This can
* optimize performance if some properties are very expensive to retrieve.
*
* Method 2 - Returns only the requested records in the "Where" clause. There is a method
* that can be run against the CFrameworkQuery object where you pass it the name
* of a property, and it will tell you all the values they requested. For example,
* if the query is of the form
* 'Select * from Win32_Terminal where TerminalName = "RDP-Tcp" or TerminalName = "ICA-Tcp"',
* GetValuesForProp(L"TerminalName") sends back an array that contains {"RDP-Tcp", "ICA-Tcp"}.
* Or if the query was of the form
* 'Select * from Win32_Terminal where TerminalName = "RDP-Tcp" AND fEnableTerminal = TRUE'
* (note that this query, unlike the one in the paragraph above, uses AND), then
* GetValuesForProp(L"TerminalName") will return {"RDP-Tcp"}.
*
*****************************************************************************/
HRESULT CWin32_Terminal::ExecQuery (MethodContext *pMethodContext, CFrameworkQuery& Query, long lFlags)
{
HRESULT hr = WBEM_E_NOT_FOUND;
ULONGLONG ulRequiredProperties = 0;
CHStringArray asNames;
ULONG ulNum = 0;
ULONG ulSize = 0;
ULONG ulTerminals = 0;
PWS pWS = NULL;
// Method 2
Query.GetValuesForProp(m_szTerminalName, asNames);
BOOL bGetAllInstances = asNames.GetSize() == 0;
// Method 1
if (Query.IsPropertyRequired(m_szTerminalName))
ulRequiredProperties |= BIT_TERMINALNAME;
if (Query.IsPropertyRequired(m_szEnableTerminal))
ulRequiredProperties |= BIT_FENABLETERMINAL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
hr = StackObj.m_pCfgComp->GetWinstationList(&ulTerminals, &ulSize, &pWS);
if( SUCCEEDED( hr ) && pWS != NULL )
{
for( ulNum = 0; ulNum < ulTerminals && SUCCEEDED( hr ) ; ulNum++)
{
if(_tcsicmp(pWS[ulNum].Name, L"Console") == 0)
{
continue;
}
// Method 2 - Check if the query CAN be processed by 'name'. If yes, return only those names.
if( bGetAllInstances || IsInList(asNames, pWS[ulNum].Name))
{
CInstance* pInstance = CreateNewInstance(pMethodContext);
if( pInstance != NULL)
{
pInstance->SetCHString(m_szTerminalName, CHString(pWS[ulNum].Name));
hr = LoadPropertyValues( pInstance, ulRequiredProperties, &pWS[ ulNum ] );
if( SUCCEEDED( hr ) )
{
hr = pInstance->Commit();
}
pInstance->Release();
}
}
}
}
if( pWS != NULL )
{
CoTaskMemFree(pWS);
}
return hr;
}
//=-----------
BOOL CWin32_Terminal::IsInList(const CHStringArray &asArray, LPCWSTR pszString)
{
DWORD dwSize = asArray.GetSize();
for (DWORD x=0; x < dwSize; x++)
{
if (asArray[x].CompareNoCase(pszString) == 0)
{
return TRUE;
}
}
return FALSE;
}
//=--------------------
/*****************************************************************************
*
* FUNCTION : CWin32_Terminal::PutInstance
*
* DESCRIPTION :
*
* INPUTS : A pointer to a CInstance object containing the key properties.
* A long that contains the flags described in
* IWbemServices::PutInstanceAsync.
*
* RETURNS : WBEM_E_PROVIDER_NOT_CAPABLE if PutInstance is not available
* WBEM_E_FAILED if there is an error delivering the instance
* WBEM_E_INVALID_PARAMETER if any of the instance properties
* are incorrect.
* WBEM_S_NO_ERROR if instance is properly delivered
*
* COMMENTS : TO DO: If you don't intend to support writing to your provider,
* or are creating a 'method only' provider, remove this
* method.
*
*****************************************************************************/
HRESULT CWin32_Terminal::PutInstance ( const CInstance &Instance, long lFlags)
{
/*
HRESULT hr = WBEM_S_NO_ERROR;
DWORD dwfEnable = 0;
CHString chTermName;
ULONG ulTerminals = 0;
ULONG ulSize = 0;
ULONG ulNum = 0;
PWS pWS = NULL;
static USERCONFIG g_uc;
static ASYNCCONFIG g_ac;
if( g_pCfgComp == NULL )
{
ERR((TB,"Terminal@PutInstance: invalid interface" ));
return WBEM_E_INITIALIZATION_FAILURE;
}
Instance.GetDWORD(m_szEnableTerminal, dwfEnable);
if ( dwfEnable != 0 && dwfEnable !=1 )
{
return WBEM_E_INVALID_PARAMETER;
}
Instance.GetCHString(m_szTerminalName, chTermName);
if(chTermName.GetLength( ) > WINSTATIONNAME_LENGTH)
{
return WBEM_E_VALUE_OUT_OF_RANGE;
}
if(chTermName.IsEmpty() != 0)
{
return WBEM_E_ILLEGAL_NULL;
}
hr = g_pCfgComp->ForceUpdate();
if( SUCCEEDED( hr ))
{
hr = g_pCfgComp->GetWinstationList(&ulTerminals, &ulSize, &pWS);
}
do
{
if( SUCCEEDED( hr ) && pWS != NULL )
{
for ( ulNum = 0; ulNum < ulTerminals ; ulNum++)
{
if( _tcsicmp( (LPCTSTR) &pWS[ulNum].Name, (LPTSTR)(LPCTSTR) chTermName) == 0)
{
hr = g_pCfgComp->EnableWinstation( (LPTSTR) (LPCTSTR) chTermName, dwfEnable);
break;
}
}
if( ulNum >= ulTerminals )
{
ULONG ulSize = 0;
lstrcpy( pWS->Name, (LPTSTR)(LPCTSTR)chTermName);
pWS->fEnableWinstation = 1;
pWS->uMaxInstanceCount = 0xffffffff;
lstrcpy( pWS->Comment, L"");
lstrcpy( pWS->pdName, L"tcp");
lstrcpy( pWS->wdName, L"Microsoft RDP 5.1");
pWS->PdClass = 2;
pWS->LanAdapter = 0;
RegDefaultUserConfigQuery( NULL ,
&g_uc,
sizeof( USERCONFIG ) ,
&ulSize );
hr = g_pCfgComp->CreateNewWS( *pWS, sizeof( USERCONFIG ) , &g_uc, NULL);
TRC2((TB,"Terminal@PutInstance: CreateNewWS returned 0x%x\n", hr));
}
}
if( FAILED( hr ) )
{
CHString sRelPath;
Instance.GetCHString(L"__RelPath", sRelPath);
CInstance *pErrorInstance = NULL;
CWbemProviderGlue::GetInstanceByPath(pErrorClass, &pErrorInstance);
if( pErrorInstance != NULL )
{
LoadString( g_hInstance , IDS_ERR_PUTTERMINAL, tchErrorMessage, SIZE_OF_BUFFER(tchErrorMessage) );
pErrorInstance->SetWCHARSplat(L"Description", tchErrorMessage);
LoadString( g_hInstance , IDS_ERR_PUTINSTANCE, tchErrorMessage, SIZE_OF_BUFFER(tchErrorMessage) );
pErrorInstance->SetWCHARSplat(L"Operation", tchErrorMessage);
pErrorInstance->SetCHString(L"ParameterInfo", sRelPath);
pErrorInstance->SetWCHARSplat(L"ProviderName", PROVIDER_NAME_Win32_WIN32_TERMINAL_Prov);
pErrorInstance->SetDWORD(L"StatusCode", WBEM_E_INVALID_PARAMETER);
pErrorInstance->SetCHString(L"TerminalName", chTermName );
IWbemClassObject *pObj = pErrorInstance->GetClassObjectInterface();
MethodContext *pMethodContext = Instance.GetMethodContext();
if( pObj != NULL )
{
if (pMethodContext != NULL)
{
pMethodContext->SetStatusObject(pObj);
}
pObj->Release();
}
pErrorInstance->Release();
}
}
}while (0);
if( pWS != NULL )
{
CoTaskMemFree(pWS);
}
return hr;
*/
return WBEM_E_PROVIDER_NOT_CAPABLE;
}
//=----------------------------------------------------------------------------------------------------------
HRESULT CWin32_Terminal::DeleteInstance ( const CInstance &Instance, long lFlags )
{
return WBEM_E_PROVIDER_NOT_CAPABLE;
/*
HRESULT hr = WBEM_E_NOT_FOUND;
CHString chTermName;
if( g_pCfgComp == NULL )
{
return WBEM_E_INITIALIZATION_FAILURE;
}
Instance.GetCHString(m_szTerminalName, chTermName);
if( chTermName.GetLength( ) > WINSTATIONNAME_LENGTH)
{
return WBEM_E_VALUE_OUT_OF_RANGE;
}
if (chTermName.IsEmpty() != 0)
{
return WBEM_E_ILLEGAL_NULL;
}
hr = g_pCfgComp->DeleteWS((LPTSTR)(LPCTSTR) chTermName);
TRC2((TB,"Terminal@ExecMethod: Delete returned 0x%x\n" , hr ));
return hr;
*/
}
//=----------------------------------------------------------------------------------------------------------
HRESULT CWin32_Terminal::ExecMethod ( const CInstance& Inst,
const BSTR bstrMethodName,
CInstance *pInParams,
CInstance *pOutParams,
long lFlags)
{
HRESULT hr = WBEM_E_NOT_FOUND;
CHString chTermName;
ICfgComp *pCfgComp = NULL;
if( pInParams == NULL)
{
return WBEM_E_INVALID_METHOD_PARAMETERS;
}
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
Inst.GetCHString(m_szTerminalName, chTermName);
if( chTermName.GetLength( ) > WINSTATIONNAME_LENGTH)
{
return WBEM_E_VALUE_OUT_OF_RANGE;
}
if (chTermName.IsEmpty() != 0)
{
return WBEM_E_ILLEGAL_NULL;
}
if(_tcsicmp(chTermName, L"Console")== 0 )
{
return WBEM_E_NOT_SUPPORTED;
}
if( _wcsicmp(bstrMethodName, m_szEnable ) == 0 )
{
// Enables or Disables the Terminal.
// Return Value: 0 if Success or an error.
// uint32 Enable ([In] Boolean fEnable)
DWORD dwfEnable = 0;
ULONG Size = 0;
bool bRet;
bRet = pInParams->GetDWORD(m_szEnableTerminal, dwfEnable);
if ( !bRet || ( dwfEnable != 0 && dwfEnable != 1 ) )
{
return WBEM_E_INVALID_METHOD_PARAMETERS;
}
hr = StackObj.m_pCfgComp->EnableWinstation( (LPTSTR)(LPCTSTR) chTermName, dwfEnable);
TRC2((TB,"Terminal@ExecMethod: Enable returned 0x%x\n" , hr ));
if( SUCCEEDED( hr ) )
{
hr = StackObj.m_pCfgComp->ForceUpdate();
}
if( SUCCEEDED( hr ) && pOutParams != NULL )
{
pOutParams->SetDWORD(L"ReturnValue", WBEM_S_NO_ERROR);
}
}
else if( _wcsicmp( bstrMethodName , m_szRename ) == 0 )
{
// Renames the Terminal.
// uint32 Rename([In] string NewTerminalName)
CHString chNewTermName;
pInParams->GetCHString(m_szNewTerminalName, chNewTermName);
if ( chNewTermName.GetLength() > WINSTATIONNAME_LENGTH)
{
return WBEM_E_VALUE_OUT_OF_RANGE;
}
if ( chNewTermName.IsEmpty() != 0)
{
return WBEM_E_ILLEGAL_NULL;
}
hr = StackObj.m_pCfgComp->RenameWinstation((LPTSTR)(LPCTSTR) chTermName, (LPTSTR)(LPCTSTR) chNewTermName);
TRC2((TB,"Terminal@ExecMethod: Rename returned 0x%x\n" , hr ));
if( SUCCEEDED( hr ) )
{
hr = StackObj.m_pCfgComp->ForceUpdate();
}
if (SUCCEEDED (hr) && pOutParams != NULL )
{
pOutParams->SetDWORD(L"ReturnValue", WBEM_S_NO_ERROR);
}
}
else if (_wcsicmp(bstrMethodName, m_szDelete) == 0)
{
// Delete the Terminal.
// uint32 Delete() ;
hr = StackObj.m_pCfgComp->DeleteWS((LPTSTR)(LPCTSTR) chTermName);
TRC2((TB,"Terminal@ExecMethod: Delete returned 0x%x\n" , hr ));
if ( SUCCEEDED (hr) && pOutParams != NULL )
{
pOutParams->SetDWORD(L"ReturnValue", WBEM_S_NO_ERROR);
}
else
{
return WBEM_E_INVALID_METHOD_PARAMETERS;
}
}
else
{
hr = WBEM_E_INVALID_METHOD;
}
TRC2((TB,"Terminal@ExecMethod: Delete returned 0x%x\n" , hr ));
return hr;
}
//=--------------------
HRESULT CWin32_Terminal::LoadPropertyValues( CInstance *pInstance, ULONGLONG ulRequiredProperties, PWS pWS)
{
if( pInstance == NULL )
{
TRC2((TB,"Terminal@LoadPropertyValues: invalid pointer" ));
return WBEM_E_ILLEGAL_NULL;
}
if( ulRequiredProperties & BIT_TERMINALNAME)
{
pInstance->SetCharSplat(m_szTerminalName, pWS->Name);
}
if( ulRequiredProperties & BIT_FENABLETERMINAL)
{
pInstance->SetDWORD(m_szEnableTerminal, pWS->fEnableWinstation);
}
return S_OK;
}
//------------------------------
CWin32_TSGeneralSetting::CWin32_TSGeneralSetting (LPCWSTR lpwszName, LPCWSTR lpwszNameSpace ) :
Provider( lpwszName, lpwszNameSpace )
{
if ( g_hInstance != NULL)
{
TRC2((TB, "CWin32_TSGeneralSetting_ctor"));
_tcscpy(m_szTerminalProtocol, _T("TerminalProtocol"));
_tcscpy(m_szTransport, _T("Transport"));
_tcscpy(m_szComment, _T("Comment"));
_tcscpy(m_szWindowsAuthentication, _T("WindowsAuthentication"));
_tcscpy(m_szEncryptionLevel, _T("MinEncryptionLevel"));
_tcscpy(m_szTerminalName, _T("TerminalName"));
_tcscpy(m_szSetEncryptionLevel, _T("SetEncryptionLevel"));
}
RegGetMachinePolicy(&m_gpPolicy);
}
//=--------------------
CWin32_TSGeneralSetting::~CWin32_TSGeneralSetting ()
{
}
//=---------------------
BOOL CWin32_TSGeneralSetting::IsInList(const CHStringArray &asArray, LPCWSTR pszString)
{
DWORD dwSize = asArray.GetSize();
for (DWORD x=0; x < dwSize; x++)
{
if (asArray[x].CompareNoCase(pszString) == 0)
{
return TRUE;
}
}
return FALSE;
}
//=--------------------
HRESULT CWin32_TSGeneralSetting::GetObject ( CInstance* pInstance, long lFlags, CFrameworkQuery &Query )
{
HRESULT hr = WBEM_E_NOT_FOUND;
LONG lSize;
ULONGLONG ulRequiredProperties = 0;
PWS pWS = NULL;
CHString chTermName;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
if( pInstance == NULL )
{
ERR((TB,"TSGeneralSetting@GetObject: invalid pointer" ));
return WBEM_E_ILLEGAL_NULL;
}
pInstance->GetCHString(m_szTerminalName, chTermName);
if( chTermName.GetLength() > WINSTATIONNAME_LENGTH )
{
return WBEM_E_VALUE_OUT_OF_RANGE;
}
if( chTermName.IsEmpty() != 0 )
{
return WBEM_E_ILLEGAL_NULL;
}
if(_tcsicmp(chTermName, L"Console") == 0)
{
return WBEM_E_NOT_SUPPORTED;
}
if (Query.IsPropertyRequired(m_szTerminalName))
ulRequiredProperties |= BIT_TERMINALNAME;
if (Query.IsPropertyRequired(m_szComment))
ulRequiredProperties |= BIT_COMMENT;
if (Query.IsPropertyRequired(m_szEncryptionLevel))
ulRequiredProperties |= BIT_ENCRYPTIONLEVEL;
if (Query.IsPropertyRequired(m_szTerminalProtocol))
ulRequiredProperties |= BIT_TERMINALPROTOCOL;
if (Query.IsPropertyRequired(m_szTransport))
ulRequiredProperties |= BIT_TRANSPORT;
if (Query.IsPropertyRequired(m_szWindowsAuthentication))
ulRequiredProperties |= BIT_WINDOWSAUTHENTICATION;
hr = StackObj.m_pCfgComp->GetWSInfo( (LPTSTR) (LPCTSTR) chTermName, &lSize, &pWS);
TRC2((TB,"TSGeneralSetting@GetObject: returned 0x%x\n" , hr ));
if( SUCCEEDED( hr ) && (pWS != NULL) )
{
hr = LoadPropertyValues(pInstance, ulRequiredProperties, pWS );
if( !(SUCCEEDED( hr )) )
{
hr = WBEM_E_INVALID_OBJECT;
}
}
else
{
hr = WBEM_E_INVALID_OBJECT;
}
if( pWS != NULL )
{
CoTaskMemFree(pWS);
}
return hr ;
}
//=--------------------
/*****************************************************************************
*
* FUNCTION : CWin32_TSGeneralSetting::EnumerateInstances
*
* DESCRIPTION : Returns all the instances of this class.
*
* INPUTS : A pointer to the MethodContext for communication with WinMgmt.
* A long that contains the flags described in
* IWbemServices::CreateInstanceEnumAsync. Note that the following
* flags are handled by (and filtered out by) WinMgmt:
* WBEM_FLAG_DEEP, WBEM_FLAG_SHALLOW, WBEM_FLAG_RETURN_IMMEDIATELY,
* WBEM_FLAG_FORWARD_ONLY, WBEM_FLAG_BIDIRECTIONAL
*
* RETURNS : WBEM_S_NO_ERROR if successful
*
* COMMENTS : All instances on the machine are returned here and
* all properties that this class knows how to populate must
* be filled in. If there are no instances, return
* WBEM_S_NO_ERROR.
*****************************************************************************/
HRESULT CWin32_TSGeneralSetting::EnumerateInstances (MethodContext* pMethodContext, long lFlags )
{
HRESULT hr = WBEM_S_NO_ERROR;
ULONG ulNum = 0;
ULONG ulSize = 0;
ULONG ulTerminals = 0;
PWS pWS = NULL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
hr = StackObj.m_pCfgComp->GetWinstationList(&ulTerminals, &ulSize, &pWS);
if( SUCCEEDED( hr ) && pWS != NULL )
{
for ( ulNum = 0; ulNum < ulTerminals && SUCCEEDED( hr ) ; ulNum++)
{
if(_tcsicmp(pWS[ulNum].Name, L"Console") == 0)
{
continue;
}
CInstance* pInstance = CreateNewInstance(pMethodContext);
if( pInstance == NULL)
{
ERR((TB,"TSGeneralSetting@EnumerateInstances: CreateNewInstance failed" ));
hr = WBEM_E_OUT_OF_MEMORY;
break;
}
TRC2((TB,"TSGeneralSetting@EnumerateInstances: GetWinstationList ret 0x%x\n" , hr ));
hr = LoadPropertyValues(pInstance, BIT_ALL_PROPERTIES, &pWS[ ulNum ] );
if( SUCCEEDED( hr ) )
{
hr = pInstance->Commit();
}
pInstance->Release( );
}
}
if( pWS != NULL )
{
CoTaskMemFree(pWS);
}
return hr;
}
//=----------------------------------------------------------------------------------------------------------
HRESULT CWin32_TSGeneralSetting::ExecMethod ( const CInstance& Inst,
const BSTR bstrMethodName,
CInstance *pInParams,
CInstance *pOutParams,
long lFlags)
{
HRESULT hr = WBEM_E_NOT_FOUND;
CHString chTermName;
PUSERCONFIG pUser = NULL;
LONG lSize;
OSVERSIONINFOW OsVersionInfo;
OsVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW);
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
Inst.GetCHString(m_szTerminalName, chTermName);
if( chTermName.GetLength( ) > WINSTATIONNAME_LENGTH)
{
return WBEM_E_VALUE_OUT_OF_RANGE;
}
if (chTermName.IsEmpty() != 0)
{
return WBEM_E_ILLEGAL_NULL;
}
if(_tcsicmp(chTermName, L"Console") == 0)
{
return WBEM_E_NOT_SUPPORTED;
}
if( _wcsicmp(bstrMethodName, m_szSetEncryptionLevel ) == 0 )
{
// Sets the EncryptionLevel to one of Low, Medium or High.
// uint32 SetEncryptionLevel ([In] uint32 EncryptionLevel)
DWORD dwData = 0 ;
DWORD dwStatus = 0;
ULONG Size = 0;
bool bRet;
RegGetMachinePolicy(&m_gpPolicy);
do
{
if( pInParams != NULL )
{
bRet = pInParams->GetDWORD(m_szEncryptionLevel, dwData);
TRC2((TB,"m_gpPolicy.fPolicyMinEncryptionLevel ret 0x%x\n", m_gpPolicy.fPolicyMinEncryptionLevel));
if( m_gpPolicy.fPolicyMinEncryptionLevel == 0 )
{
TRC2((TB,"Condition to update fPolicyMinEncryptionLevel satisfied"));
hr = StackObj.m_pCfgComp->GetUserConfig( (LPTSTR)(LPCTSTR) chTermName, &lSize, &pUser, TRUE);
if( SUCCEEDED( hr ) && pUser != NULL )
{
if( GetVersionEx( &OsVersionInfo))
{
if( OsVersionInfo.dwMajorVersion == 5 && OsVersionInfo.dwMinorVersion == 0)
{
if( dwData < 1 || dwData > 3)
{
hr = WBEM_E_INVALID_PARAMETER;
break;
}
pUser->MinEncryptionLevel = dwData;
hr = StackObj.m_pCfgComp->SetUserConfig( (LPTSTR) (LPCTSTR) chTermName, lSize, pUser , &dwStatus );
if( SUCCEEDED( hr ))
{
hr = StackObj.m_pCfgComp->ForceUpdate();
}
}
else
{
if( dwData < 1 || dwData > 4)
{
hr = WBEM_E_INVALID_PARAMETER;
break;
}
pUser->MinEncryptionLevel = dwData;
hr = StackObj.m_pCfgComp->SetUserConfig( (LPTSTR) (LPCTSTR) chTermName, lSize, pUser , &dwStatus );
if( SUCCEEDED( hr ))
{
hr = StackObj.m_pCfgComp->ForceUpdate();
}
}
}
}
}
else
{
hr = WBEM_E_INVALID_OPERATION;
break;
}
TRC2((TB,"TSGeneralSetting@ExecMethod: SetEncryptionLevel returned 0x%x\n" , hr));
}
else
{
hr = WBEM_E_INVALID_METHOD_PARAMETERS;
}
}while (0);
if (pUser != NULL)
{
CoTaskMemFree (pUser);
}
}
else
{
hr = WBEM_E_INVALID_METHOD;
}
return hr;
}
//=--------------------
HRESULT CWin32_TSGeneralSetting::ExecQuery (MethodContext *pMethodContext, CFrameworkQuery& Query, long lFlags)
{
HRESULT hr = WBEM_E_NOT_FOUND;
ULONGLONG ulRequiredProperties = 0;
CHStringArray asNames;
ULONG ulNum = 0;
ULONG ulSize = 0;
ULONG ulTerminals = 0;
PWS pWS = NULL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
// Method 2
Query.GetValuesForProp(m_szTerminalName, asNames);
BOOL bGetAllInstances = asNames.GetSize() == 0;
// Method 1
if (Query.IsPropertyRequired(m_szTerminalName))
ulRequiredProperties |= BIT_TERMINALNAME;
if (Query.IsPropertyRequired(m_szComment))
ulRequiredProperties |= BIT_COMMENT;
if (Query.IsPropertyRequired(m_szEncryptionLevel))
ulRequiredProperties |= BIT_ENCRYPTIONLEVEL;
if (Query.IsPropertyRequired(m_szTerminalProtocol))
ulRequiredProperties |= BIT_TERMINALPROTOCOL;
if (Query.IsPropertyRequired(m_szTransport))
ulRequiredProperties |= BIT_TRANSPORT;
if (Query.IsPropertyRequired(m_szWindowsAuthentication))
ulRequiredProperties |= BIT_WINDOWSAUTHENTICATION;
hr = StackObj.m_pCfgComp->GetWinstationList(&ulTerminals, &ulSize, &pWS);
if( SUCCEEDED( hr ) && pWS != NULL )
{
for ( ulNum = 0; ulNum < ulTerminals && SUCCEEDED( hr ) ; ulNum++)
{
if(_tcsicmp(pWS[ulNum].Name, L"Console") == 0)
{
continue;
}
if( bGetAllInstances || IsInList(asNames, pWS[ulNum].Name))
{
CInstance* pInstance = CreateNewInstance(pMethodContext);
if( pInstance == NULL)
{
ERR((TB,"TSGeneralSetting@ExecQuery: CreateNewInstance failed"));
hr = WBEM_E_OUT_OF_MEMORY;
break;
}
pInstance->SetCHString(m_szTerminalName, CHString(pWS[ulNum].Name));
hr = LoadPropertyValues( pInstance, ulRequiredProperties, &pWS[ ulNum ] );
if( SUCCEEDED( hr ) )
{
hr = pInstance->Commit();
}
pInstance->Release();
}
}
}
if( pWS != NULL )
{
CoTaskMemFree(pWS);
}
return hr;
}
//=----------
HRESULT CWin32_TSGeneralSetting::LoadPropertyValues( CInstance *pInstance, ULONGLONG ulRequiredProperties, PWS pWS)
{
HRESULT hr = WBEM_S_NO_ERROR;
ULONG ulTerminals = 0;
ULONG ulNumPd = 0;
ULONG ulSize = 0;
LONG lSize = 0;
PUSERCONFIG pUser = NULL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
if( pInstance == NULL )
{
ERR((TB,"TSGeneralSetting@LoadPropertyValues: invalid pointer"));
return WBEM_E_ILLEGAL_NULL;
}
if( ulRequiredProperties & BIT_TERMINALNAME)
{
pInstance->SetCharSplat(m_szTerminalName, pWS->Name);
}
TRC2((TB,"TSGeneralSetting@LoadPropertyValues: GetTerminalName"));
if( pWS != NULL )
{
if( ulRequiredProperties & BIT_TERMINALPROTOCOL )
{
pInstance->SetWCHARSplat(m_szTerminalProtocol, pWS->wdName);
TRC2((TB,"TSGeneralSetting@LoadPropertyValues: GetTerminalProtocol"));
}
if( ulRequiredProperties & BIT_TRANSPORT)
{
pInstance->SetWCHARSplat(m_szTransport, pWS->pdName);
TRC2((TB,"TSGeneralSetting@LoadPropertyValues: GetTransportTypes"));
}
if( ulRequiredProperties & BIT_COMMENT )
{
pInstance->SetWCHARSplat(m_szComment, pWS->Comment);
TRC2((TB,"TSGeneralSetting@LoadPropertyValues: GetComment"));
}
hr = StackObj.m_pCfgComp->GetUserConfig(pWS->Name, &lSize, &pUser, TRUE);
if(( ulRequiredProperties & BIT_WINDOWSAUTHENTICATION) && ( SUCCEEDED(hr) ) && pUser != NULL)
{
pInstance->SetDWORD(m_szWindowsAuthentication, pUser->fUseDefaultGina);
TRC2((TB,"TSGeneralSetting@LoadPropertyValues: GetComment ret 0x%x\n" , hr));
}
if(( ulRequiredProperties & BIT_ENCRYPTIONLEVEL) && ( SUCCEEDED (hr) ) && pUser != NULL)
{
RegGetMachinePolicy(&m_gpPolicy);
if( m_gpPolicy.fPolicyMinEncryptionLevel != 0 )
{
pInstance->SetDWORD(m_szEncryptionLevel, m_gpPolicy.MinEncryptionLevel );
}
else
{
pInstance->SetDWORD(m_szEncryptionLevel, pUser->MinEncryptionLevel);
}
TRC2((TB,"TSGeneralSetting@LoadPropertyValues: GetEncryptionLevel ret 0x%x\n" , hr));
}
}
if ( pUser != NULL )
{
CoTaskMemFree(pUser);
}
return hr;
}
//=--------------------
HRESULT CWin32_TSGeneralSetting::PutInstance ( const CInstance &Instance, long lFlags)
{
HRESULT hr= WBEM_S_NO_ERROR;
DWORD dwData = 0;
DWORD dwStatus = 0;
ULONG ulSize = 0;
LONG lSize = 0;
CHString chTermName;
CHString chData;
PUSERCONFIG pUser = NULL;
PWS pWS = NULL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
Instance.GetCHString(m_szTerminalName, chTermName);
if(chTermName.GetLength() > WINSTATIONNAME_LENGTH)
{
return WBEM_E_VALUE_OUT_OF_RANGE;
}
if( chTermName.IsEmpty() != 0)
{
return WBEM_E_ILLEGAL_NULL;
}
if(_tcsicmp(chTermName, L"Console") == 0)
{
return WBEM_E_NOT_SUPPORTED;
}
hr = StackObj.m_pCfgComp->GetWSInfo((LPTSTR)(LPCTSTR) chTermName, &lSize, &pWS);
do
{
if (SUCCEEDED ( hr ) && pWS != NULL)
{
hr = StackObj.m_pCfgComp->GetUserConfig( (LPTSTR)(LPCTSTR) chTermName, &lSize, &pUser, TRUE);
if(SUCCEEDED (hr) && pUser != NULL )
{
Instance.GetCHString(m_szTerminalProtocol, chData);
if (chData.GetLength() > WINSTATIONNAME_LENGTH )
{
hr = WBEM_E_VALUE_OUT_OF_RANGE;
break;
}
wcscpy(pWS->wdName, (LPTSTR) (LPCTSTR) chData);
Instance.GetCHString(m_szTransport, chData);
if (chData.GetLength() > WINSTATIONNAME_LENGTH )
{
hr = WBEM_E_VALUE_OUT_OF_RANGE;
break;
}
wcscpy(pWS->pdName, (LPTSTR)(LPCTSTR) chData);
Instance.GetCHString(m_szComment, chData);
if ( chData.GetLength() > WINSTATIONCOMMENT_LENGTH )
{
hr = WBEM_E_VALUE_OUT_OF_RANGE;
break;
}
wcscpy(pWS->Comment, (LPTSTR) (LPCTSTR) chData);
Instance.GetDWORD(m_szWindowsAuthentication, dwData);
if (dwData != 0 && dwData != 1)
{
hr = WBEM_E_INVALID_PARAMETER;
break;
}
pUser->fUseDefaultGina = dwData;
hr = StackObj.m_pCfgComp->SetUserConfig( (LPTSTR) (LPCTSTR) chTermName, lSize, pUser , &dwStatus );
TRC2((TB,"TSGeneralSetting@PutInstance: SetUserConfig ret 0x%x\n" , dwStatus));
hr = StackObj.m_pCfgComp->UpDateWS( pWS, (DWORD)BIT_ALL_PROPERTIES , &dwStatus, TRUE );
TRC2((TB,"TSGeneralSetting@PutInstance: UpdateWS ret 0x%x\n" , dwStatus));
if( SUCCEEDED( hr ))
{
hr = StackObj.m_pCfgComp->ForceUpdate();
}
}
else
{
CHString sRelPath;
Instance.GetCHString(L"__RelPath", sRelPath);
CInstance *pErrorInstance = NULL;
TRC2((TB,"TSGeneralSetting@PutInstance: ret 0x%x\n" , hr));
if( SUCCEEDED( hr ) )
{
if (pErrorInstance != NULL)
{
LoadString( g_hInstance , IDS_ERR_PUTTSGCONFIG, tchErrorMessage, SIZE_OF_BUFFER(tchErrorMessage) );
pErrorInstance->SetWCHARSplat(L"Description", tchErrorMessage);
LoadString( g_hInstance , IDS_ERR_PUTINSTANCE, tchErrorMessage, SIZE_OF_BUFFER(tchErrorMessage) );
pErrorInstance->SetWCHARSplat(L"Operation", tchErrorMessage);
pErrorInstance->SetCHString(L"ParameterInfo", sRelPath);
pErrorInstance->SetWCHARSplat(L"ProviderName", PROVIDER_NAME_Win32_WIN32_TSGENERALSETTING_Prov);
pErrorInstance->SetDWORD(L"StatusCode", WBEM_E_INVALID_PARAMETER);
IWbemClassObject *pObj = pErrorInstance->GetClassObjectInterface();
if (pObj != NULL)
{
MethodContext *pMethodContext = Instance.GetMethodContext();
if (pMethodContext != NULL)
pMethodContext->SetStatusObject(pObj);
pObj->Release();
}
pErrorInstance->Release();
}
}
TRC2((TB,"TSGeneralSetting@PutInstance: ret 0x%x\n" , hr));
}
}
}while (0);
if ( pUser != NULL )
{
CoTaskMemFree(pUser);
}
if ( pWS != NULL )
{
CoTaskMemFree(pWS);
}
return hr;
}
//=-------------------------------------------------------
CWin32_TSLogonSetting::CWin32_TSLogonSetting (LPCWSTR lpwszName, LPCWSTR lpwszNameSpace ) :
Provider( lpwszName, lpwszNameSpace )
{
if ( g_hInstance != NULL)
{
TRC2((TB, "CWin32_TSLogonSetting_ctor"));
_tcscpy(m_szClientLogonInfoPolicy, _T("ClientLogonInfoPolicy"));
_tcscpy(m_szPromptForPassword, _T("PromptForPassword"));
_tcscpy(m_szUserName, _T("UserName"));
_tcscpy(m_szDomain, _T("Domain"));
_tcscpy(m_szPassword, _T("Password"));
_tcscpy(m_szTerminalName, _T("TerminalName"));
_tcscpy(m_szExplicitLogon, _T("ExplicitLogon"));
_tcscpy(m_szSetPromptForPassword, _T("SetPromptForPassword"));
}
RegGetMachinePolicy(&m_gpPolicy);
}
//=--------------------
CWin32_TSLogonSetting::~CWin32_TSLogonSetting ()
{
}
//=------------
BOOL CWin32_TSLogonSetting::IsInList(const CHStringArray &asArray, LPCWSTR pszString)
{
DWORD dwSize = asArray.GetSize();
for (DWORD x=0; x < dwSize; x++)
{
if (asArray[x].CompareNoCase(pszString) == 0)
{
return TRUE;
}
}
return FALSE;
}
//=--------------------
HRESULT CWin32_TSLogonSetting::GetObject ( CInstance* pInstance, long lFlags, CFrameworkQuery &Query )
{
HRESULT hr = WBEM_E_NOT_FOUND;
PWS pWS = NULL;
LONG lSize;
ULONGLONG ulRequiredProperties = 0;
CHString chTermName;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
if( pInstance == NULL )
{
TRC2((TB,"TSLogonSetting@GetObject: invalid pointer"));
return WBEM_E_ILLEGAL_NULL;
}
pInstance->GetCHString(m_szTerminalName, chTermName);
if(chTermName.GetLength() > WINSTATIONNAME_LENGTH)
{
return WBEM_E_VALUE_OUT_OF_RANGE;
}
if(chTermName.IsEmpty() != 0)
{
return WBEM_E_ILLEGAL_NULL;
}
if(_tcsicmp(chTermName, L"Console") == 0)
{
return WBEM_E_NOT_SUPPORTED;
}
if (Query.IsPropertyRequired(m_szTerminalName))
ulRequiredProperties |= BIT_TERMINALNAME;
if (Query.IsPropertyRequired(m_szClientLogonInfoPolicy))
ulRequiredProperties |= BIT_CLIENTLOGONINFOPOLICY;
if (Query.IsPropertyRequired(m_szDomain))
ulRequiredProperties |= BIT_DOMAIN;
if (Query.IsPropertyRequired(m_szPromptForPassword))
ulRequiredProperties |= BIT_PROMPTFORPASSWORD;
if (Query.IsPropertyRequired(m_szUserName))
ulRequiredProperties |= BIT_USERNAME;
if ( pInstance != NULL )
{
hr = StackObj.m_pCfgComp->GetWSInfo((LPTSTR)(LPCTSTR) chTermName, &lSize, &pWS);
if( SUCCEEDED( hr ) && pWS != NULL )
{
hr = LoadPropertyValues(pInstance, ulRequiredProperties, pWS );
}
}
if ( pWS != NULL )
{
CoTaskMemFree(pWS);
}
return hr;
}
//=--------------------
/*****************************************************************************
*
* FUNCTION : CWin32_TSLogonSetting::EnumerateInstances
*
* DESCRIPTION : Returns all the instances of this class.
*
* INPUTS : A pointer to the MethodContext for communication with WinMgmt.
* A long that contains the flags described in
* IWbemServices::CreateInstanceEnumAsync. Note that the following
* flags are handled by (and filtered out by) WinMgmt:
* WBEM_FLAG_DEEP, WBEM_FLAG_SHALLOW, WBEM_FLAG_RETURN_IMMEDIATELY,
* WBEM_FLAG_FORWARD_ONLY, WBEM_FLAG_BIDIRECTIONAL
*
* RETURNS : WBEM_S_NO_ERROR if successful
*
* COMMENTS : All instances on the machine are returned here and
* all properties that this class knows how to populate must
* be filled in. If there are no instances, return
* WBEM_S_NO_ERROR.
*****************************************************************************/
HRESULT CWin32_TSLogonSetting::EnumerateInstances (MethodContext* pMethodContext, long lFlags )
{
HRESULT hr = WBEM_S_NO_ERROR;
ULONG ulTerminals = 0;
LONG ulNum = 0;
ULONG ulSize = 0;
PWS pWS = NULL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
hr = StackObj.m_pCfgComp->GetWinstationList(&ulTerminals, &ulSize, &pWS);
if( SUCCEEDED( hr ) && pWS != NULL )
{
for ( ulNum = 0; ulNum < ulTerminals && SUCCEEDED( hr ) ; ulNum++)
{
if(_tcsicmp(pWS[ulNum].Name, L"Console") == 0)
continue;
CInstance* pInstance = CreateNewInstance(pMethodContext);
if( pInstance == NULL)
{
ERR ((TB,"TSLogonSetting@EnumerateInstances: CreateNewInstance failed"));
hr = WBEM_E_OUT_OF_MEMORY;
break;
}
TRC2((TB,"TSLogonSetting@EnumerateInstances: GetWinstationList ret 0x%x\n" , hr));
hr = LoadPropertyValues(pInstance, BIT_ALL_PROPERTIES, &pWS[ulNum] );
if( SUCCEEDED( hr ) )
{
hr = pInstance->Commit();
}
pInstance->Release();
}
}
if( pWS != NULL )
{
CoTaskMemFree(pWS);
}
return hr;
}
//=--------------------
//=------@resume here
HRESULT CWin32_TSLogonSetting::LoadPropertyValues( CInstance *pInstance, ULONGLONG ulRequiredProperties, PWS pWS)
{
HRESULT hr = WBEM_S_NO_ERROR;
ULONG ulTerminals = 0;
ULONG ulSize = 0;
LONG lSize = 0;
USERCONFIGW* pUser = NULL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
if( pInstance == NULL )
{
ERR((TB,"TSLogonSetting@LoadPropertyValues: invalid pointer" ));
return WBEM_E_ILLEGAL_NULL;
}
if( ulRequiredProperties & BIT_TERMINALNAME)
{
pInstance->SetCharSplat(m_szTerminalName, pWS->Name);
}
TRC2((TB,"TSLogonSetting@LoadPropertyValues: GetTerminalName" ));
hr = StackObj.m_pCfgComp->GetUserConfig(pWS->Name, &lSize, &pUser, TRUE);
TRC2((TB,"TSLogonSetting@LoadPropertyValues ret 0x%x\n" , hr ));
if ( SUCCEEDED (hr) && pUser != NULL )
{
if( ulRequiredProperties & BIT_CLIENTLOGONINFOPOLICY)
{
pInstance->SetDWORD(m_szClientLogonInfoPolicy, pUser->fInheritAutoLogon);
}
TRC2((TB,"TSLogonSetting@LoadPropertyValues: ClientLogonInfoPolicy" ));
if( ulRequiredProperties & BIT_PROMPTFORPASSWORD)
{
RegGetMachinePolicy(&m_gpPolicy);
if( m_gpPolicy.fPolicyPromptForPassword != 0 )
{
pInstance->SetDWORD(m_szPromptForPassword, m_gpPolicy.fPromptForPassword);
}
else
{
pInstance->SetDWORD(m_szPromptForPassword, pUser->fPromptForPassword);
}
}
TRC2((TB,"TSLogonSetting@LoadPropertyValues: PromptForPassword" ));
if( ulRequiredProperties & BIT_USERNAME)
{
pInstance->SetWCHARSplat(m_szUserName, pUser->UserName);
}
TRC2((TB,"TSLogonSetting@LoadPropertyValues: UserName" ));
if( ulRequiredProperties & BIT_DOMAIN)
{
pInstance->SetWCHARSplat(m_szDomain, pUser->Domain);
}
TRC2((TB,"TSLogonSetting@LoadPropertyValues: Domain" ));
}
if ( pUser != NULL )
{
CoTaskMemFree(pUser);
}
return hr;
}
//=--------------------
HRESULT CWin32_TSLogonSetting::PutInstance ( const CInstance &Instance, long lFlags)
{
HRESULT hr= WBEM_S_NO_ERROR;
DWORD dwData = 0;
CHString chTermName;
DWORD dwStatus = 0;
LONG lSize;
PUSERCONFIG pUser = NULL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
Instance.GetCHString(m_szTerminalName, chTermName);
if( chTermName.GetLength() > WINSTATIONNAME_LENGTH )
{
return WBEM_E_VALUE_OUT_OF_RANGE;
}
if( chTermName.IsEmpty() != 0 )
{
return WBEM_E_ILLEGAL_NULL;
}
if(_tcsicmp(chTermName, L"Console") == 0)
{
return WBEM_E_NOT_SUPPORTED;
}
hr = StackObj.m_pCfgComp->GetUserConfig((LPTSTR)(LPCTSTR) chTermName, &lSize, &pUser, TRUE);
do
{
if( SUCCEEDED( hr ) && pUser != NULL )
{
Instance.GetDWORD(m_szClientLogonInfoPolicy, dwData);
if( dwData != 0 && dwData != 1 )
{
hr = WBEM_E_INVALID_PARAMETER;
break;
}
pUser->fInheritAutoLogon = dwData;
hr = StackObj.m_pCfgComp->SetUserConfig( (LPTSTR)(LPCTSTR) chTermName, lSize, pUser , &dwStatus );
if( SUCCEEDED( hr ) )
{
hr = StackObj.m_pCfgComp->ForceUpdate();
}
}
else
{
TRC2((TB,"TSLogonSetting@PutInstance ret 0x%x\n" , hr ));
CHString sRelPath;
Instance.GetCHString(L"__RelPath", sRelPath);
CInstance *pErrorInstance = NULL;
hr = CWbemProviderGlue::GetInstanceByPath(pErrorClass, &pErrorInstance );
if( SUCCEEDED( hr ))
{
TRC2((TB,"TSLogonSetting@PutInstance: GetInstanceByPath ret 0x%x\n" , hr ));
if( pErrorInstance != NULL )
{
LoadString( g_hInstance , IDS_ERR_PUTTSLCONFIG, tchErrorMessage, SIZE_OF_BUFFER(tchErrorMessage) );
pErrorInstance->SetWCHARSplat(L"Description", tchErrorMessage);
LoadString( g_hInstance , IDS_ERR_PUTINSTANCE, tchErrorMessage, SIZE_OF_BUFFER(tchErrorMessage) );
pErrorInstance->SetWCHARSplat(L"Operation", tchErrorMessage);
pErrorInstance->SetCHString(L"ParameterInfo", sRelPath);
pErrorInstance->SetWCHARSplat(L"ProviderName", PROVIDER_NAME_Win32_WIN32_TSLOGONSETTING_Prov);
pErrorInstance->SetDWORD(L"StatusCode", WBEM_E_INVALID_PARAMETER);
IWbemClassObject *pObj = pErrorInstance->GetClassObjectInterface();
if( pObj != NULL )
{
MethodContext *pMethodContext = Instance.GetMethodContext();
if( pMethodContext != NULL )
{
pMethodContext->SetStatusObject(pObj);
}
pObj->Release();
}
pErrorInstance->Release();
}
}
}
}while (0);
if( pUser != NULL )
{
CoTaskMemFree(pUser);
}
return hr;
}
//=--------------------
HRESULT CWin32_TSLogonSetting::ExecMethod ( const CInstance& Inst,
const BSTR bstrMethodName,
CInstance *pInParams,
CInstance *pOutParams,
long lFlags)
{
HRESULT hr = WBEM_E_NOT_FOUND;
PUSERCONFIG pUser = NULL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
if( pInParams == NULL)
{
return WBEM_E_INVALID_METHOD_PARAMETERS;
}
// Sets the properties UserName, Password and Domain which specify
// the credentials explicitly to be used for authentication.
// uint32 ExplicitLogon([In] string UserName, [In] string Domain, [In] string Password)
if (_wcsicmp(bstrMethodName, m_szExplicitLogon) == 0)
{
DWORD dwData = 0;
DWORD dwStatus = 0;
CHString chData;
CHString chTermName;
LONG lSize;
Inst.GetCHString(m_szTerminalName, chTermName);
if( chTermName.GetLength( ) > WINSTATIONNAME_LENGTH )
{
return WBEM_E_VALUE_OUT_OF_RANGE;
}
if( chTermName.IsEmpty() != 0)
{
return WBEM_E_ILLEGAL_NULL;
}
if(_tcsicmp(chTermName, L"Console") == 0)
{
return WBEM_E_NOT_SUPPORTED;
}
hr = StackObj.m_pCfgComp->GetUserConfig( (LPTSTR) (LPCTSTR) chTermName , &lSize, &pUser, TRUE);
do
{
if( SUCCEEDED( hr ) && pUser != NULL )
{
dwData = pUser->fInheritAutoLogon;
if( dwData == 0 )
{
chData.Empty();
pInParams->GetCHString( m_szUserName, chData );
if( chData.GetLength() > USERNAME_LENGTH )
{
hr = WBEM_E_VALUE_OUT_OF_RANGE;
break;
}
wcscpy(pUser->UserName, (LPTSTR) (LPCTSTR) chData);
chData.Empty();
pInParams->GetCHString( m_szDomain, chData );
if( chData.GetLength() > APPSERVERNAME_LENGTH )
{
hr = WBEM_E_VALUE_OUT_OF_RANGE;
break;
}
wcscpy(pUser->Domain, (LPTSTR) (LPCTSTR) chData);
chData.Empty();
pInParams->GetCHString( m_szPassword, chData );
if( chData.GetLength() > PASSWORD_LENGTH )
{
hr = WBEM_E_VALUE_OUT_OF_RANGE;
break;
}
wcscpy( pUser->Password, (LPTSTR) (LPCTSTR) chData );
hr = StackObj.m_pCfgComp->SetUserConfig( (LPTSTR) (LPCTSTR) chTermName, lSize, pUser , &dwStatus );
if( SUCCEEDED (hr) && pOutParams != NULL )
{
StackObj.m_pCfgComp->ForceUpdate();
pOutParams->SetDWORD(L"ReturnValue", WBEM_S_NO_ERROR);
TRC2((TB,"TSLogonSetting@ExecMethod: ExplicitLogon ret 0x%x\n" , hr ));
}
}
else
{
hr = WBEM_E_INVALID_OPERATION;
break;
}
}
}while(0);
}
else if( _wcsicmp( bstrMethodName, m_szSetPromptForPassword ) == 0 )
{
DWORD dwData = 0;
DWORD dwStatus = 0;
CHString chTermName;
LONG lSize;
bool bRet;
Inst.GetCHString(m_szTerminalName, chTermName);
if( chTermName.GetLength( ) > WINSTATIONNAME_LENGTH )
{
return WBEM_E_VALUE_OUT_OF_RANGE;
}
if( chTermName.IsEmpty() != 0)
{
return WBEM_E_ILLEGAL_NULL;
}
if(_tcsicmp(chTermName, L"Console") == 0)
{
return WBEM_E_NOT_SUPPORTED;
}
hr = StackObj.m_pCfgComp->GetUserConfig( (LPTSTR)(LPCTSTR) chTermName, &lSize, &pUser, TRUE);
RegGetMachinePolicy(&m_gpPolicy);
do
{
if( SUCCEEDED (hr) && pInParams != NULL && pUser != NULL )
{
bRet = pInParams->GetDWORD( m_szPromptForPassword, dwData );
if( ( m_gpPolicy.fPolicyPromptForPassword == 0) && bRet != 0 )
{
if( dwData != 0 && dwData != 1 )
{
hr = WBEM_E_INVALID_METHOD_PARAMETERS;
break;
}
pUser->fPromptForPassword = dwData;
hr = StackObj.m_pCfgComp->SetUserConfig( (LPTSTR)(LPCTSTR) chTermName, lSize, pUser , &dwStatus );
if ( SUCCEEDED (hr) && pOutParams != NULL )
{
StackObj.m_pCfgComp->ForceUpdate();
pOutParams->SetDWORD(L"ReturnValue", WBEM_S_NO_ERROR);
TRC2((TB,"TSLogonSetting@ExecMethod: PromptForPassword ret 0x%x\n" , hr ));
}
}
else
{
hr = WBEM_E_INVALID_OPERATION;
break;
}
}
} while (0);
}
else
{
hr = WBEM_E_INVALID_METHOD;
}
if ( pUser != NULL )
{
CoTaskMemFree(pUser);
}
return hr;
}
//=----------------------------
HRESULT CWin32_TSLogonSetting::ExecQuery (MethodContext *pMethodContext, CFrameworkQuery& Query, long lFlags)
{
HRESULT hr = WBEM_E_NOT_FOUND;
ULONGLONG ulRequiredProperties = 0;
CHStringArray asNames;
ULONG ulNum = 0;
ULONG ulSize = 0;
ULONG ulTerminals = 0;
PWS pWS = NULL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
// Method 2
Query.GetValuesForProp(m_szTerminalName, asNames);
BOOL bGetAllInstances = asNames.GetSize() == 0;
// Method 1
if (Query.IsPropertyRequired(m_szTerminalName))
ulRequiredProperties |= BIT_TERMINALNAME;
if (Query.IsPropertyRequired(m_szClientLogonInfoPolicy))
ulRequiredProperties |= BIT_CLIENTLOGONINFOPOLICY;
if (Query.IsPropertyRequired(m_szDomain))
ulRequiredProperties |= BIT_DOMAIN;
if (Query.IsPropertyRequired(m_szPromptForPassword))
ulRequiredProperties |= BIT_PROMPTFORPASSWORD;
if (Query.IsPropertyRequired(m_szUserName))
ulRequiredProperties |= BIT_USERNAME;
hr = StackObj.m_pCfgComp->GetWinstationList(&ulTerminals, &ulSize, &pWS);
if( SUCCEEDED( hr ) && pWS != NULL )
{
for( ulNum = 0; ulNum < ulTerminals && SUCCEEDED( hr ) ; ulNum++ )
{
if(_tcsicmp(pWS[ulNum].Name, L"Console") == 0)
continue;
// Method 2 - Check to see if the query CAN be processed by 'name', if so,
// only return those names.
if( bGetAllInstances || IsInList(asNames, pWS[ulNum].Name) )
{
CInstance* pInstance = CreateNewInstance(pMethodContext);
if( pInstance == NULL )
{
ERR( (TB,"TSLogonSetting@ExecQuery: CreateNewInstance failed" ) );
hr = WBEM_E_OUT_OF_MEMORY;
break;
}
pInstance->SetCHString( m_szTerminalName, CHString(pWS[ulNum].Name) );
hr = LoadPropertyValues( pInstance, ulRequiredProperties, &pWS[ ulNum ] );
if( SUCCEEDED( hr ) )
{
hr = pInstance->Commit();
}
pInstance->Release();
}
}
}
if( pWS != NULL )
{
CoTaskMemFree(pWS);
}
return hr;
}
//=--------------------Win32_TSSessionSettingsConfig------------------------
CWin32_TSSessionSetting::CWin32_TSSessionSetting (LPCWSTR lpwszName, LPCWSTR lpwszNameSpace ) :
Provider( lpwszName, lpwszNameSpace )
{
if ( g_hInstance != NULL)
{
TRC2((TB, "CWin32_TSSessionSetting_ctor"));
_tcscpy(m_szTimeLimitPolicy, _T("TimeLimitPolicy"));
_tcscpy(m_szActiveSessionLimit, _T("ActiveSessionLimit"));
_tcscpy(m_szDisconnectedSessionLimit, _T("DisconnectedSessionLimit"));
_tcscpy(m_szIdleSessionLimit, _T("IdleSessionLimit"));
_tcscpy(m_szBrokenConnectionPolicy, _T("BrokenConnectionPolicy"));
_tcscpy(m_szReconnectionPolicy, _T("ReconnectionPolicy"));
_tcscpy(m_szBrokenConnectionAction, _T("BrokenConnectionAction"));
_tcscpy(m_szSessionLimitType, _T("SessionLimitType"));
_tcscpy(m_szValueLimit, _T("ValueLimit"));
_tcscpy(m_szTerminalName, _T("TerminalName"));
_tcscpy(m_szTimeLimit, _T("TimeLimit"));
_tcscpy(m_szBrokenConnection, _T("BrokenConnection"));
}
}
//=--------------------
CWin32_TSSessionSetting::~CWin32_TSSessionSetting ()
{
}
//=-----------------
BOOL CWin32_TSSessionSetting::IsInList(const CHStringArray &asArray, LPCWSTR pszString)
{
DWORD dwSize = asArray.GetSize();
for (DWORD x=0; x < dwSize; x++)
{
if (asArray[x].CompareNoCase(pszString) == 0)
{
return TRUE;
}
}
return FALSE;
}
//=--------------------
HRESULT CWin32_TSSessionSetting::GetObject ( CInstance* pInstance, long lFlags, CFrameworkQuery &Query )
{
HRESULT hr = WBEM_E_NOT_FOUND;
ULONGLONG ulRequiredProperties = 0;
DWORD dwData = 0;
CHString chTermName;
LONG lSize ;
// PUSERCONFIG pUser = NULL;
PWS pWS = NULL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
if( pInstance == NULL )
{
ERR((TB,"TSSessionSetting@GetObject: invalid pointer" ));
return WBEM_E_ILLEGAL_NULL;
}
pInstance->GetCHString(m_szTerminalName, chTermName);
if( chTermName.GetLength() > WINSTATIONNAME_LENGTH )
{
return WBEM_E_VALUE_OUT_OF_RANGE;
}
if(chTermName.IsEmpty() != 0)
{
return WBEM_E_ILLEGAL_NULL;
}
if(_tcsicmp(chTermName, L"Console") == 0)
{
return WBEM_E_NOT_SUPPORTED;
}
if (Query.IsPropertyRequired(m_szTerminalName))
ulRequiredProperties |= BIT_TERMINALNAME;
if (Query.IsPropertyRequired(m_szTimeLimitPolicy))
ulRequiredProperties |= BIT_ACTIVESESSIONPOLICY;
if (Query.IsPropertyRequired(m_szBrokenConnectionPolicy))
ulRequiredProperties |= BIT_BROKENCONNECTIONPOLICY;
if (Query.IsPropertyRequired(m_szActiveSessionLimit))
ulRequiredProperties |= BIT_ACTIVESESSIONLIMIT;
if (Query.IsPropertyRequired(m_szBrokenConnectionAction))
ulRequiredProperties |= BIT_BROKENCONNECTIONACTION;
if (Query.IsPropertyRequired(m_szDisconnectedSessionLimit))
ulRequiredProperties |= BIT_DISCONNECTEDSESSIONLIMIT;
if (Query.IsPropertyRequired(m_szIdleSessionLimit))
ulRequiredProperties |= BIT_IDLESESSIONLIMIT;
if (Query.IsPropertyRequired(m_szReconnectionPolicy))
ulRequiredProperties |= BIT_RECONNECTIONPOLICY;
hr = StackObj.m_pCfgComp->GetWSInfo((LPTSTR)(LPCTSTR) chTermName, &lSize, &pWS);
if ( pInstance != NULL && SUCCEEDED( hr ) && pWS != NULL )
{
hr = LoadPropertyValues(pInstance, ulRequiredProperties, pWS );
}
if ( pWS != NULL )
{
CoTaskMemFree(pWS);
}
return hr;
}
//=--------------------
/*****************************************************************************
*
* FUNCTION : CWin32_TSSessionSetting::EnumerateInstances
*
* DESCRIPTION : Returns all the instances of this class.
*
* INPUTS : A pointer to the MethodContext for communication with WinMgmt.
* A long that contains the flags described in
* IWbemServices::CreateInstanceEnumAsync. Note that the following
* flags are handled by (and filtered out by) WinMgmt:
* WBEM_FLAG_DEEP, WBEM_FLAG_SHALLOW, WBEM_FLAG_RETURN_IMMEDIATELY,
* WBEM_FLAG_FORWARD_ONLY, WBEM_FLAG_BIDIRECTIONAL
*
* RETURNS : WBEM_S_NO_ERROR if successful
*
* COMMENTS : All instances on the machine are returned here and
* all properties that this class knows how to populate must
* be filled in. If there are no instances, return
* WBEM_S_NO_ERROR.
*****************************************************************************/
HRESULT CWin32_TSSessionSetting::EnumerateInstances (MethodContext* pMethodContext, long lFlags )
{
HRESULT hr = WBEM_S_NO_ERROR;
ULONG ulTerminals = 0;
ULONG ulNum = 0;
ULONG ulSize = 0;
LONG lSize = 0;
PWS pWS = NULL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
hr = StackObj.m_pCfgComp->GetWinstationList(&ulTerminals, &ulSize, &pWS);
if( SUCCEEDED( hr ) && pWS != NULL )
{
for ( ulNum = 0; ulNum < ulTerminals && SUCCEEDED( hr ) ; ulNum++)
{
if(_tcsicmp(pWS[ulNum].Name, L"Console") == 0)
continue;
CInstance* pInstance = CreateNewInstance(pMethodContext);
if( pInstance == NULL)
{
ERR((TB,"TSSessionSetting@EnumerateInstances: CreateNewInstance failed" ));
hr = WBEM_E_OUT_OF_MEMORY;
break;
}
TRC2((TB,"TSSessionSetting@EnumerateInstances: GetWinstationList ret 0x%x\n" , hr ));
hr = LoadPropertyValues(pInstance, BIT_ALL_PROP, &pWS[ulNum] );
if( SUCCEEDED( hr ) )
{
hr = pInstance->Commit();
}
pInstance->Release( );
}
}
if( pWS != NULL )
{
CoTaskMemFree(pWS);
}
return hr;
}
//=--------------------
HRESULT CWin32_TSSessionSetting::LoadPropertyValues( CInstance *pInstance, ULONGLONG ulRequiredProperties, PWS pWS)
{
HRESULT hr = WBEM_S_NO_ERROR;
LONG lSize ;
DWORD dwData = 0;
USERCONFIGW* pUser = NULL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
if( pInstance == NULL )
{
ERR((TB,"TSSessionSetting@LoadPropertyValues: invalid pointer" ));
return WBEM_E_ILLEGAL_NULL;
}
if ( pInstance != NULL && pWS != NULL )
{
if( ulRequiredProperties & BIT_TERMINALNAME)
{
pInstance->SetCharSplat(m_szTerminalName, pWS->Name);
}
RegGetMachinePolicy(&m_gpPolicy);
hr = StackObj.m_pCfgComp->GetUserConfig(pWS->Name, &lSize, &pUser, TRUE);
TRC2((TB,"TSSessionSetting@LoadPropertyValues: GetUserConfig ret 0x%x\n" , hr ));
if ( SUCCEEDED (hr) && pUser != NULL )
{
if( ulRequiredProperties & BIT_ACTIVESESSIONPOLICY)
{
pInstance->SetDWORD(m_szTimeLimitPolicy, pUser->fInheritMaxSessionTime);
}
TRC2((TB,"TSSessionSetting@LoadPropertyValues: TimeLimitPolicy" ));
if( ulRequiredProperties & BIT_ACTIVESESSIONLIMIT)
{
if( m_gpPolicy.fPolicyMaxSessionTime != 0 )
{
pInstance->SetDWORD(m_szActiveSessionLimit, m_gpPolicy.MaxConnectionTime);
}
else
{
pInstance->SetDWORD(m_szActiveSessionLimit, pUser->MaxConnectionTime);
}
}
TRC2((TB,"TSSessionSetting@LoadPropertyValues: MaxConnectionTime" ));
if( ulRequiredProperties & BIT_DISCONNECTEDSESSIONLIMIT)
{
if( m_gpPolicy.fPolicyMaxDisconnectionTime != 0 )
{
pInstance->SetDWORD(m_szDisconnectedSessionLimit, m_gpPolicy.MaxDisconnectionTime);
}
else
{
pInstance->SetDWORD(m_szDisconnectedSessionLimit, pUser->MaxDisconnectionTime);
}
}
TRC2((TB,"TSSessionSetting@LoadPropertyValues: MaxDisconnectionTime" ));
if( ulRequiredProperties & BIT_IDLESESSIONLIMIT)
{
if( m_gpPolicy.fPolicyMaxIdleTime != 0 )
{
pInstance->SetDWORD(m_szIdleSessionLimit, m_gpPolicy.MaxIdleTime);
}
else
{
pInstance->SetDWORD(m_szIdleSessionLimit, pUser->MaxIdleTime);
}
}
TRC2((TB,"TSSessionSetting@LoadPropertyValues: MaxIdleTime" ));
if( ulRequiredProperties & BIT_BROKENCONNECTIONPOLICY)
{
pInstance->SetDWORD(m_szBrokenConnectionPolicy, pUser->fInheritResetBroken);
}
TRC2((TB,"TSSessionSetting@LoadPropertyValues: BrokenConnectionPolicy" ));
if( ulRequiredProperties & BIT_BROKENCONNECTIONACTION)
{
if( m_gpPolicy.fPolicyResetBroken != 0 )
{
pInstance->SetDWORD(m_szBrokenConnectionAction, m_gpPolicy.fResetBroken);
}
else
{
pInstance->SetDWORD(m_szBrokenConnectionAction, pUser->fResetBroken);
}
}
TRC2((TB,"TSSessionSetting@LoadPropertyValues: BrokenConnectionAction" ));
if( ulRequiredProperties & BIT_RECONNECTIONPOLICY)
{
pInstance->SetDWORD(m_szReconnectionPolicy, pUser->fInheritReconnectSame);
}
TRC2((TB,"TSSessionSetting@LoadPropertyValues: ReconnectionPolicy" ));
}
}
if ( pUser != NULL )
{
CoTaskMemFree(pUser);
}
return hr;
}
//=--------------------
HRESULT CWin32_TSSessionSetting::PutInstance ( const CInstance &Instance, long lFlags)
{
HRESULT hr= WBEM_S_NO_ERROR;
CHString chTermName ;
DWORD dwData = 0;
DWORD dwStatus = 0;
LONG lSize;
USERCONFIGW* pUser = NULL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
Instance.GetCHString(m_szTerminalName, chTermName);
if(chTermName.GetLength() > WINSTATIONNAME_LENGTH)
{
return WBEM_E_VALUE_OUT_OF_RANGE;
}
if( chTermName.IsEmpty() != 0)
{
return WBEM_E_ILLEGAL_NULL;
}
if(_tcsicmp(chTermName, L"Console") == 0)
{
return WBEM_E_NOT_SUPPORTED;
}
hr = StackObj.m_pCfgComp->GetUserConfig((LPTSTR) (LPCTSTR) chTermName, &lSize, &pUser, TRUE);
do
{
if( SUCCEEDED( hr ) && pUser != NULL )
{
Instance.GetDWORD(m_szTimeLimitPolicy, dwData);
if (dwData != 0 && dwData != 1 )
{
hr = WBEM_E_INVALID_PARAMETER;
break;
}
pUser->fInheritMaxSessionTime = dwData;
pUser->fInheritMaxDisconnectionTime = dwData;
pUser->fInheritMaxIdleTime = dwData;
Instance.GetDWORD( m_szBrokenConnectionPolicy, dwData );
if( dwData != 0 && dwData != 1 )
{
hr = WBEM_E_INVALID_PARAMETER;
break;
}
pUser->fInheritResetBroken = dwData;
Instance.GetDWORD( m_szReconnectionPolicy, dwData );
if (dwData != 0 && dwData != 1 )
{
hr = WBEM_E_INVALID_PARAMETER;
break;
}
pUser->fInheritReconnectSame = dwData;
hr = StackObj.m_pCfgComp->SetUserConfig( (LPTSTR) (LPCTSTR) chTermName, lSize, pUser , &dwStatus );
TRC2((TB,"TSSessionSetting@PutInstance: SetUserConfig ret 0x%x\n" , dwStatus ));
if( SUCCEEDED( hr ))
{
hr = StackObj.m_pCfgComp->ForceUpdate();
}
}
else
{
ERR((TB,"TSSessionSetting@PutInstance: Failed" ));
CHString sRelPath;
Instance.GetCHString(L"__RelPath", sRelPath);
CInstance *pErrorInstance = NULL;
hr = CWbemProviderGlue::GetInstanceByPath(pErrorClass, &pErrorInstance );
if( SUCCEEDED( hr ) )
{
TRC2((TB,"TSSessionSetting@PutInstance: GetInstanceByPath succeeded" ));
if (pErrorInstance != NULL)
{
LoadString( g_hInstance , IDS_ERR_PUTTSSCONFIG, tchErrorMessage, SIZE_OF_BUFFER(tchErrorMessage) );
pErrorInstance->SetWCHARSplat(L"Description", tchErrorMessage);
LoadString( g_hInstance , IDS_ERR_PUTINSTANCE, tchErrorMessage, SIZE_OF_BUFFER(tchErrorMessage) );
pErrorInstance->SetWCHARSplat(L"Operation", tchErrorMessage);
pErrorInstance->SetCHString(L"ParameterInfo", sRelPath);
pErrorInstance->SetWCHARSplat(L"ProviderName", PROVIDER_NAME_Win32_WIN32_TSSESSIONSETTING_Prov);
pErrorInstance->SetDWORD(L"StatusCode", WBEM_E_INVALID_PARAMETER);
IWbemClassObject *pObj = pErrorInstance->GetClassObjectInterface();
if (pObj != NULL)
{
MethodContext *pMethodContext = Instance.GetMethodContext();
if (pMethodContext != NULL)
{
pMethodContext->SetStatusObject(pObj);
}
pObj->Release();
}
pErrorInstance->Release();
}
}
TRC2((TB,"TSSessionSetting@PutInstance: GetInstanceByPath ret 0x%x\n" , hr ));
}
}while (0);
if ( pUser != NULL )
{
CoTaskMemFree(pUser);
}
return hr;
}
//=--------------------
HRESULT CWin32_TSSessionSetting::ExecMethod ( const CInstance& Inst,
const BSTR bstrMethodName,
CInstance *pInParams,
CInstance *pOutParams,
long lFlags)
{
HRESULT hr= WBEM_E_NOT_FOUND;
CHString chTermName;
PUSERCONFIG pUser = NULL;
LONG lSize;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
Inst.GetCHString( m_szTerminalName, chTermName );
if( chTermName.GetLength( ) > WINSTATIONNAME_LENGTH )
{
return WBEM_E_VALUE_OUT_OF_RANGE;
}
if( chTermName.IsEmpty( ) != 0 )
{
return WBEM_E_ILLEGAL_NULL;
}
if(_tcsicmp(chTermName, L"Console") == 0 )
{
return WBEM_E_NOT_SUPPORTED;
}
RegGetMachinePolicy(&m_gpPolicy);
hr = StackObj.m_pCfgComp->GetUserConfig((LPTSTR) (LPCTSTR) chTermName, &lSize, &pUser, TRUE);
do
{
if( SUCCEEDED (hr) && pUser != NULL && pInParams != NULL )
{
// SessionLimitType is an enumeration of the properties:
// ActiveSessionLimit, DisconnectedSessionLimit and IdleSessionLimit
// which specify the Maximum allowed time for Active, Disconnected Session
// Idle session limits. Value specifies the time in minutes.
// uint32 TimeLimit([In] uint32 SessionLimitType, [In] uint32 ValueLimit)
if( _wcsicmp( bstrMethodName, m_szTimeLimit ) == 0 )
{
CHString chData;
DWORD dwData = 0;
DWORD dwStatus = 0;
DWORD dwSessionType;
bool bRet;
chData.Empty();
pInParams->GetCHString( m_szSessionLimitType, chData );
if( chData.IsEmpty() != 0 )
{
hr = WBEM_E_INVALID_METHOD_PARAMETERS;
break;
}
if( chData.CompareNoCase( m_szActiveSessionLimit ) == 0 )
{
dwData = pUser->fInheritMaxSessionTime;
if( dwData == 0 && m_gpPolicy.fPolicyMaxSessionTime == 0)
{
bRet = pInParams->GetDWORD(m_szValueLimit, dwData);
if ( !bRet )
{
hr = WBEM_E_INVALID_PARAMETER;
break;
}
pUser->MaxConnectionTime = dwData;
hr = StackObj.m_pCfgComp->SetUserConfig( (LPTSTR) (LPCTSTR) chTermName, lSize, pUser , &dwStatus );
if( SUCCEEDED( hr ) && pOutParams != NULL )
{
hr = StackObj.m_pCfgComp->ForceUpdate();
pOutParams->SetDWORD( L"ReturnValue", WBEM_S_NO_ERROR );
TRC2((TB,"TSSessionSetting@ExecMethod: TimeLimit - ActiveSessionLimit ret 0x%x\n" , hr ));
}
}
else
{
hr = WBEM_E_INVALID_OPERATION;
break;
}
}
else if( chData.CompareNoCase( m_szDisconnectedSessionLimit ) == 0 )
{
dwData = pUser->fInheritMaxSessionTime;
if( dwData == 0 && m_gpPolicy.fPolicyMaxDisconnectionTime == 0)
{
bRet = pInParams->GetDWORD(m_szValueLimit, dwData);
if ( !bRet )
{
hr = WBEM_E_INVALID_PARAMETER;
break;
}
pUser->MaxDisconnectionTime = dwData;
hr = StackObj.m_pCfgComp->SetUserConfig( (LPTSTR) (LPCTSTR) chTermName, lSize, pUser , &dwStatus );
if( SUCCEEDED( hr ) && pOutParams != NULL )
{
StackObj.m_pCfgComp->ForceUpdate();
pOutParams->SetDWORD(L"ReturnValue", WBEM_S_NO_ERROR);
TRC2((TB,"TSSessionSetting@ExecMethod: TimeLimit - DisconnectedSessionLimit ret 0x%x\n" , hr ));
}
}
else
{
hr = WBEM_E_INVALID_OPERATION;
break;
}
}
else if( chData.CompareNoCase(m_szIdleSessionLimit) == 0)
{
dwData = pUser->fInheritMaxSessionTime;
if( dwData == 0 && m_gpPolicy.fPolicyMaxIdleTime == 0)
{
bRet = pInParams->GetDWORD(m_szValueLimit, dwData);
if ( !bRet )
{
hr = WBEM_E_INVALID_PARAMETER;
break;
}
pUser->MaxIdleTime = dwData;
hr = StackObj.m_pCfgComp->SetUserConfig( (LPTSTR) (LPCTSTR) chTermName, lSize, pUser , &dwStatus );
if( SUCCEEDED( hr ) && pOutParams != NULL )
{
StackObj.m_pCfgComp->ForceUpdate();
pOutParams->SetDWORD(L"ReturnValue", WBEM_S_NO_ERROR);
TRC2((TB,"TSSessionSetting@ExecMethod: TimeLimit - IdleSessionLimit ret 0x%x\n" , hr ));
}
}
else
{
hr = WBEM_E_INVALID_OPERATION;
break;
}
}
else
{
hr = WBEM_E_INVALID_METHOD_PARAMETERS;
break;
}
}
else if( _wcsicmp( bstrMethodName, m_szBrokenConnection ) == 0 )
{
DWORD dwData = 0;
DWORD dwStatus = 0;
bool bRet;
dwData = pUser->fInheritResetBroken;
if( dwData == 0 && m_gpPolicy.fPolicyResetBroken == 0 )
{
bRet = pInParams->GetDWORD(m_szBrokenConnectionAction, dwData);
if ( !bRet || (dwData !=0 && dwData != 1 ))
{
hr = WBEM_E_INVALID_PARAMETER;
break;
}
pUser->fResetBroken = dwData;
hr = StackObj.m_pCfgComp->SetUserConfig( (LPTSTR) (LPCTSTR) chTermName, lSize, pUser , &dwStatus );
if( SUCCEEDED( hr ) && pOutParams != NULL )
{
StackObj.m_pCfgComp->ForceUpdate();
pOutParams->SetDWORD(L"ReturnValue", WBEM_S_NO_ERROR);
TRC2((TB,"TSSessionSetting@ExecMethod: BrokenConnection ret 0x%x\n" , hr ));
}
}
else
{
hr = WBEM_E_INVALID_OPERATION;
break;
}
}
}
} while( 0 );
if( pUser != NULL )
{
CoTaskMemFree(pUser);
}
return hr;
}
//=--------------------------
HRESULT CWin32_TSSessionSetting::ExecQuery (MethodContext *pMethodContext, CFrameworkQuery& Query, long lFlags)
{
HRESULT hr = WBEM_E_NOT_FOUND;
ULONGLONG ulRequiredProperties = 0;
CHStringArray asNames;
ULONG ulNum = 0;
ULONG ulSize = 0;
ULONG ulTerminals = 0;
PWS pWS = NULL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
// Method 2
Query.GetValuesForProp(m_szTerminalName, asNames);
BOOL bGetAllInstances = asNames.GetSize() == 0;
// Method 1
if (Query.IsPropertyRequired(m_szTerminalName))
ulRequiredProperties |= BIT_TERMINALNAME;
if (Query.IsPropertyRequired(m_szTimeLimitPolicy))
ulRequiredProperties |= BIT_ACTIVESESSIONPOLICY;
if (Query.IsPropertyRequired(m_szBrokenConnectionPolicy))
ulRequiredProperties |= BIT_BROKENCONNECTIONPOLICY;
if (Query.IsPropertyRequired(m_szActiveSessionLimit))
ulRequiredProperties |= BIT_ACTIVESESSIONLIMIT;
if (Query.IsPropertyRequired(m_szBrokenConnectionAction))
ulRequiredProperties |= BIT_BROKENCONNECTIONACTION;
if (Query.IsPropertyRequired(m_szDisconnectedSessionLimit))
ulRequiredProperties |= BIT_DISCONNECTEDSESSIONLIMIT;
if (Query.IsPropertyRequired(m_szIdleSessionLimit))
ulRequiredProperties |= BIT_IDLESESSIONLIMIT;
if (Query.IsPropertyRequired(m_szReconnectionPolicy))
ulRequiredProperties |= BIT_RECONNECTIONPOLICY;
hr = StackObj.m_pCfgComp->GetWinstationList(&ulTerminals, &ulSize, &pWS);
if( SUCCEEDED( hr ) && pWS != NULL )
{
for ( ulNum = 0; ulNum < ulTerminals && SUCCEEDED( hr ) ; ulNum++)
{
if(_tcsicmp(pWS[ulNum].Name, L"Console") == 0)
continue;
// Method 2
if (bGetAllInstances || IsInList(asNames, pWS[ulNum].Name))
{
CInstance* pInstance = CreateNewInstance(pMethodContext);
if( pInstance == NULL)
{
TRC2((TB,"TSSessionSetting@ExecQuery: CreateNewInstance failed" ));
hr = WBEM_E_OUT_OF_MEMORY;
break;
}
pInstance->SetCHString(m_szTerminalName, CHString(pWS[ulNum].Name));
hr = LoadPropertyValues( pInstance, ulRequiredProperties, &pWS[ ulNum ] );
if( SUCCEEDED( hr ) )
{
hr = pInstance->Commit();
}
pInstance->Release();
}
}
}
if ( pWS != NULL )
{
CoTaskMemFree(pWS);
}
return hr;
}
//=----------------------Win32_TSEnvironmentSetting---------------------
CWin32_TSEnvironmentSetting::CWin32_TSEnvironmentSetting (LPCWSTR lpwszName, LPCWSTR lpwszNameSpace ) :
Provider( lpwszName, lpwszNameSpace )
{
if ( g_hInstance != NULL)
{
TRC2((TB, "CWin32_TSEnvironmentSetting_ctor"));
_tcscpy(m_szInitialProgramPolicy, _T("InitialProgramPolicy"));
_tcscpy(m_szInitialProgramPath, _T("InitialProgramPath"));
_tcscpy(m_szStartIn, _T("StartIn"));
_tcscpy(m_szClientWallPaper, _T("ClientWallPaper"));
_tcscpy(m_szTerminalName, _T("TerminalName"));
_tcscpy(m_szInitialProgram, _T("InitialProgram"));
_tcscpy(m_szSetClientWallPaper, _T("SetClientWallPaper"));
}
}
//=--------------------
CWin32_TSEnvironmentSetting::~CWin32_TSEnvironmentSetting ()
{
}
//=---------------
BOOL CWin32_TSEnvironmentSetting::IsInList(const CHStringArray &asArray, LPCWSTR pszString)
{
DWORD dwSize = asArray.GetSize();
for (DWORD x=0; x < dwSize; x++)
{
if (asArray[x].CompareNoCase(pszString) == 0)
{
return TRUE;
}
}
return FALSE;
}
//=--------------------
HRESULT CWin32_TSEnvironmentSetting::GetObject ( CInstance* pInstance, long lFlags, CFrameworkQuery &Query )
{
HRESULT hr = WBEM_E_NOT_FOUND;
DWORD dwData = 0;
CHString chTermName;
LONG lSize ;
ULONGLONG ulRequiredProperties = 0;
PWS pWS = NULL;
// PUSERCONFIG pUser = NULL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
if( pInstance == NULL )
{
ERR((TB,"TSEnvironmentSetting@GetObject: invalid pointer" ));
return WBEM_E_ILLEGAL_NULL;
}
pInstance->GetCHString(m_szTerminalName, chTermName);
if(chTermName.GetLength() > WINSTATIONNAME_LENGTH)
{
return WBEM_E_VALUE_OUT_OF_RANGE;
}
if (chTermName.IsEmpty() != 0)
{
return WBEM_E_ILLEGAL_NULL;
}
if(_tcsicmp(chTermName, L"Console") == 0)
{
return WBEM_E_NOT_SUPPORTED;
}
if (Query.IsPropertyRequired(m_szTerminalName))
ulRequiredProperties |= BIT_TERMINALNAME;
if (Query.IsPropertyRequired(m_szClientWallPaper))
ulRequiredProperties |= BIT_CLIENTWALLPAPER;
if (Query.IsPropertyRequired(m_szInitialProgramPath))
ulRequiredProperties |= BIT_INITIALPROGRAMPATH;
if (Query.IsPropertyRequired(m_szInitialProgramPolicy))
ulRequiredProperties |= BIT_INITIALPROGRAMPOLICY;
if (Query.IsPropertyRequired(m_szStartIn))
ulRequiredProperties |= BIT_STARTIN;
if ( pInstance != NULL )
{
hr = StackObj.m_pCfgComp->GetWSInfo((LPTSTR)(LPCTSTR) chTermName, &lSize, &pWS);
if( SUCCEEDED( hr ) && pWS != NULL )
{
hr = LoadPropertyValues(pInstance, ulRequiredProperties, pWS );
}
}
if ( pWS != NULL )
{
CoTaskMemFree(pWS);
}
return hr;
}
//=--------------------
/*****************************************************************************
*
* FUNCTION : CWin32_TSEnvironmentSetting::EnumerateInstances
*
* DESCRIPTION : Returns all the instances of this class.
*
* INPUTS : A pointer to the MethodContext for communication with WinMgmt.
* A long that contains the flags described in
* IWbemServices::CreateInstanceEnumAsync. Note that the following
* flags are handled by (and filtered out by) WinMgmt:
* WBEM_FLAG_DEEP, WBEM_FLAG_SHALLOW, WBEM_FLAG_RETURN_IMMEDIATELY,
* WBEM_FLAG_FORWARD_ONLY, WBEM_FLAG_BIDIRECTIONAL
*
* RETURNS : WBEM_S_NO_ERROR if successful
*
* COMMENTS : All instances on the machine are returned here and
* all properties that this class knows how to populate must
* be filled in. If there are no instances, return
* WBEM_S_NO_ERROR.
*****************************************************************************/
HRESULT CWin32_TSEnvironmentSetting::EnumerateInstances (MethodContext* pMethodContext, long lFlags )
{
HRESULT hr = WBEM_S_NO_ERROR;
DWORD dwData = 0;
ULONG ulTerminals = 0;
ULONG ulNum = 0;
ULONG ulSize = 0;
LONG lSize = 0;
PWS pWS = NULL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
hr = StackObj.m_pCfgComp->GetWinstationList(&ulTerminals, &ulSize, &pWS);
if( SUCCEEDED( hr ) && pWS != NULL )
{
for ( ulNum = 0; ulNum < ulTerminals && SUCCEEDED( hr ); ulNum++)
{
if(_tcsicmp(pWS[ulNum].Name, L"Console") == 0)
continue;
CInstance* pInstance = CreateNewInstance(pMethodContext);
if( pInstance == NULL)
{
ERR((TB,"TSEnvironmentSetting@EnumerateInstances: CreateNewInstance Failed" ));
hr = WBEM_E_OUT_OF_MEMORY;
break;
}
hr = LoadPropertyValues(pInstance, BIT_ALL_PROPERTIES, &pWS[ulNum] );
if( SUCCEEDED( hr ) )
{
hr = pInstance->Commit();
}
pInstance->Release( );
}
}
if ( pWS != NULL )
{
CoTaskMemFree(pWS);
}
return hr;
}
//=--------------------
HRESULT CWin32_TSEnvironmentSetting::LoadPropertyValues( CInstance *pInstance, ULONGLONG ulRequiredProperties, PWS pWS)
{
HRESULT hr = WBEM_S_NO_ERROR;
LONG lSize ;
DWORD dwData = 0;
USERCONFIGW* pUser = NULL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
if( pInstance == NULL )
{
ERR((TB,"TSEnvironmentSetting@LoadPropertyValues: invalid pointer" ));
return WBEM_E_ILLEGAL_NULL;
}
if ( pWS != NULL )
{
if( ulRequiredProperties & BIT_TERMINALNAME)
{
pInstance->SetCharSplat(m_szTerminalName, pWS->Name);
}
hr = StackObj.m_pCfgComp->GetUserConfig(pWS->Name, &lSize, &pUser, TRUE);
TRC2((TB,"TSEnvironmentSetting@LoadPropertyValues: GetTerminalName ret 0x%x\n" , hr ));
if ( SUCCEEDED (hr) && pUser != NULL )
{
if( ulRequiredProperties & BIT_INITIALPROGRAMPOLICY)
{
pInstance->SetDWORD(m_szInitialProgramPolicy, pUser->fInheritInitialProgram);
}
TRC2((TB,"TSEnvironmentSetting@LoadPropertyValues: InitialProgramPolicy" ));
if( ulRequiredProperties & BIT_INITIALPROGRAMPATH)
{
RegGetMachinePolicy(&m_gpPolicy);
if( m_gpPolicy.fPolicyInitialProgram != 0 )
{
pInstance->SetWCHARSplat(m_szInitialProgramPath, m_gpPolicy.InitialProgram);
}
else
{
pInstance->SetWCHARSplat(m_szInitialProgramPath, pUser->InitialProgram);
}
}
TRC2((TB,"TSEnvironmentSetting@LoadPropertyValues: InitialProgramPath" ));
if( ulRequiredProperties & BIT_STARTIN)
{
pInstance->SetWCHARSplat(m_szStartIn, pUser->WorkDirectory);
}
TRC2((TB,"TSEnvironmentSetting@LoadPropertyValues: StartIn" ));
if( ulRequiredProperties & BIT_CLIENTWALLPAPER)
{
RegGetMachinePolicy(&m_gpPolicy);
if( m_gpPolicy.fPolicyDisableWallpaper != 0 )
{
pInstance->SetDWORD(m_szClientWallPaper, m_gpPolicy.fDisableWallpaper);
}
else
{
pInstance->SetDWORD(m_szClientWallPaper, pUser->fWallPaperDisabled);
}
}
TRC2((TB,"TSEnvironmentSetting@LoadPropertyValues: ClientWallPaper" ));
}
}
if ( pUser != NULL )
{
CoTaskMemFree(pUser);
}
return hr;
}
//=--------------------
HRESULT CWin32_TSEnvironmentSetting::PutInstance ( const CInstance &Instance, long lFlags)
{
HRESULT hr= WBEM_S_NO_ERROR;
DWORD dwData = 0;
DWORD dwStatus = 0;
CHString chTermName;
LONG lSize;
PUSERCONFIG pUser = NULL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
Instance.GetCHString(m_szTerminalName, chTermName);
if(chTermName.GetLength() > WINSTATIONNAME_LENGTH)
{
return WBEM_E_VALUE_OUT_OF_RANGE;
}
if (chTermName.IsEmpty() != 0)
{
return WBEM_E_ILLEGAL_NULL;
}
if(_tcsicmp(chTermName, L"Console") == 0)
{
return WBEM_E_NOT_SUPPORTED;
}
hr = StackObj.m_pCfgComp->GetUserConfig((LPTSTR)(LPCTSTR) chTermName, &lSize, &pUser, TRUE);
do
{
if( SUCCEEDED (hr) && pUser != NULL )
{
Instance.GetDWORD(m_szInitialProgramPolicy, dwData);
if( dwData != 0 && dwData != 1 )
{
hr = WBEM_E_INVALID_PARAMETER;
break;
}
pUser->fInheritInitialProgram = dwData;
hr = StackObj.m_pCfgComp->SetUserConfig((LPTSTR)(LPCTSTR) chTermName, lSize, pUser , &dwStatus );
if( SUCCEEDED( hr ))
{
hr = StackObj.m_pCfgComp->ForceUpdate();
}
}
else
{
TRC2((TB,"TSEnvironmentSetting@PutInstance: ret 0x%x\n" , hr ));
CHString sRelPath;
Instance.GetCHString(L"__RelPath", sRelPath);
CInstance *pErrorInstance = NULL;
hr = CWbemProviderGlue::GetInstanceByPath(pErrorClass, &pErrorInstance );
if( SUCCEEDED( hr ) )
{
TRC2((TB,"TSEnvironmentSetting@PutInstance: ret 0x%x\n" , hr ));
if (pErrorInstance != NULL)
{
LoadString( g_hInstance , IDS_ERR_PUTTSECONFIG, tchErrorMessage, SIZE_OF_BUFFER(tchErrorMessage) );
pErrorInstance->SetWCHARSplat(L"Description", tchErrorMessage);
LoadString( g_hInstance , IDS_ERR_PUTINSTANCE, tchErrorMessage, SIZE_OF_BUFFER(tchErrorMessage) );
pErrorInstance->SetWCHARSplat(L"Operation", tchErrorMessage);
pErrorInstance->SetCHString(L"ParameterInfo", sRelPath);
pErrorInstance->SetWCHARSplat(L"ProviderName", PROVIDER_NAME_Win32_WIN32_TSENVIRONMENTSETTING_Prov);
pErrorInstance->SetDWORD(L"StatusCode", WBEM_E_INVALID_PARAMETER);
IWbemClassObject *pObj = pErrorInstance->GetClassObjectInterface();
if (pObj != NULL)
{
MethodContext *pMethodContext = Instance.GetMethodContext();
if (pMethodContext != NULL)
{
pMethodContext->SetStatusObject(pObj);
}
pObj->Release();
}
pErrorInstance->Release();
}
}
}
}while (0);
if ( pUser != NULL )
{
CoTaskMemFree(pUser);
}
return hr;
}
//=--------------------
HRESULT CWin32_TSEnvironmentSetting::ExecMethod ( const CInstance& Inst,
const BSTR bstrMethodName,
CInstance *pInParams,
CInstance *pOutParams,
long lFlags)
{
HRESULT hr = WBEM_E_NOT_FOUND;
CHString chTermName;
PUSERCONFIG pUser = NULL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
Inst.GetCHString( m_szTerminalName, chTermName );
if( chTermName.GetLength( ) > WINSTATIONNAME_LENGTH )
{
return WBEM_E_VALUE_OUT_OF_RANGE;
}
if( chTermName.IsEmpty() != 0 )
{
return WBEM_E_ILLEGAL_NULL;
}
if(_tcsicmp(chTermName, L"Console") == 0)
{
return WBEM_E_NOT_SUPPORTED;
}
// Sets the properties InitialProgramPath and StartIn which
// specify the name and path of the program and the working
// directory path for the program the user wants to start on
// logon to the Terminal Server.
// uint32 InitialProgram([In] string InitialProgramPath, [In] string Startin)
do
{
if (_wcsicmp(bstrMethodName, m_szInitialProgram) == 0)
{
DWORD dwData = 0;
DWORD dwStatus = 0;
CHString chData;
LONG lSize;
hr = StackObj.m_pCfgComp->GetUserConfig((LPTSTR)(LPCTSTR) chTermName, &lSize, &pUser, TRUE);
RegGetMachinePolicy(&m_gpPolicy);
if( SUCCEEDED (hr) && pUser != NULL )
{
dwData = pUser->fInheritInitialProgram;
if( (dwData == 0) && pInParams != NULL )
{
if(m_gpPolicy.fPolicyInitialProgram != 0)
{
hr = WBEM_E_INVALID_OPERATION;
break;
}
chData.Empty();
pInParams->GetCHString(m_szInitialProgramPath, chData);
if( chData.GetLength() > 256 )
{
hr = WBEM_E_VALUE_OUT_OF_RANGE;
break;
}
wcscpy( pUser->InitialProgram, (LPTSTR)(LPCTSTR) chData );
chData.Empty();
pInParams->GetCHString( m_szStartIn, chData );
if( chData.GetLength() > 256 )
{
hr = WBEM_E_VALUE_OUT_OF_RANGE;
break;
}
wcscpy( pUser->WorkDirectory, (LPTSTR) (LPCTSTR) chData );
hr = StackObj.m_pCfgComp->SetUserConfig( (LPTSTR) (LPCTSTR) chTermName, lSize, pUser , &dwStatus );
if( SUCCEEDED( hr ) && pOutParams != NULL )
{
StackObj.m_pCfgComp->ForceUpdate();
pOutParams->SetDWORD( L"ReturnValue", WBEM_S_NO_ERROR );
}
}
else
{
hr = WBEM_E_INVALID_OPERATION;
break;
}
}
}
if (_wcsicmp(bstrMethodName, m_szSetClientWallPaper) == 0)
{
BOOL bRet = 0;
DWORD dwData = 0;
DWORD dwStatus = 0;
LONG lSize;
RegGetMachinePolicy(&m_gpPolicy);
if( m_gpPolicy.fPolicyDisableWallpaper == 0 )
{
hr = StackObj.m_pCfgComp->GetUserConfig((LPTSTR)(LPCTSTR) chTermName, &lSize, &pUser, TRUE);
if( SUCCEEDED (hr) && pUser != NULL && pInParams != NULL)
{
bRet = pInParams->GetDWORD(m_szClientWallPaper, dwData);
if(!bRet || (dwData != 0 && dwData != 1))
{
hr = WBEM_E_INVALID_METHOD_PARAMETERS;
break;
}
pUser->fWallPaperDisabled = dwData;
hr = StackObj.m_pCfgComp->SetUserConfig((LPTSTR)(LPCTSTR) chTermName, lSize, pUser , &dwStatus );
if( SUCCEEDED( hr ))
{
hr = StackObj.m_pCfgComp->ForceUpdate();
pOutParams->SetDWORD( L"ReturnValue", WBEM_S_NO_ERROR );
}
}
}
else
{
hr = WBEM_E_INVALID_OPERATION;
break;
}
}
}while (0);
if ( pUser != NULL )
{
CoTaskMemFree(pUser);
}
return hr;
}
//=-----------------------
HRESULT CWin32_TSEnvironmentSetting::ExecQuery (MethodContext *pMethodContext, CFrameworkQuery& Query, long lFlags)
{
// return (WBEM_E_PROVIDER_NOT_CAPABLE);
HRESULT hr = WBEM_E_NOT_FOUND;
ULONGLONG ulRequiredProperties = 0;
CHStringArray asNames;
ULONG ulNum = 0;
ULONG ulSize = 0;
ULONG ulTerminals = 0;
PWS pWS = NULL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
// Method 2
Query.GetValuesForProp(m_szTerminalName, asNames);
BOOL bGetAllInstances = asNames.GetSize() == 0;
// Method 1
if (Query.IsPropertyRequired(m_szTerminalName))
ulRequiredProperties |= BIT_TERMINALNAME;
if (Query.IsPropertyRequired(m_szClientWallPaper))
ulRequiredProperties |= BIT_CLIENTWALLPAPER;
if (Query.IsPropertyRequired(m_szInitialProgramPath))
ulRequiredProperties |= BIT_INITIALPROGRAMPATH;
if (Query.IsPropertyRequired(m_szInitialProgramPolicy))
ulRequiredProperties |= BIT_INITIALPROGRAMPOLICY;
if (Query.IsPropertyRequired(m_szStartIn))
ulRequiredProperties |= BIT_STARTIN;
hr = StackObj.m_pCfgComp->GetWinstationList( &ulTerminals, &ulSize, &pWS );
if( SUCCEEDED( hr ) && pWS != NULL )
{
for ( ulNum = 0; ulNum < ulTerminals ; ulNum++)
{
if(_tcsicmp(pWS[ulNum].Name, L"Console") == 0)
continue;
// Method 2
if (bGetAllInstances || IsInList(asNames, pWS[ulNum].Name))
{
CInstance* pInstance = CreateNewInstance(pMethodContext);
if( pInstance == NULL)
{
TRC2((TB,"TSEnvironmentSetting@ExecQuery CreateNewInstance failed" ));
hr = WBEM_E_OUT_OF_MEMORY;
break;
}
pInstance->SetCHString( m_szTerminalName, CHString( pWS[ulNum].Name ) );
hr = LoadPropertyValues( pInstance, ulRequiredProperties, &pWS[ ulNum ] );
if (SUCCEEDED( hr ) )
{
hr = pInstance->Commit();
}
pInstance->Release();
}
}
}
if ( pWS != NULL )
{
CoTaskMemFree(pWS);
}
return hr;
}
//=----------------------Win32_TSRemoteControlSettingsConfig---------------------
CWin32_TSRemoteControlSetting::CWin32_TSRemoteControlSetting (LPCWSTR lpwszName, LPCWSTR lpwszNameSpace ) :
Provider( lpwszName, lpwszNameSpace )
{
if ( g_hInstance != NULL)
{
TRC2((TB, "CWin32_TSRemoteControlSetting_ctor"));
_tcscpy(m_szRemoteControlPolicy, _T("RemoteControlPolicy"));
_tcscpy(m_szLevelOfControl, _T("LevelOfControl"));
_tcscpy(m_szTerminalName, _T("TerminalName"));
_tcscpy(m_szRemoteControl, _T("RemoteControl"));
}
}
//=--------------------
CWin32_TSRemoteControlSetting::~CWin32_TSRemoteControlSetting ()
{
}
//=------------
BOOL CWin32_TSRemoteControlSetting::IsInList(const CHStringArray &asArray, LPCWSTR pszString)
{
DWORD dwSize = asArray.GetSize();
for (DWORD x=0; x < dwSize; x++)
{
if (asArray[x].CompareNoCase(pszString) == 0)
{
return TRUE;
}
}
return FALSE;
}
//=--------------------
HRESULT CWin32_TSRemoteControlSetting::GetObject ( CInstance* pInstance, long lFlags, CFrameworkQuery &Query )
{
HRESULT hr = WBEM_E_NOT_FOUND;
DWORD dwData = 0;
CHString chTermName;
LONG lSize ;
PWS pWS = NULL;
ULONGLONG ulRequiredProperties = 0;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
if( pInstance == NULL )
{
ERR((TB,"TSRemoteControlSetting@Getobject invalid pointer" ));
return WBEM_E_ILLEGAL_NULL;
}
pInstance->GetCHString(m_szTerminalName, chTermName);
if(chTermName.GetLength() > WINSTATIONNAME_LENGTH)
{
return WBEM_E_VALUE_OUT_OF_RANGE;
}
if(chTermName.IsEmpty() != 0)
{
return WBEM_E_ILLEGAL_NULL;
}
if (Query.IsPropertyRequired(m_szTerminalName))
ulRequiredProperties |= BIT_TERMINALNAME;
if (Query.IsPropertyRequired(m_szRemoteControlPolicy))
ulRequiredProperties |= BIT_REMOTECONTROLPOLICY;
if (Query.IsPropertyRequired(m_szLevelOfControl))
ulRequiredProperties |= BIT_LEVELOFCONTROL;
if( pInstance != NULL )
{
hr = StackObj.m_pCfgComp->GetWSInfo((LPTSTR)(LPCTSTR) chTermName, &lSize, &pWS);
if( SUCCEEDED( hr ) && pWS != NULL )
{
hr = LoadPropertyValues(pInstance, ulRequiredProperties, pWS );
}
}
if ( pWS != NULL )
{
CoTaskMemFree(pWS);
}
return hr;
}
//=--------------------
/*****************************************************************************
*
* FUNCTION : CWin32_TSRemoteControlSetting::EnumerateInstances
*
* DESCRIPTION : Returns all the instances of this class.
*
* INPUTS : A pointer to the MethodContext for communication with WinMgmt.
* A long that contains the flags described in
* IWbemServices::CreateInstanceEnumAsync. Note that the following
* flags are handled by (and filtered out by) WinMgmt:
* WBEM_FLAG_DEEP, WBEM_FLAG_SHALLOW, WBEM_FLAG_RETURN_IMMEDIATELY,
* WBEM_FLAG_FORWARD_ONLY, WBEM_FLAG_BIDIRECTIONAL
*
* RETURNS : WBEM_S_NO_ERROR if successful
*
* COMMENTS : All instances on the machine are returned here and
* all properties that this class knows how to populate must
* be filled in. If there are no instances, return
* WBEM_S_NO_ERROR.
*****************************************************************************/
HRESULT CWin32_TSRemoteControlSetting::EnumerateInstances (MethodContext* pMethodContext, long lFlags )
{
HRESULT hr = WBEM_S_NO_ERROR;
DWORD dwData = 0;
ULONG ulTerminals = 0;
ULONG ulSize = 0;
LONG lSize = 0;
ULONG ulNum = 0;
PWS pWS = NULL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
hr = StackObj.m_pCfgComp->GetWinstationList(&ulTerminals, &ulSize, &pWS);
if( SUCCEEDED( hr ) && pWS != NULL )
{
for ( ulNum = 0; ulNum < ulTerminals && SUCCEEDED( hr ) ; ulNum++)
{
CInstance* pInstance = CreateNewInstance(pMethodContext);
if( pInstance == NULL)
{
ERR((TB,"TSRemoteControlSetting@EnumerateInstances CreateNewInstance failed" ));
hr = WBEM_E_OUT_OF_MEMORY;
break;
}
TRC2((TB,"TSRemoteControlSetting@EnumerateInstances: GetWinstationList ret 0x%x\n" , hr ));
hr = LoadPropertyValues( pInstance, BIT_ALL_PROPERTIES, &pWS[ulNum] );
if ( SUCCEEDED( hr ) )
{
hr = pInstance->Commit();
}
pInstance->Release( );
}
}
if ( pWS != NULL )
{
CoTaskMemFree(pWS);
}
return hr;
}
//=--------------------
HRESULT CWin32_TSRemoteControlSetting::LoadPropertyValues( CInstance *pInstance, ULONGLONG ulRequiredProperties, PWS pWS)
{
HRESULT hr = WBEM_S_NO_ERROR;
LONG lSize ;
DWORD dwData = 0;
USERCONFIGW* pUser = NULL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
if( pInstance == NULL )
{
return WBEM_E_ILLEGAL_NULL;
}
if ( pInstance != NULL && pWS != NULL )
{
if( ulRequiredProperties & BIT_TERMINALNAME)
{
pInstance->SetCharSplat(m_szTerminalName, pWS->Name);
}
TRC2((TB,"TSRemoteControlSetting@LoadPropertyValues: GetTerminalName" ));
hr = StackObj.m_pCfgComp->GetUserConfig(pWS->Name, &lSize, &pUser, TRUE);
TRC2((TB,"TSRemoteControlSetting@LoadPropertyValues: GetUserConfig ret 0x%x\n" , hr ));
if ( SUCCEEDED (hr) && pUser != NULL )
{
if( ulRequiredProperties & BIT_REMOTECONTROLPOLICY)
{
pInstance->SetDWORD(m_szRemoteControlPolicy, pUser->fInheritShadow);
}
TRC2((TB,"TSRemoteControlSetting@LoadPropertyValues: RemoteControlPolicy" ));
if( ulRequiredProperties & BIT_LEVELOFCONTROL)
{
RegGetMachinePolicy(&m_gpPolicy);
if( m_gpPolicy.fPolicyShadow != 0 )
{
pInstance->SetDWORD(m_szLevelOfControl, m_gpPolicy.Shadow);
}
else
{
pInstance->SetDWORD(m_szLevelOfControl, pUser->Shadow);
}
}
TRC2((TB,"TSRemoteControlSetting@LoadPropertyValues: LevelOfControl"));
}
}
if ( pUser != NULL )
{
CoTaskMemFree(pUser);
}
return hr;
}
//=--------------------
HRESULT CWin32_TSRemoteControlSetting::PutInstance ( const CInstance &Instance, long lFlags)
{
HRESULT hr= WBEM_S_NO_ERROR;
CHString chTermName ;
DWORD dwData = 0;
DWORD dwStatus = 0;
LONG lSize;
PUSERCONFIG pUser = NULL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
Instance.GetCHString(m_szTerminalName, chTermName);
if(chTermName.GetLength() > WINSTATIONNAME_LENGTH)
{
return WBEM_E_VALUE_OUT_OF_RANGE;
}
if( chTermName.IsEmpty() != 0)
{
return WBEM_E_ILLEGAL_NULL;
}
hr = StackObj.m_pCfgComp->GetUserConfig((LPTSTR)(LPCTSTR) chTermName, &lSize, &pUser, TRUE);
do
{
if( SUCCEEDED( hr ) && pUser != NULL )
{
if( Instance.GetDWORD( m_szRemoteControlPolicy, dwData ) )
{
pUser->fInheritShadow = dwData;
if ( dwData != 0 && dwData != 1 )
{
hr = WBEM_E_INVALID_PARAMETER;
break;
}
hr = StackObj.m_pCfgComp->SetUserConfig((LPTSTR)(LPCTSTR) chTermName, lSize, pUser , &dwStatus );
if( SUCCEEDED( hr ))
{
hr = StackObj.m_pCfgComp->ForceUpdate();
}
}
}
else
{
TRC2((TB,"TSRemoteControlSetting@PutInstance: ret 0x%x\n" , hr ));
CHString sRelPath;
Instance.GetCHString(L"__RelPath", sRelPath);
CInstance *pErrorInstance = NULL;
hr = CWbemProviderGlue::GetInstanceByPath(pErrorClass, &pErrorInstance );
if(( SUCCEEDED( hr ) ) && (pErrorInstance != NULL))
{
LoadString( g_hInstance , IDS_ERR_PUTTSRCONFIG, tchErrorMessage, SIZE_OF_BUFFER(tchErrorMessage) );
pErrorInstance->SetWCHARSplat(L"Description", tchErrorMessage);
LoadString( g_hInstance , IDS_ERR_PUTINSTANCE, tchErrorMessage, SIZE_OF_BUFFER(tchErrorMessage) );
pErrorInstance->SetWCHARSplat(L"Operation", tchErrorMessage);
pErrorInstance->SetCHString(L"ParameterInfo", sRelPath);
pErrorInstance->SetWCHARSplat(L"ProviderName", PROVIDER_NAME_Win32_WIN32_TSREMOTECONTROLSETTING_Prov);
pErrorInstance->SetDWORD(L"StatusCode", WBEM_E_INVALID_PARAMETER);
IWbemClassObject *pObj = pErrorInstance->GetClassObjectInterface();
if (pObj != NULL)
{
MethodContext *pMethodContext = Instance.GetMethodContext();
if (pMethodContext != NULL)
{
pMethodContext->SetStatusObject(pObj);
}
pObj->Release();
}
pErrorInstance->Release();
}
TRC2((TB,"TSRemoteControlSetting@PutInstance: GetInstanceByPath ret 0x%x\n" , hr ));
}
}while (0);
if( pUser != NULL )
{
CoTaskMemFree(pUser);
}
return hr;
}
//=--------------------
HRESULT CWin32_TSRemoteControlSetting::ExecMethod ( const CInstance& Inst,
const BSTR bstrMethodName,
CInstance *pInParams,
CInstance *pOutParams,
long lFlags)
{
HRESULT hr= WBEM_E_NOT_FOUND;
CHString chTermName;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
Inst.GetCHString(m_szTerminalName, chTermName);
if(chTermName.GetLength() > WINSTATIONNAME_LENGTH )
{
return WBEM_E_VALUE_OUT_OF_RANGE;
}
if(chTermName.IsEmpty() != 0)
{
return WBEM_E_ILLEGAL_NULL;
}
// Sets the property LevelOfControl which specifies the level of control
// which is one of Disable, EnableInputNotify, EnableInputNoNotify,
// EnableNoInputNotify, EnableNoInputNoNotify.
// uint32 RemoteControl([In] uint32 LevelOfControl);
if( _wcsicmp( bstrMethodName, m_szRemoteControl ) == 0 )
{
DWORD dwRemoteData = 0;
DWORD dwData = 0;
DWORD dwStatus = 0;
bool bRet;
LONG lSize;
PUSERCONFIG pUser = NULL;
if ( pInParams != NULL )
{
do
{
RegGetMachinePolicy(&m_gpPolicy);
if( m_gpPolicy.fPolicyShadow == 0 )
{
hr = StackObj.m_pCfgComp->GetUserConfig( (LPTSTR)(LPCTSTR) chTermName, &lSize, &pUser, TRUE );
if ( SUCCEEDED( hr ) && pUser != NULL )
{
dwRemoteData = pUser->fInheritShadow;
if ( SUCCEEDED( hr ) && ( dwRemoteData == 0 ))
{
bRet = pInParams->GetDWORD(m_szLevelOfControl, dwData);
if ( !bRet || ( dwData > 4 ) )
{
hr = WBEM_E_INVALID_PARAMETER;
break;
}
pUser->Shadow = ( SHADOWCLASS )dwData;
hr = StackObj.m_pCfgComp->SetUserConfig( (LPTSTR)(LPCTSTR) chTermName, lSize, pUser , &dwStatus );
if( SUCCEEDED( hr ) && pOutParams )
{
hr = StackObj.m_pCfgComp->ForceUpdate();
pOutParams->SetDWORD(L"ReturnValue", WBEM_S_NO_ERROR);
}
TRC2((TB,"TSRemoteControlSetting@ExecMethod: LevelOfControl ret 0x%x\n" , hr ));
}
else
{
hr = WBEM_E_INVALID_OPERATION;
}
}
}
else
{
hr = WBEM_E_INVALID_OPERATION;
break;
}
}while (0);
if ( pUser != NULL )
{
CoTaskMemFree(pUser);
}
}
}
return hr;
}
//=-------------------------------
HRESULT CWin32_TSRemoteControlSetting::ExecQuery (MethodContext *pMethodContext, CFrameworkQuery& Query, long lFlags)
{
HRESULT hr = WBEM_E_NOT_FOUND;
ULONGLONG ulRequiredProperties = 0;
CHStringArray asNames;
ULONG ulNum = 0;
ULONG ulSize = 0;
ULONG ulTerminals = 0;
PWS pWS = NULL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
// Method 2
Query.GetValuesForProp(m_szTerminalName, asNames);
BOOL bGetAllInstances = asNames.GetSize() == 0;
// Method 1
if (Query.IsPropertyRequired(m_szTerminalName))
ulRequiredProperties |= BIT_TERMINALNAME;
if (Query.IsPropertyRequired(m_szRemoteControlPolicy))
ulRequiredProperties |= BIT_REMOTECONTROLPOLICY;
if (Query.IsPropertyRequired(m_szLevelOfControl))
ulRequiredProperties |= BIT_LEVELOFCONTROL;
hr = StackObj.m_pCfgComp->GetWinstationList(&ulTerminals, &ulSize, &pWS);
if( SUCCEEDED( hr ) && pWS != NULL )
{
for ( ulNum = 0; ulNum < ulTerminals ; ulNum++)
{
if( bGetAllInstances || IsInList(asNames, pWS[ulNum].Name))
{
CInstance* pInstance = CreateNewInstance(pMethodContext);
if( pInstance == NULL)
{
TRC2((TB,"TSRemoteControlSetting@ExecQuery: CreateNewInstance failed" ));
hr = WBEM_E_OUT_OF_MEMORY;
break;
}
pInstance->SetCHString(m_szTerminalName, CHString(pWS[ulNum].Name));
hr = LoadPropertyValues( pInstance, ulRequiredProperties, &pWS[ ulNum ] );
if( SUCCEEDED( hr ) )
{
hr = pInstance->Commit();
}
pInstance->Release();
}
}
}
if( pWS != NULL )
{
CoTaskMemFree(pWS);
}
return hr;
}
//=----------------------Win32_TSClientSetting---------------------
CWin32_TSClientSetting::CWin32_TSClientSetting (LPCWSTR lpwszName, LPCWSTR lpwszNameSpace ) :
Provider( lpwszName, lpwszNameSpace )
{
if ( g_hInstance != NULL)
{
TRC2((TB, "CWin32_TSClientSetting_ctor"));
_tcscpy(m_szConnectionPolicy, _T("ConnectionPolicy"));
_tcscpy(m_szConnectClientDrivesAtLogon, _T("ConnectClientDrivesAtLogon"));
_tcscpy(m_szConnectPrinterAtLogon, _T("ConnectPrinterAtLogon"));
_tcscpy(m_szDefaultToClientPrinter, _T("DefaultToClientPrinter"));
_tcscpy(m_szWindowsPrinterMapping, _T("WindowsPrinterMapping"));
_tcscpy(m_szLPTPortMapping, _T("LPTPortMapping"));
_tcscpy(m_szCOMPortMapping, _T("COMPortMapping"));
_tcscpy(m_szDriveMapping, _T("DriveMapping"));
_tcscpy(m_szAudioMapping, _T("AudioMapping"));
_tcscpy(m_szClipboardMapping, _T("ClipboardMapping"));
_tcscpy(m_szTerminalName, _T("TerminalName"));
_tcscpy(m_szPropertyName, _T("PropertyName"));
_tcscpy(m_szValue, _T("Value"));
_tcscpy(m_szConnectionSettings, _T("ConnectionSettings"));
_tcscpy(m_szSetClientProperty, _T("SetClientProperty"));
_tcscpy(m_szColorDepth, _T("ColorDepth"));
_tcscpy(m_szSetColorDepth, _T("SetColorDepth"));
_tcscpy(m_szColorDepthPolicy, _T("ColorDepthPolicy"));
_tcscpy(m_szSetColorDepthPolicy, _T("SetColorDepthPolicy"));
}
RegGetMachinePolicy(&m_gpPolicy);
}
//=--------------------
CWin32_TSClientSetting::~CWin32_TSClientSetting ()
{
}
//=-----------------
BOOL CWin32_TSClientSetting::IsInList(const CHStringArray &asArray, LPCWSTR pszString)
{
DWORD dwSize = asArray.GetSize();
for (DWORD x=0; x < dwSize; x++)
{
if (asArray[x].CompareNoCase(pszString) == 0)
{
return TRUE;
}
}
return FALSE;
}
//=--------------------
HRESULT CWin32_TSClientSetting::GetObject ( CInstance* pInstance, long lFlags, CFrameworkQuery &Query )
{
HRESULT hr = WBEM_E_NOT_FOUND;
DWORD dwData = 0;
CHString chTermName;
LONG lSize ;
ULONGLONG ulRequiredProperties = 0;
PWS pWS = NULL;
// PUSERCONFIG pUser = NULL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
if( pInstance == NULL )
{
ERR((TB,"TSClientSetting@GetObject: invalid pointer" ));
return WBEM_E_ILLEGAL_NULL;
}
pInstance->GetCHString(m_szTerminalName, chTermName);
if(chTermName.GetLength() > WINSTATIONNAME_LENGTH)
{
return WBEM_E_VALUE_OUT_OF_RANGE;
}
if( chTermName.IsEmpty() != 0 )
{
return WBEM_E_ILLEGAL_NULL;
}
if(_tcsicmp(chTermName, L"Console") == 0)
{
return WBEM_E_NOT_SUPPORTED;
}
if (Query.IsPropertyRequired(m_szTerminalName))
ulRequiredProperties |= BIT_TERMINALNAME;
if (Query.IsPropertyRequired(m_szAudioMapping))
ulRequiredProperties |= BIT_AUDIOMAPPING;
if (Query.IsPropertyRequired(m_szClipboardMapping))
ulRequiredProperties |= BIT_CLIPBOARDMAPPING;
if (Query.IsPropertyRequired(m_szCOMPortMapping))
ulRequiredProperties |= BIT_COMPORTMAPPING;
if (Query.IsPropertyRequired(m_szConnectClientDrivesAtLogon))
ulRequiredProperties |= BIT_CONNECTCLIENTDRIVESATLOGON;
if (Query.IsPropertyRequired(m_szConnectionPolicy))
ulRequiredProperties |= BIT_CONNECTIONPOLICY;
if (Query.IsPropertyRequired(m_szConnectPrinterAtLogon))
ulRequiredProperties |= BIT_CONNECTPRINTERATLOGON;
if (Query.IsPropertyRequired(m_szDefaultToClientPrinter))
ulRequiredProperties |= BIT_DEFAULTTOCLIENTPRINTER;
if (Query.IsPropertyRequired(m_szDriveMapping))
ulRequiredProperties |= BIT_DRIVEMAPPING;
if (Query.IsPropertyRequired(m_szLPTPortMapping))
ulRequiredProperties |= BIT_LPTPORTMAPPING;
if (Query.IsPropertyRequired(m_szWindowsPrinterMapping))
ulRequiredProperties |= BIT_WINDOWSPRINTERMAPPING;
if (Query.IsPropertyRequired(m_szColorDepth))
ulRequiredProperties |= BIT_COLORDEPTH;
if (Query.IsPropertyRequired(m_szColorDepthPolicy))
ulRequiredProperties |= BIT_COLORDEPTHPOLICY;
if ( pInstance != NULL )
{
hr = StackObj.m_pCfgComp->GetWSInfo( (LPTSTR)(LPCTSTR) chTermName, &lSize, &pWS );
if( SUCCEEDED( hr ) && pWS != NULL )
{
hr = LoadPropertyValues( pInstance, ulRequiredProperties, pWS );
}
}
if ( pWS != NULL )
{
CoTaskMemFree(pWS);
}
return hr;
}
//=--------------------
/*****************************************************************************
*
* FUNCTION : CWin32_TSClientSetting::EnumerateInstances
*
* DESCRIPTION : Returns all the instances of this class.
*
* INPUTS : A pointer to the MethodContext for communication with WinMgmt.
* A long that contains the flags described in
* IWbemServices::CreateInstanceEnumAsync. Note that the following
* flags are handled by (and filtered out by) WinMgmt:
* WBEM_FLAG_DEEP, WBEM_FLAG_SHALLOW, WBEM_FLAG_RETURN_IMMEDIATELY,
* WBEM_FLAG_FORWARD_ONLY, WBEM_FLAG_BIDIRECTIONAL
*
* RETURNS : WBEM_S_NO_ERROR if successful
*
* COMMENTS : All instances on the machine are returned here and
* all properties that this class knows how to populate must
* be filled in. If there are no instances, return
* WBEM_S_NO_ERROR.
*****************************************************************************/
HRESULT CWin32_TSClientSetting::EnumerateInstances (MethodContext* pMethodContext, long lFlags )
{
HRESULT hr = WBEM_S_NO_ERROR;
DWORD dwData = 0;
ULONG ulTerminals = 0;
ULONG ulSize = 0;
LONG lSize = 0;
ULONG ulNum = 0;
PWS pWS = NULL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
hr = StackObj.m_pCfgComp->GetWinstationList(&ulTerminals, &ulSize, &pWS);
if( SUCCEEDED( hr ) && pWS != NULL )
{
for ( ulNum = 0; ulNum < ulTerminals && SUCCEEDED( hr ) ; ulNum++)
{
if(_tcsicmp(pWS[ulNum].Name, L"Console") == 0)
continue;
CInstance* pInstance = CreateNewInstance(pMethodContext);
if( pInstance == NULL)
{
ERR((TB,"TSClientSetting@EnumerateInstances: CreateNewInstance failed" ));
hr = WBEM_E_OUT_OF_MEMORY;
break;
}
TRC2((TB,"TSClientSetting@EnumerateInstances: GetWinstationList ret 0x%x\n" , hr ));
hr = LoadPropertyValues(pInstance, BIT_ALL_PROP, &pWS[ ulNum ] );
if( SUCCEEDED( hr ) )
{
hr = pInstance->Commit();
}
pInstance->Release( );
}
}
if ( pWS != NULL )
{
CoTaskMemFree(pWS);
}
return hr;
}
//=--------------------
HRESULT CWin32_TSClientSetting::LoadPropertyValues( CInstance *pInstance, ULONGLONG ulRequiredProperties, PWS pWS)
{
HRESULT hr = WBEM_S_NO_ERROR;
LONG lSize ;
DWORD dwData = 0;
BOOL bData = 0;
DWORD dwStatus = 0;
USERCONFIGW* pUser = NULL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
if( pInstance == NULL )
{
ERR((TB,"TSClientSetting@LoadPropertyValues: invalid pointer"));
return WBEM_E_ILLEGAL_NULL;
}
if( pInstance != NULL && pWS != NULL )
{
if( ulRequiredProperties & BIT_TERMINALNAME)
{
pInstance->SetCharSplat(m_szTerminalName, pWS->Name);
}
TRC2((TB,"TSClientSetting@LoadPropertyValues: GetTerminalName"));
hr = StackObj.m_pCfgComp->GetUserConfig(pWS->Name, &lSize, &pUser, TRUE);
TRC2((TB,"TSClientSetting@LoadPropertyValues ret 0x%x\n" , hr));
if( SUCCEEDED (hr) && pUser != NULL )
{
if( ulRequiredProperties & BIT_CONNECTIONPOLICY)
{
pInstance->SetDWORD(m_szConnectionPolicy, pUser->fInheritAutoClient);
TRC2((TB,"TSClientSetting@LoadPropertyValues: ConnectionPolicy" ));
}
if( ulRequiredProperties & BIT_CONNECTCLIENTDRIVESATLOGON)
{
pInstance->SetDWORD(m_szConnectClientDrivesAtLogon, pUser->fAutoClientDrives);
TRC2((TB,"TSClientSetting@LoadPropertyValues ConnectClientDrives"));
}
if( ulRequiredProperties & BIT_CONNECTPRINTERATLOGON)
{
pInstance->SetDWORD(m_szConnectPrinterAtLogon, pUser->fAutoClientLpts);
TRC2((TB,"TSClientSetting@LoadPropertyValues: ConnectPrinter"));
}
if( ulRequiredProperties & BIT_DEFAULTTOCLIENTPRINTER)
{
RegGetMachinePolicy(&m_gpPolicy);
if( m_gpPolicy.fPolicyForceClientLptDef != 0 )
{
pInstance->SetDWORD(m_szDefaultToClientPrinter, m_gpPolicy.fForceClientLptDef);
}
else
{
pInstance->SetDWORD(m_szDefaultToClientPrinter, pUser->fForceClientLptDef);
}
TRC2((TB,"TSClientSetting@LoadPropertyValues: DefaultToClientPrinter"));
}
if( ulRequiredProperties & BIT_LPTPORTMAPPING)
{
RegGetMachinePolicy(&m_gpPolicy);
if( m_gpPolicy.fPolicyDisableLPT != 0 )
{
pInstance->SetDWORD(m_szLPTPortMapping, m_gpPolicy.fDisableLPT);
}
else
{
pInstance->SetDWORD(m_szLPTPortMapping, pUser->fDisableLPT);
}
TRC2((TB,"TSClientSetting@LoadPropertyValues: WindowsPrinterMapping"));
}
if( ulRequiredProperties & BIT_WINDOWSPRINTERMAPPING)
{
RegGetMachinePolicy(&m_gpPolicy);
if( m_gpPolicy.fPolicyDisableCpm != 0 )
{
pInstance->SetDWORD(m_szWindowsPrinterMapping, m_gpPolicy.fDisableCpm);
}
else
{
pInstance->SetDWORD(m_szWindowsPrinterMapping, pUser->fDisableCpm);
}
TRC2((TB,"TSClientSetting@LoadPropertyValues: LPTPortMapping"));
}
if( ulRequiredProperties & BIT_COMPORTMAPPING)
{
RegGetMachinePolicy(&m_gpPolicy);
if( m_gpPolicy.fPolicyDisableCcm != 0 )
{
pInstance->SetDWORD(m_szCOMPortMapping, m_gpPolicy.fDisableCcm);
}
else
{
pInstance->SetDWORD(m_szCOMPortMapping, pUser->fDisableCcm);
}
TRC2((TB,"TSClientSetting@LoadPropertyValues: COMPortMapping"));
}
if( ulRequiredProperties & BIT_DRIVEMAPPING)
{
RegGetMachinePolicy(&m_gpPolicy);
if( m_gpPolicy.fPolicyDisableCdm != 0 )
{
pInstance->SetDWORD(m_szDriveMapping, m_gpPolicy.fDisableCdm);
}
else
{
pInstance->SetDWORD(m_szDriveMapping, pUser->fDisableCdm);
}
TRC2((TB,"TSClientSetting@LoadPropertyValues: DriveMapping"));
}
if( ulRequiredProperties & BIT_AUDIOMAPPING)
{
RegGetMachinePolicy(&m_gpPolicy);
if( m_gpPolicy.fPolicyDisableCam != 0 )
{
pInstance->SetDWORD(m_szAudioMapping, m_gpPolicy.fDisableCam);
}
else
{
pInstance->SetDWORD(m_szAudioMapping, pUser->fDisableCam);
}
TRC2((TB,"TSClientSetting@LoadPropertyValues: AudioMapping"));
}
if( ulRequiredProperties & BIT_CLIPBOARDMAPPING)
{
RegGetMachinePolicy(&m_gpPolicy);
if( m_gpPolicy.fPolicyDisableClip != 0 )
{
pInstance->SetDWORD(m_szClipboardMapping, m_gpPolicy.fDisableClip);
}
else
{
pInstance->SetDWORD(m_szClipboardMapping, pUser->fDisableClip);
}
TRC2((TB,"TSClientSetting@LoadPropertyValues ClipboardMapping"));
}
if( ulRequiredProperties & BIT_COLORDEPTHPOLICY)
{
RegGetMachinePolicy(&m_gpPolicy);
if( m_gpPolicy.fPolicyColorDepth != 0 )
{
dwData = 0;
}
else
{
hr = StackObj.m_pCfgComp->GetColorDepth( pWS->Name, &bData, &dwStatus);
dwData = bData;
}
pInstance->SetDWORD(m_szColorDepthPolicy, dwData);
TRC2((TB,"TSClientSetting@LoadPropertyValues: ColorDepthPolicy" ));
}
if( ulRequiredProperties & BIT_COLORDEPTH)
{
RegGetMachinePolicy(&m_gpPolicy);
if( m_gpPolicy.fPolicyColorDepth != 0 )
{
pInstance->SetDWORD(m_szColorDepth, m_gpPolicy.ColorDepth);
}
else
{
pInstance->SetDWORD(m_szColorDepth, pUser->ColorDepth);
}
TRC2((TB,"TSClientSetting@LoadPropertyValues: ColorDepth" ));
}
}
}
if( pUser != NULL )
{
CoTaskMemFree(pUser);
}
return hr;
}
//=--------------------
HRESULT CWin32_TSClientSetting::PutInstance ( const CInstance &Instance, long lFlags)
{
HRESULT hr= WBEM_S_NO_ERROR;
CHString chTermName ;
DWORD dwData = 0;
DWORD dwStatus = 0;
LONG lSize;
PUSERCONFIGW pUser = NULL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
Instance.GetCHString(m_szTerminalName, chTermName);
if( chTermName.GetLength() > WINSTATIONNAME_LENGTH )
{
return WBEM_E_VALUE_OUT_OF_RANGE;
}
if( chTermName.IsEmpty() != 0 )
{
return WBEM_E_ILLEGAL_NULL;
}
if(_tcsicmp(chTermName, L"Console") == 0 )
{
return WBEM_E_NOT_SUPPORTED;
}
hr = StackObj.m_pCfgComp->GetUserConfig( (LPTSTR)(LPCTSTR) chTermName, &lSize, &pUser, TRUE);
do
{
if( SUCCEEDED (hr) && pUser != NULL )
{
Instance.GetDWORD(m_szConnectionPolicy, dwData);
if( dwData != 0 && dwData != 1 )
{
hr = WBEM_E_INVALID_PARAMETER;
break;
}
pUser->fInheritAutoClient = dwData;
hr = StackObj.m_pCfgComp->SetUserConfig( (LPTSTR)(LPCTSTR) chTermName, lSize, pUser , &dwStatus );
if( SUCCEEDED( hr ) )
{
hr = StackObj.m_pCfgComp->ForceUpdate();
}
}
else
{
TRC2((TB,"TSClientSetting@PutInstance: ret 0x%x\n" , hr));
CHString sRelPath;
Instance.GetCHString(L"__RelPath", sRelPath);
CInstance *pErrorInstance = NULL;
hr = CWbemProviderGlue::GetInstanceByPath(pErrorClass, &pErrorInstance );
if( SUCCEEDED( hr ) )
{
TRC2((TB,"TSClientSetting@PutInstance: ret 0x%x\n" , hr));
if (pErrorInstance != NULL)
{
LoadString( g_hInstance , IDS_ERR_PUTTSCCONFIG, tchErrorMessage, SIZE_OF_BUFFER(tchErrorMessage) );
pErrorInstance->SetWCHARSplat(L"Description", tchErrorMessage);
LoadString( g_hInstance , IDS_ERR_PUTINSTANCE, tchErrorMessage, SIZE_OF_BUFFER(tchErrorMessage) );
pErrorInstance->SetWCHARSplat(L"Operation", tchErrorMessage);
pErrorInstance->SetCHString(L"ParameterInfo", sRelPath);
pErrorInstance->SetWCHARSplat(L"ProviderName", PROVIDER_NAME_Win32_WIN32_TSCLIENTSETTING_Prov);
pErrorInstance->SetDWORD(L"StatusCode", WBEM_E_INVALID_PARAMETER);
IWbemClassObject *pObj = pErrorInstance->GetClassObjectInterface();
if (pObj != NULL)
{
MethodContext *pMethodContext = Instance.GetMethodContext();
if (pMethodContext != NULL)
{
pMethodContext->SetStatusObject(pObj);
}
pObj->Release();
}
pErrorInstance->Release();
}
}
}
}while (0);
if ( pUser != NULL )
{
CoTaskMemFree(pUser);
}
return hr;
}
//=--------------------
HRESULT CWin32_TSClientSetting::ExecMethod ( const CInstance& Inst,
const BSTR bstrMethodName,
CInstance *pInParams,
CInstance *pOutParams,
long lFlags)
{
HRESULT hr = WBEM_E_NOT_FOUND;
CHString chTermName;
PUSERCONFIG pUser = NULL;
DWORD dwAutoData = 0;
DWORD dwData = 0;
DWORD dwStatus = 0;
LONG lSize;
bool fValue;
CHString chData;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
Inst.GetCHString(m_szTerminalName, chTermName);
if(chTermName.GetLength() > WINSTATIONNAME_LENGTH)
{
return WBEM_E_VALUE_OUT_OF_RANGE;
}
if( chTermName.IsEmpty() != 0)
{
return WBEM_E_ILLEGAL_NULL;
}
if(_tcsicmp(chTermName, L"Console") == 0)
{
return WBEM_E_NOT_SUPPORTED;
}
do
{
if( pInParams != NULL )
{
// Sets the properties ClientConnectDrivesAtLogon, ConnectPrinterAtLogon
// and DefaultPrinterToClient.
// uint32 ConnectSettings([In] uint32 ConnectClientDrivesAtLogon, [In] uint32 ConnectPrinterAtLogon, [In] uint32 DefaultToClientPrinter)
if( _wcsicmp( bstrMethodName, m_szConnectionSettings ) == 0 )
{
bool bRet;
RegGetMachinePolicy(&m_gpPolicy);
hr = StackObj.m_pCfgComp->GetUserConfig((LPTSTR)(LPCTSTR) chTermName, &lSize, &pUser, TRUE);
if( SUCCEEDED (hr) && pUser != NULL )
{
dwAutoData = pUser->fInheritAutoClient;
if( dwAutoData == 0 )
{
bRet = pInParams->GetDWORD(m_szConnectClientDrivesAtLogon, dwData);
if ( !bRet || ( dwData != 0 && dwData != 1 ) )
{
hr = WBEM_E_INVALID_PARAMETER;
break;
}
pUser->fAutoClientDrives = dwData;
bRet = pInParams->GetDWORD(m_szConnectPrinterAtLogon, dwData);
if( !bRet || ( dwData != 0 && dwData != 1 ) )
{
hr = WBEM_E_INVALID_PARAMETER;
break;
}
pUser->fAutoClientLpts = dwData;
bRet = pInParams->GetDWORD(m_szDefaultToClientPrinter, dwData);
if( !bRet || ( dwData != 0 && dwData != 1 ) )
{
hr = WBEM_E_INVALID_PARAMETER;
break;
}
if( m_gpPolicy.fPolicyForceClientLptDef == 0 )
{
pUser->fForceClientLptDef = dwData;
}
hr = StackObj.m_pCfgComp->SetUserConfig( (LPTSTR)(LPCTSTR) chTermName, lSize, pUser , &dwStatus );
TRC2((TB,"TSClientSetting@ExecMethod: ConnectSettings: ret 0x%x\n" , hr ));
if( pOutParams != NULL )
{
pOutParams->SetDWORD(L"ReturnValue", WBEM_S_NO_ERROR);
}
}
else
{
hr = WBEM_E_INVALID_OPERATION;
break;
}
}
}
else if( _wcsicmp( bstrMethodName, m_szSetColorDepthPolicy ) == 0 )
{
dwData = 0;
dwStatus = 0;
bool bRet;
RegGetMachinePolicy(&m_gpPolicy);
if( m_gpPolicy.fPolicyColorDepth == 0 )
{
TRC2((TB, "ColorDepth is not enabled by Group Policy."));
bRet = pInParams->GetDWORD(m_szColorDepthPolicy, dwData);
if ( !bRet || (dwData != 0 && dwData != 1 ))
{
hr = WBEM_E_INVALID_PARAMETER;
break;
}
hr = StackObj.m_pCfgComp->SetColorDepth( (LPTSTR)(LPCTSTR) chTermName, dwData , &dwStatus );
if( SUCCEEDED( hr ) && pOutParams != NULL )
{
hr = StackObj.m_pCfgComp->ForceUpdate();
pOutParams->SetDWORD(L"ReturnValue", WBEM_S_NO_ERROR);
TRC2((TB,"TSClientSetting@ExecMethod: ColorDepthPolicy ret 0x%x\n" , hr ));
}
}
else
{
hr = WBEM_E_INVALID_OPERATION;
break;
}
}
else if( _wcsicmp( bstrMethodName, m_szSetColorDepth ) == 0 )
{
dwData = 0;
dwStatus = 0;
bool bRet;
BOOL bData = 0;
RegGetMachinePolicy(&m_gpPolicy);
if( m_gpPolicy.fPolicyColorDepth == 0 )
{
TRC2((TB, "Condition to update fInheritColorDepth satisfied"));
hr = StackObj.m_pCfgComp->GetColorDepth( (LPTSTR)(LPCTSTR) chTermName, &bData, &dwStatus);
if( FAILED( hr ) || bData == 1)
{
hr = WBEM_E_INVALID_OPERATION;
break;
}
bRet = pInParams->GetDWORD(m_szColorDepth, dwData);
if ( !bRet || (dwData < 1 || dwData > 4 ))
{
hr = WBEM_E_INVALID_PARAMETER;
break;
}
TCHAR tchRegPath[ MAX_PATH ] = WINSTATION_REG_NAME;
HKEY hKey = NULL;
if (MAX_PATH < _tcslen(WINSTATION_REG_NAME)+ 2+ chTermName.GetLength())
{
hr = WBEM_E_INVALID_PARAMETER;
}
lstrcat( tchRegPath, L"\\");
lstrcat( tchRegPath , chTermName );
hr = RegOpenKeyEx( HKEY_LOCAL_MACHINE ,
tchRegPath ,
0,
KEY_READ | KEY_WRITE,
&hKey );
if( SUCCEEDED( hr) && hKey != NULL)
{
hr = RegSetValueEx( hKey ,
TEXT("ColorDepth"),
0 ,
REG_DWORD,
( LPBYTE )&dwData ,
sizeof(DWORD) );
RegCloseKey( hKey );
}
if( SUCCEEDED( hr ) && pOutParams != NULL )
{
hr = StackObj.m_pCfgComp->ForceUpdate();
pOutParams->SetDWORD(L"ReturnValue", WBEM_S_NO_ERROR);
TRC2((TB,"TSClientSetting@ExecMethod: ColorDepth ret 0x%x\n" , hr ));
}
else
{
hr = WBEM_E_INVALID_METHOD_PARAMETERS;
}
}
else
{
hr = WBEM_E_INVALID_OPERATION;
break;
}
}
// PropertyName is a string enumeration of the properties:
// LPTPortMapping, COMPortMapping, AudioMapping ClipboardMapping and WindowsPrinterMapping.
// They are False or True according as if the Value is set to 0 or 1 respectively.
// uint32 SetClientProperty([In] string PropertyName, [In] boolean Value)
else if( _wcsicmp( bstrMethodName, m_szSetClientProperty) == 0 )
{
BOOL bRet = 0;
fValue = 0;
hr = StackObj.m_pCfgComp->GetUserConfig((LPTSTR)(LPCTSTR) chTermName, &lSize, &pUser, TRUE);
RegGetMachinePolicy(&m_gpPolicy);
if( SUCCEEDED( hr ) && pUser != NULL && pOutParams != NULL)
{
pInParams->GetCHString(m_szPropertyName, chData);
if( chData.CompareNoCase(m_szLPTPortMapping) == 0 )
{
bRet = pInParams->Getbool(m_szValue, fValue);
TRC2((TB,"m_gpPolicy.fPolicyDisableLPT ret 0x%x\n", m_gpPolicy.fPolicyDisableLPT ));
if( m_gpPolicy.fPolicyDisableLPT == 0 )
{
TRC2((TB,"Condition to update fPolicyDisableLPT satisfied" ));
if( !bRet || (fValue != 0 && fValue != 1 ))
{
hr = WBEM_E_INVALID_PARAMETER;
break;
}
pUser->fDisableLPT = fValue;
pOutParams->SetDWORD(L"ReturnValue", WBEM_S_NO_ERROR);
}
else
{
hr = WBEM_E_INVALID_OPERATION;
break;
}
}
else if( chData.CompareNoCase(m_szCOMPortMapping) == 0 )
{
pInParams->Getbool(m_szValue, fValue);
TRC2((TB,"m_gpPolicy.fPolicyDisableCcm ret 0x%x\n", m_gpPolicy.fPolicyDisableCcm ));
if( (m_gpPolicy.fPolicyDisableCcm) == 0)
{
TRC2((TB,"Condition to update fPolicyDisableCcm satisfied" ));
if( fValue != 0 && fValue != 1 )
{
hr = WBEM_E_INVALID_PARAMETER;
break;
}
pUser->fDisableCcm = fValue;
pOutParams->SetDWORD(L"ReturnValue", WBEM_S_NO_ERROR);
}
else
{
hr = WBEM_E_INVALID_OPERATION;
break;
}
}
else if( chData.CompareNoCase(m_szAudioMapping) == 0 )
{
pInParams->Getbool(m_szValue, fValue);
TRC2((TB,"m_gpPolicy.fPolicyDisableCam ret 0x%x\n", m_gpPolicy.fPolicyDisableCam ));
if( (m_gpPolicy.fPolicyDisableCam) == 0)
{
if(fValue != 0 && fValue != 1 )
{
hr = WBEM_E_INVALID_PARAMETER;
break;
}
pUser->fDisableCam = fValue;
pOutParams->SetDWORD(L"ReturnValue", WBEM_S_NO_ERROR);
}
else
{
hr = WBEM_E_INVALID_OPERATION;
break;
}
}
else if( chData.CompareNoCase(m_szClipboardMapping) == 0 )
{
pInParams->Getbool(m_szValue, fValue);
TRC2((TB,"m_gpPolicy.fPolicyDisableClip ret 0x%x\n", m_gpPolicy.fPolicyDisableClip ));
if( (m_gpPolicy.fPolicyDisableClip) == 0 )
{
TRC2((TB,"Condition to update fPolicyDisableClip satisfied" ));
if( fValue != 0 && fValue != 1 )
{
hr = WBEM_E_INVALID_PARAMETER;
break;
}
pUser->fDisableClip = fValue;
pOutParams->SetDWORD(L"ReturnValue", WBEM_S_NO_ERROR);
}
else
{
hr = WBEM_E_INVALID_OPERATION;
break;
}
}
else if( chData.CompareNoCase(m_szWindowsPrinterMapping) == 0 )
{
pInParams->Getbool(m_szValue, fValue);
TRC2((TB,"m_gpPolicy.fPolicyDisableCpm ret 0x%x\n", m_gpPolicy.fPolicyDisableCpm ));
if( (m_gpPolicy.fPolicyDisableCpm) == 0)
{
TRC2((TB,"Condition to update fPolicyDisableCpm satisfied" ));
if( fValue != 0 && fValue != 1 )
{
hr = WBEM_E_INVALID_PARAMETER;
break;
}
pUser->fDisableCpm = fValue;
pOutParams->SetDWORD(L"ReturnValue", WBEM_S_NO_ERROR);
}
else
{
hr = WBEM_E_INVALID_OPERATION;
break;
}
}
else if( chData.CompareNoCase(m_szDriveMapping) == 0 )
{
pInParams->Getbool(m_szValue, fValue);
TRC2((TB,"m_gpPolicy.fPolicyDisableCdm ret 0x%x\n", m_gpPolicy.fPolicyDisableCdm ));
if( (m_gpPolicy.fPolicyDisableCdm) == 0)
{
TRC2((TB,"Condition to update fPolicyDisableCdm satisfied" ));
if( fValue != 0 && fValue != 1 )
{
hr = WBEM_E_INVALID_PARAMETER;
break;
}
pUser->fDisableCdm = fValue;
pOutParams->SetDWORD(L"ReturnValue", WBEM_S_NO_ERROR);
}
else
{
hr = WBEM_E_INVALID_OPERATION;
break;
}
}
else
{
hr = WBEM_E_INVALID_METHOD;
break;
}
hr = StackObj.m_pCfgComp->SetUserConfig( (LPTSTR)(LPCTSTR) chTermName, lSize, pUser , &dwStatus );
if( SUCCEEDED( hr ))
{
hr = StackObj.m_pCfgComp->ForceUpdate();
}
}
}
}
}while (0);
if( pUser != NULL )
{
CoTaskMemFree( pUser );
}
return hr;
}
//=-----------------
HRESULT CWin32_TSClientSetting::ExecQuery (MethodContext *pMethodContext, CFrameworkQuery& Query, long lFlags)
{
HRESULT hr = WBEM_E_NOT_FOUND;
ULONGLONG ulRequiredProperties = 0;
CHStringArray asNames;
ULONG ulNum = 0;
ULONG ulSize = 0;
ULONG ulTerminals = 0;
PWS pWS = NULL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
// Method 2
Query.GetValuesForProp(m_szTerminalName, asNames);
BOOL bGetAllInstances = asNames.GetSize() == 0;
// Method 1
if (Query.IsPropertyRequired(m_szTerminalName))
ulRequiredProperties |= BIT_TERMINALNAME;
if (Query.IsPropertyRequired(m_szAudioMapping))
ulRequiredProperties |= BIT_AUDIOMAPPING;
if (Query.IsPropertyRequired(m_szClipboardMapping))
ulRequiredProperties |= BIT_CLIPBOARDMAPPING;
if (Query.IsPropertyRequired(m_szCOMPortMapping))
ulRequiredProperties |= BIT_COMPORTMAPPING;
if (Query.IsPropertyRequired(m_szConnectClientDrivesAtLogon))
ulRequiredProperties |= BIT_CONNECTCLIENTDRIVESATLOGON;
if (Query.IsPropertyRequired(m_szConnectionPolicy))
ulRequiredProperties |= BIT_CONNECTIONPOLICY;
if (Query.IsPropertyRequired(m_szConnectPrinterAtLogon))
ulRequiredProperties |= BIT_CONNECTPRINTERATLOGON;
if (Query.IsPropertyRequired(m_szDefaultToClientPrinter))
ulRequiredProperties |= BIT_DEFAULTTOCLIENTPRINTER;
if (Query.IsPropertyRequired(m_szDriveMapping))
ulRequiredProperties |= BIT_DRIVEMAPPING;
if (Query.IsPropertyRequired(m_szLPTPortMapping))
ulRequiredProperties |= BIT_LPTPORTMAPPING;
if (Query.IsPropertyRequired(m_szWindowsPrinterMapping))
ulRequiredProperties |= BIT_WINDOWSPRINTERMAPPING;
if (Query.IsPropertyRequired(m_szColorDepth))
ulRequiredProperties |= BIT_COLORDEPTH;
if (Query.IsPropertyRequired(m_szColorDepthPolicy))
ulRequiredProperties |= BIT_COLORDEPTHPOLICY;
hr = StackObj.m_pCfgComp->GetWinstationList(&ulTerminals, &ulSize, &pWS);
if( SUCCEEDED( hr ) && pWS != NULL )
{
for( ulNum = 0; ulNum < ulTerminals ; ulNum++)
{
if(_tcsicmp(pWS[ulNum].Name, L"Console") == 0)
continue;
// Method 2
if( bGetAllInstances || IsInList(asNames, pWS[ulNum].Name))
{
CInstance* pInstance = CreateNewInstance(pMethodContext);
if( pInstance == NULL)
{
ERR((TB,"TSClientSetting@ExecQuery: CreateNewInstance failed" ));
hr = WBEM_E_OUT_OF_MEMORY;
break;
}
pInstance->SetCHString(m_szTerminalName, CHString(pWS[ulNum].Name));
hr = LoadPropertyValues( pInstance, ulRequiredProperties, &pWS[ ulNum ] );
if( SUCCEEDED( hr ) )
{
hr = pInstance->Commit();
}
pInstance->Release();
}
}
}
if( pWS != NULL )
{
CoTaskMemFree(pWS);
}
return hr;
}
//=----------------------Win32_TSNetworkAdapterSetting---------------------
CWin32_TSNetworkAdapterSetting::CWin32_TSNetworkAdapterSetting (LPCWSTR lpwszName, LPCWSTR lpwszNameSpace ) :
Provider( lpwszName, lpwszNameSpace )
{
if( g_hInstance != NULL)
{
TRC2((TB, "CWin32_TSNetworkAdapterSetting_ctor"));
_tcscpy(m_szNetworkAdapterID, _T("NetworkAdapterID"));
_tcscpy(m_szNetworkAdapterIP, _T("NetworkAdapterIP"));
_tcscpy(m_szNetworkAdapterName, _T("NetworkAdapterName"));
_tcscpy(m_szMaximumConnections, _T("MaximumConnections"));
_tcscpy(m_szSelectNetworkAdapterIP, _T("SelectNetworkAdapterIP"));
_tcscpy(m_szSelectAllNetworkAdapters, _T("SelectAllNetworkAdapters"));
_tcscpy(m_szTerminalName, _T("TerminalName"));
}
RegGetMachinePolicy(&m_gpPolicy);
}
//=--------------------
CWin32_TSNetworkAdapterSetting::~CWin32_TSNetworkAdapterSetting ()
{
}
//=---------------
BOOL CWin32_TSNetworkAdapterSetting::IsInList(const CHStringArray &asArray, LPCWSTR pszString)
{
DWORD dwSize = asArray.GetSize();
for (DWORD x=0; x < dwSize; x++)
{
if (asArray[x].CompareNoCase(pszString) == 0)
{
return TRUE;
}
}
return FALSE;
}
//=--------------------
HRESULT CWin32_TSNetworkAdapterSetting::GetObject ( CInstance* pInstance, long lFlags, CFrameworkQuery &Query )
{
HRESULT hr = WBEM_E_NOT_FOUND;
PWS pWS = NULL;
LONG lSize;
ULONGLONG ulRequiredProperties = 0;
CHString chTermName;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
if( pInstance == NULL )
{
ERR((TB,"TSNetworkAdapterSetting@GetObject: invalid pointer" ));
return WBEM_E_ILLEGAL_NULL;
}
pInstance->GetCHString(m_szTerminalName, chTermName);
if(chTermName.GetLength() > WINSTATIONNAME_LENGTH)
{
return WBEM_E_VALUE_OUT_OF_RANGE;
}
if(chTermName.IsEmpty() != 0)
{
return WBEM_E_ILLEGAL_NULL;
}
if(_tcsicmp(chTermName, L"Console") == 0)
{
return WBEM_E_NOT_SUPPORTED;
}
if (Query.IsPropertyRequired(m_szTerminalName))
ulRequiredProperties |= BIT_TERMINALNAME;
if (Query.IsPropertyRequired(m_szNetworkAdapterID))
ulRequiredProperties |= BIT_NETWORKADAPTERID;
if (Query.IsPropertyRequired(m_szMaximumConnections))
ulRequiredProperties |= BIT_MAXIMUMCONNECTIONS;
if ( pInstance != NULL )
{
hr = StackObj.m_pCfgComp->GetWSInfo((LPTSTR)(LPCTSTR) chTermName, &lSize, &pWS);
if( SUCCEEDED( hr ) && pWS != NULL )
{
hr = LoadPropertyValues(pInstance, ulRequiredProperties, pWS );
}
}
if ( pWS != NULL )
{
CoTaskMemFree(pWS);
}
return hr;
}
//=--------------------
/*****************************************************************************
*
* FUNCTION : CWin32_TSNetworkAdapterSetting::EnumerateInstances
*
* DESCRIPTION : Returns all the instances of this class.
*
* INPUTS : A pointer to the MethodContext for communication with WinMgmt.
* A long that contains the flags described in
* IWbemServices::CreateInstanceEnumAsync. Note that the following
* flags are handled by (and filtered out by) WinMgmt:
* WBEM_FLAG_DEEP, WBEM_FLAG_SHALLOW, WBEM_FLAG_RETURN_IMMEDIATELY,
* WBEM_FLAG_FORWARD_ONLY, WBEM_FLAG_BIDIRECTIONAL
*
* RETURNS : WBEM_S_NO_ERROR if successful
*
* COMMENTS : All instances on the machine are returned here and
* all properties that this class knows how to populate must
* be filled in. If there are no instances, return
* WBEM_S_NO_ERROR.
*****************************************************************************/
HRESULT CWin32_TSNetworkAdapterSetting::EnumerateInstances (MethodContext* pMethodContext, long lFlags )
{
HRESULT hr = WBEM_S_NO_ERROR;
DWORD dwData = 0;
ULONG ulTerminals = 0;
ULONG ulSize = 0;
LONG lSize = 0;
ULONG ulNum = 0;
PWS pWS = NULL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
hr = StackObj.m_pCfgComp->GetWinstationList(&ulTerminals, &ulSize, &pWS);
if( SUCCEEDED( hr ) && pWS != NULL )
{
for( ulNum = 0; ulNum < ulTerminals && SUCCEEDED( hr ) ; ulNum++)
{
CInstance* pInstance = CreateNewInstance(pMethodContext);
if( pInstance == NULL)
{
ERR((TB,"TSNetworkAdapterSetting@EnumerateInstances: CreateNewInstance failed" ));
hr = WBEM_E_OUT_OF_MEMORY;
break;
}
TRC2((TB,"TSNetworkAdapterSetting@EnumerateInstances: GetWinstationList ret 0x%x\n" , hr ));
if( _tcsicmp( pWS[ulNum].pdName, L"Console") != 0 )
{
hr = LoadPropertyValues(pInstance, BIT_ALL_PROP, &pWS[ulNum] );
if( SUCCEEDED( hr ) )
{
hr = pInstance->Commit();
}
pInstance->Release( );
}
}
}
if( pWS != NULL )
{
CoTaskMemFree(pWS);
}
return hr;
}
//=--------------------
HRESULT CWin32_TSNetworkAdapterSetting::LoadPropertyValues( CInstance *pInstance, ULONGLONG ulRequiredProperties, PWS pWS)
{
HRESULT hr = WBEM_S_NO_ERROR;
PUSERCONFIGW pUser = NULL;
LONG lSize ;
ULONG ulNAdapters =0;
DWORD dwData = 0;
DWORD dwStatus = 0;
int i = 0;
TCHAR tch = ';';
TCHAR tchGuid[ GUID_LENGTH ];
PGUIDTBL pGuidtbl = NULL;
CHString chGuid;
CHString chAllGuids;
CHString chName;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
if( pInstance == NULL )
{
ERR((TB,"TSNetworkAdapterSetting@LoadPropertyValues: invalid pointer"));
return WBEM_E_ILLEGAL_NULL;
}
if( pInstance != NULL && pWS != NULL )
{
if( ulRequiredProperties & BIT_TERMINALNAME)
{
pInstance->SetCharSplat(m_szTerminalName, pWS->Name);
}
hr = StackObj.m_pCfgComp->GetUserConfig(pWS->Name, &lSize, &pUser, TRUE);
TRC2((TB,"TSNetworkAdapterSetting@LoadPropertyValues: GetUserConfig ret 0x%x\n" , hr));
if( SUCCEEDED( hr ) && pUser != NULL )
{
if( ulRequiredProperties & BIT_NETWORKADAPTERID)
{
pInstance->SetDWORD(m_szNetworkAdapterID, pWS->LanAdapter);
}
TRC2((TB,"TSNetworkAdapterSetting@LoadPropertyValues: NetworkAdapterID"));
if( ulRequiredProperties & BIT_MAXIMUMCONNECTIONS)
{
RegGetMachinePolicy(&m_gpPolicy);
if( m_gpPolicy.fPolicyMaxInstanceCount != 0 )
{
pInstance->SetDWORD(m_szMaximumConnections, m_gpPolicy.MaxInstanceCount);
}
else
{
pInstance->SetDWORD(m_szMaximumConnections, pWS->uMaxInstanceCount);
}
}
TRC2((TB,"TSNetworkAdapterSetting@LoadPropertyValues: MaxConnections"));
hr = StackObj.m_pCfgComp->GetLanAdapterList2(pWS->pdName, &ulNAdapters , &pGuidtbl );
chAllGuids.Empty();
chGuid.Empty();
if( pWS->LanAdapter != ((ULONG)-1))
{
StringFromGUID2 (( pGuidtbl )[ pWS->LanAdapter ].guidNIC, tchGuid, ARRAYSIZE(tchGuid));
chGuid.Format (L"%s", tchGuid);
pInstance->SetCharSplat(m_szNetworkAdapterID, tchGuid);
chName = ( pGuidtbl )[ pWS->LanAdapter ].DispName;
pInstance->SetCHString(m_szNetworkAdapterName, chName);
}
else
{
pInstance->SetCHString(m_szNetworkAdapterName, L"");
}
}
}
if( pUser != NULL )
{
CoTaskMemFree(pUser);
}
if( pGuidtbl != NULL )
{
CoTaskMemFree(pGuidtbl);
}
return S_OK;
}
//=--------------------
HRESULT CWin32_TSNetworkAdapterSetting::PutInstance ( const CInstance &Instance, long lFlags)
{
HRESULT hr= WBEM_S_NO_ERROR;
CHString chTermName ;
DWORD dwData = 0;
LONG lSize;
DWORD dwStatus = 0;
PWS pWS = NULL;
BOOL bRet = 0;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
Instance.GetCHString(m_szTerminalName, chTermName);
if( chTermName.GetLength() > WINSTATIONNAME_LENGTH )
{
return WBEM_E_VALUE_OUT_OF_RANGE;
}
if( chTermName.IsEmpty() != 0 )
{
return WBEM_E_ILLEGAL_NULL;
}
if(_tcsicmp(chTermName, L"Console") == 0)
{
return WBEM_E_NOT_SUPPORTED;
}
hr = StackObj.m_pCfgComp->GetWSInfo((LPTSTR)(LPCTSTR) chTermName, &lSize, &pWS);
RegGetMachinePolicy( &m_gpPolicy );
do
{
if( SUCCEEDED (hr) && pWS != NULL )
{
bRet = Instance.GetDWORD(m_szMaximumConnections, dwData);
TRC2((TB,"m_gpPolicy.fPolicyMaxInstanceCount ret 0x%x\n", m_gpPolicy.fPolicyMaxInstanceCount));
if( m_gpPolicy.fPolicyMaxInstanceCount == 0 && bRet )
{
TRC2((TB,"m_gpPolicy.fPolicyMaxInstanceCount satisfied"));
pWS->uMaxInstanceCount = dwData;
hr = StackObj.m_pCfgComp->UpDateWS( pWS, BIT_ALL_PROPS , &dwStatus, TRUE );
}
else
{
hr = WBEM_E_INVALID_OPERATION;
break;
}
}
else
{
TRC2((TB,"TSNetworkAdapterSetting@PutInstance ret 0x%x\n" , hr));
CHString sRelPath;
Instance.GetCHString(L"__RelPath", sRelPath);
CInstance *pErrorInstance = NULL;
hr = CWbemProviderGlue::GetInstanceByPath(pErrorClass, &pErrorInstance );
if( SUCCEEDED( hr ) )
{
TRC2((TB,"TSNetworkAdapterSetting@PutInstance ret 0x%x\n" , hr));
if( pErrorInstance != NULL )
{
LoadString( g_hInstance , IDS_ERR_PUTTSNCONFIG, tchErrorMessage, SIZE_OF_BUFFER(tchErrorMessage) );
pErrorInstance->SetWCHARSplat(L"Description", tchErrorMessage);
LoadString( g_hInstance , IDS_ERR_PUTINSTANCE, tchErrorMessage, SIZE_OF_BUFFER(tchErrorMessage) );
pErrorInstance->SetWCHARSplat(L"Operation", tchErrorMessage);
pErrorInstance->SetCHString(L"ParameterInfo", sRelPath);
pErrorInstance->SetWCHARSplat(L"ProviderName", PROVIDER_NAME_Win32_WIN32_TSNETWORKADAPTERSETTING_Prov);
pErrorInstance->SetDWORD(L"StatusCode", WBEM_E_INVALID_PARAMETER);
IWbemClassObject *pObj = pErrorInstance->GetClassObjectInterface();
if( pObj != NULL )
{
MethodContext *pMethodContext = Instance.GetMethodContext();
if( pMethodContext != NULL )
{
pMethodContext->SetStatusObject(pObj);
}
pObj->Release();
}
pErrorInstance->Release();
}
}
}
}while (0);
if( pWS != NULL )
{
CoTaskMemFree(pWS);
}
return hr;
}
//=--------------------
HRESULT CWin32_TSNetworkAdapterSetting::ExecMethod ( const CInstance& Inst,
const BSTR bstrMethodName,
CInstance *pInParams,
CInstance *pOutParams,
long lFlags)
{
HRESULT hr = WBEM_E_NOT_FOUND;
CHString chTermName;
PWS pWS= NULL;
PWS pWSList= NULL;
CRegistry oRegObject;
PIP_ADAPTER_INFO pAdapterInfo = NULL, pAdapt = NULL;
PGUIDTBL pGuidtbl = NULL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
Inst.GetCHString(m_szTerminalName, chTermName);
if( chTermName.GetLength() > WINSTATIONNAME_LENGTH)
{
return WBEM_E_VALUE_OUT_OF_RANGE;
}
if( chTermName.IsEmpty() != 0)
{
return WBEM_E_ILLEGAL_NULL;
}
if(_tcsicmp(chTermName, L"Console") == 0)
{
return WBEM_E_NOT_SUPPORTED;
}
// Selects all the LanAdapters on the machine.
// uint32 SelectAllNetworkAdapters();
do
{
if( _wcsicmp(bstrMethodName, m_szSelectAllNetworkAdapters) == 0 )
{
ULONG ulTerminals = 0;
ULONG ulNum = 0;
LONG lNum = 0;
ULONG ulSize = 0;
DWORD dwStatus = 0;
DWORD dwData = 0;
LONG lSize;
ULONG ulNumAdapters;
CHStringArray a_chNetworkAdapterIDs;
TCHAR tchGuid[ GUID_LENGTH ];
hr = StackObj.m_pCfgComp->GetWSInfo((LPTSTR)(LPCTSTR) chTermName, &lSize, &pWS);
if( SUCCEEDED (hr) )
{
hr = StackObj.m_pCfgComp->GetWinstationList(&ulTerminals, &ulSize, &pWSList);
if( SUCCEEDED( hr ) && pWSList != NULL )
{
for( ulNum = 0; ulNum < ulTerminals ; ulNum++ )
{
if( pWSList[ulNum].LanAdapter == 0 )
{
hr = WBEM_E_ALREADY_EXISTS;
goto Cleanup;
}
}
hr = StackObj.m_pCfgComp->GetWSInfo( (LPTSTR)(LPCTSTR) chTermName, &lSize, &pWS );
pWS->LanAdapter = 0;
hr = StackObj.m_pCfgComp->UpDateWS( pWS, BIT_ALL_PROPS , &dwStatus, TRUE );
}
if( pOutParams != NULL && SUCCEEDED( hr ))
{
TRC2((TB,"TSNetworkAdapterSetting@ExecMethod: GetNetworkAdapterIDs ret 0x%x\n" , hr));
pOutParams->SetDWORD(L"ReturnValue", WBEM_S_NO_ERROR);
}
}
else
{
hr = WBEM_E_INVALID_OPERATION;
}
}
else if( _wcsicmp(bstrMethodName, m_szSelectNetworkAdapterIP) == 0 )
{
ULONG ulTerminals = 0;
ULONG ulSize = 0;
DWORD dwStatus = 0;
DWORD dwData = 0;
LONG lSize = 0;
BOOL bUniq = FALSE;
ULONG ulAdapters = 0;
TCHAR tchRootKey[ MAX_PATH ] = L"";
TCHAR tchGuid[ GUID_LENGTH ];
TCHAR tchSearchGuid[GUID_LENGTH] = L"";
TCHAR tchSelectGuid[ GUID_LENGTH ] = L"";
HKEY hKey;
CHString chGuid;
DWORD AdapterInfoSize;
PIP_ADDR_STRING pAddrStr;
DWORD Err = 0;
CHString chAddress;
chAddress.Empty();
TCHAR tchAdd[MAX_PATH]=L"";
TCHAR tchAdapterName[MAX_PATH] = L"";
if(pInParams == NULL)
{
hr = WBEM_E_INVALID_METHOD_PARAMETERS;
break;
}
pInParams->GetCHString(m_szNetworkAdapterIP, chAddress);
if( chAddress.IsEmpty() != 0 )
{
hr = WBEM_E_INVALID_METHOD_PARAMETERS;
break;
}
//
// Enumerate all of the adapter specific information using the IP_ADAPTER_INFO structure.
// Note: IP_ADAPTER_INFO contains a linked list of adapter entries.
//
AdapterInfoSize = 0;
GetAdaptersInfo(NULL, &AdapterInfoSize);
if(AdapterInfoSize == 0)
{
hr = WBEM_E_OUT_OF_MEMORY;
break;
}
if( chAddress.GetLength() > GUID_LENGTH )
{
hr = WBEM_E_OUT_OF_MEMORY;
break;
}
// Allocate memory from sizing information
if ((pAdapterInfo = (PIP_ADAPTER_INFO) GlobalAlloc(GPTR, AdapterInfoSize)) == NULL)
{
hr = WBEM_E_OUT_OF_MEMORY;
break;
}
// Get actual adapter information
if ((Err = GetAdaptersInfo(pAdapterInfo, &AdapterInfoSize)) != 0)
{
hr = WBEM_E_OUT_OF_MEMORY;
break;
}
pAdapt = pAdapterInfo;
for (; pAdapt ; pAdapt = pAdapt->Next)
{
pAddrStr = &(pAdapt->IpAddressList);
while(pAddrStr)
{
MultiByteToWideChar(GetACP(), 0, pAddrStr->IpAddress.String, -1, tchAdd, MAX_PATH);
MultiByteToWideChar(GetACP(), 0, pAdapt->AdapterName, -1, tchAdapterName, MAX_PATH);
if( !_tcsicmp(chAddress, tchAdd))
goto Label;
pAddrStr = pAddrStr->Next;
}
}
hr = WBEM_E_INVALID_PARAMETER;
goto Cleanup;
Label:
hr = StackObj.m_pCfgComp->GetWSInfo((LPTSTR)(LPCTSTR) chTermName, &lSize, &pWS);
if( SUCCEEDED( hr ) && pWS != NULL)
{
hr = StackObj.m_pCfgComp->GetLanAdapterList2(pWS->pdName, &ulAdapters , &pGuidtbl );
hr = StackObj.m_pCfgComp->GetWinstationList(&ulTerminals, &ulSize, &pWSList);
if( SUCCEEDED( hr ) && pGuidtbl != NULL)
{
for( int i = 0 ; i < ulAdapters ; i++)
{
StringFromGUID2( ( pGuidtbl )[ i ].guidNIC , tchGuid , ARRAYSIZE( tchGuid ) );
if( _tcsicmp( tchGuid, tchAdapterName ) != 0 )
{
continue;
}
StringFromGUID2( ( pGuidtbl )[ pWS->LanAdapter ].guidNIC , tchSearchGuid , ARRAYSIZE( tchSearchGuid ) );
if( _tcsicmp( tchSearchGuid, tchAdapterName ) == 0 )
{
hr = WBEM_E_ALREADY_EXISTS;
goto Cleanup;
}
if( SUCCEEDED(hr) && ulTerminals == 2)
{
bUniq = TRUE;
}
else
{
hr = StackObj.m_pCfgComp->IsNetWorkConnectionUnique(pWS->wdName, pWS->pdName, i, &bUniq);
}
if( SUCCEEDED( hr ) && bUniq == TRUE )
{
pWS->LanAdapter = i;
hr = StackObj.m_pCfgComp->UpDateWS( pWS, BIT_ALL_PROPS , &dwStatus, TRUE );
if( SUCCEEDED( hr ))
{
if( SUCCEEDED( hr ) && pOutParams != NULL)
{
pOutParams->SetDWORD(L"ReturnValue", WBEM_S_NO_ERROR);
TRC2((TB,"TSNetworkAdapterSetting@ExecMethod: SelectNetworkAdapterIP ret 0x%x\n" , hr));
}
}
}
else
{
hr = WBEM_E_ALREADY_EXISTS;
}
}
}
}
TRC2((TB,"TSNetworkAdapterSetting@ExecMethod: SelectNetworkAdapterIP ret 0x%x\n" , hr));
}
else
{
hr = WBEM_E_INVALID_METHOD;
break;
}
}while (0);
Cleanup:
if ( pGuidtbl != NULL )
{
CoTaskMemFree(pGuidtbl);
pGuidtbl = NULL;
}
if(pAdapterInfo)
{
GlobalFree(pAdapterInfo);
}
if( pWS != NULL )
{
CoTaskMemFree( pWS );
}
if( pWSList != NULL )
{
CoTaskMemFree( pWSList );
}
return hr;
}
//=--------------------
HRESULT CWin32_TSNetworkAdapterSetting::ExecQuery (MethodContext *pMethodContext, CFrameworkQuery& Query, long lFlags)
{
HRESULT hr = WBEM_E_NOT_FOUND;
ULONGLONG ulRequiredProperties = 0;
CHStringArray asNames;
ULONG ulNum = 0;
ULONG ulSize = 0;
ULONG ulTerminals = 0;
PWS pWS = NULL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
// Method 2
Query.GetValuesForProp(m_szTerminalName, asNames);
BOOL bGetAllInstances = asNames.GetSize() == 0;
// Method 1
if (Query.IsPropertyRequired(m_szTerminalName))
ulRequiredProperties |= BIT_TERMINALNAME;
if (Query.IsPropertyRequired(m_szNetworkAdapterID))
ulRequiredProperties |= BIT_NETWORKADAPTERID;
if (Query.IsPropertyRequired(m_szMaximumConnections))
ulRequiredProperties |= BIT_MAXIMUMCONNECTIONS;
hr = StackObj.m_pCfgComp->GetWinstationList(&ulTerminals, &ulSize, &pWS);
if( SUCCEEDED( hr ) && pWS != NULL )
{
for( ulNum = 0; ulNum < ulTerminals && SUCCEEDED( hr ) ; ulNum++ )
{
if(_tcsicmp(pWS[ulNum].Name, L"Console") == 0)
continue;
// Method 2
if( bGetAllInstances || IsInList(asNames, pWS[ulNum].Name) )
{
CInstancePtr pInstance (NULL);
pInstance.Attach( CreateNewInstance( pMethodContext ) );
if( pInstance == NULL)
{
ERR((TB,"TSNetworkAdapterSetting@ExecQuery: CreateNewInstance failed"));
hr = WBEM_E_OUT_OF_MEMORY;
break;
}
pInstance->SetCHString(m_szTerminalName, CHString(pWS[ulNum].Name));
hr = LoadPropertyValues( pInstance, ulRequiredProperties, &pWS[ ulNum ] );
if( SUCCEEDED( hr ) )
{
hr = pInstance->Commit();
}
}
}
}
if( pWS != NULL )
{
CoTaskMemFree(pWS);
}
return hr;
}
//=----------------------Win32_TSPermissionsSettingsConfig---------------------
CWin32_TSPermissionsSetting::CWin32_TSPermissionsSetting (LPCWSTR lpwszName, LPCWSTR lpwszNameSpace ) :
Provider( lpwszName, lpwszNameSpace )
{
if( g_hInstance != NULL )
{
TRC2((TB, "CWin32_TSPermissionsSetting_ctor"));
_tcscpy(m_szPermissionPreSet, _T("PermissionPreSet"));
_tcscpy(m_szPermissionMask, _T("PermissionMask"));
_tcscpy(m_szAccountName, _T("AccountName"));
_tcscpy(m_szAddAccount, _T("AddAccount"));
_tcscpy(m_szRestoreDefaults, _T("RestoreDefaults"));
_tcscpy(m_szTerminalName, _T("TerminalName"));
}
}
//=--------------------
CWin32_TSPermissionsSetting::~CWin32_TSPermissionsSetting ()
{
}
//=---------------
BOOL CWin32_TSPermissionsSetting::IsInList(const CHStringArray &asArray, LPCWSTR pszString)
{
DWORD dwSize = asArray.GetSize();
for( DWORD x=0; x < dwSize; x++ )
{
if( asArray[x].CompareNoCase(pszString) == 0 )
{
return TRUE;
}
}
return FALSE;
}
//=---------------------
HRESULT CWin32_TSPermissionsSetting::GetObject ( CInstance* pInstance, long lFlags, CFrameworkQuery &Query )
{
HRESULT hr = WBEM_E_NOT_FOUND;
LONG lSize;
ULONGLONG ulRequiredProperties = 0;
PWS pWS = NULL;
CHString chTermName;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
TRC2((TB,"TSCFGWMI!CWin32_TSPermissionsSetting_GetObject"));
if( pInstance == NULL )
{
ERR((TB,"TSPermissionsSetting@GetObject: invalid pointer" ));
return WBEM_E_ILLEGAL_NULL;
}
pInstance->GetCHString(m_szTerminalName, chTermName);
if( chTermName.GetLength() > WINSTATIONNAME_LENGTH)
{
return WBEM_E_VALUE_OUT_OF_RANGE;
}
if( chTermName.IsEmpty() != 0)
{
return WBEM_E_ILLEGAL_NULL;
}
if (Query.IsPropertyRequired(m_szTerminalName))
ulRequiredProperties |= BIT_TERMINALNAME;
hr = StackObj.m_pCfgComp->GetWSInfo( ( LPTSTR )( LPCTSTR )chTermName, &lSize, &pWS);
if( SUCCEEDED (hr) && pWS != NULL )
{
hr = LoadPropertyValues(pInstance, ulRequiredProperties, pWS);
}
else
{
hr = WBEM_E_INVALID_OBJECT;
}
if( pWS != NULL )
{
CoTaskMemFree(pWS);
}
return hr ;
/*
HRESULT hr = WBEM_E_NOT_FOUND;
// get the object for the Win32_Terminal
CHString chsTerminal;
CInstancePtr pTerminal(NULL);
if( pInstance != NULL )
{
pInstance->GetCHString(L"Element", chsTerminal);
MethodContext* pMethodContext = pInstance->GetMethodContext();
hr = CWbemProviderGlue::GetInstanceByPath(chsTerminal, &pTerminal, pMethodContext);
TRC2((TB,"TSPermissionsSetting@GetObject: GetInstanceByPath ret 0x%x\n" , hr ));
do
{
if( SUCCEEDED( hr ) && pTerminal != NULL)
{
// Got the account. Now, match it to the GUID.
// first, generate a relpath with which to compare.
CHString chTSAccountSettingInstance;
CHString chTermName;
DWORD dwIndex = 0;
pTerminal->GetCHString(m_szTerminalName, chTermName);
// create a relpath for the sid
CHString chsTSAccountSettingPath;
chsTSAccountSettingPath.Format(L"\\\\%s\\%s:%s.%s=\"%s\"", (LPCTSTR)GetLocalComputerName(), L"root\\cimv2", L"Win32_TSAccount", m_szTerminalName, (LPCTSTR)chTermName);
// get the SID path from the instance
// pInstance->SetCHString(L"Setting", chsTSAccountSettingPath);
pInstance->SetCHString(L"Setting", chTSAccountSettingInstance);
pInstance->SetCHString(m_szTerminalName, chTermName);
}
}while (0);
}
return(hr);
*/
}
//=--------------------
/*****************************************************************************
*
* FUNCTION : CWin32_TSPermissionsSetting::EnumerateInstances
*
* DESCRIPTION : Returns all the instances of this class.
*
* INPUTS : A pointer to the MethodContext for communication with WinMgmt.
* A long that contains the flags described in
* IWbemServices::CreateInstanceEnumAsync. Note that the following
* flags are handled by (and filtered out by) WinMgmt:
* WBEM_FLAG_DEEP, WBEM_FLAG_SHALLOW, WBEM_FLAG_RETURN_IMMEDIATELY,
* WBEM_FLAG_FORWARD_ONLY, WBEM_FLAG_BIDIRECTIONAL
*
* RETURNS : WBEM_S_NO_ERROR if successful
*
* COMMENTS : All instances on the machine are returned here and
* all properties that this class knows how to populate must
* be filled in. If there are no instances, return
* WBEM_S_NO_ERROR.
*****************************************************************************/
HRESULT CWin32_TSPermissionsSetting::EnumerateInstances (MethodContext* pMethodContext, long lFlags )
{
HRESULT hr = WBEM_S_NO_ERROR;
ULONG ulNum = 0;
ULONG ulSize = 0;
ULONG ulTerminals = 0;
PWS pWS = NULL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
hr = StackObj.m_pCfgComp->GetWinstationList(&ulTerminals, &ulSize, &pWS);
TRC2((TB,"TSPermissionsSetting@EnumerateInstances: GetWinstationList ret 0x%x" , hr ));
if( SUCCEEDED( hr ) && pWS != NULL )
{
for ( ulNum = 0; ulNum < ulTerminals && SUCCEEDED( hr ) ; ulNum++)
{
CInstance* pInstance = CreateNewInstance(pMethodContext);
if( pInstance == NULL)
{
ERR((TB,"TSPermissionsSetting@EnumerateInstances: CreateNewInstance failed"));
hr = WBEM_E_OUT_OF_MEMORY;
break;
}
hr = LoadPropertyValues( pInstance, BIT_ALL_PROPERTIES, &pWS[ ulNum ] );
if (SUCCEEDED( hr ) )
{
hr = pInstance->Commit();
}
pInstance->Release( );
}
}
if( pWS != NULL)
{
CoTaskMemFree(pWS);
}
return hr;
/*
HRESULT hr = WBEM_E_FAILED;
CInstancePtr pInstance;
// Collections
TRefPointerCollection<CInstance> TerminalList;
// Perform queries
//================
if( SUCCEEDED( hr = CWbemProviderGlue::GetInstancesByQuery(L"select TerminalName from Win32_Terminal",
&TerminalList, pMethodContext) ) )
{
TRC2((TB,"TSPermissionsSetting@GetObject: EnumerateInstances: GetInstancesByQuery ret 0x%x\n" , hr ));
REFPTRCOLLECTION_POSITION pos;
CInstancePtr pTerminal(NULL);
if( TerminalList.BeginEnum( pos ) )
{
for( pTerminal.Attach(TerminalList.GetNext( pos ) ) ;
SUCCEEDED( hr ) && ( pTerminal != NULL ) ;
pTerminal.Attach(TerminalList.GetNext( pos ) ) )
{
CHString chTermName;
pTerminal->GetCHString(m_szTerminalName, chTermName);
// No maximum limit check
if( chTermName.IsEmpty() != 0)
{
return WBEM_E_ILLEGAL_NULL;
}
pInstance.Attach( CreateNewInstance(pMethodContext) );
if( NULL != pInstance )
{
// set relpath to Terminal
CHString chsTerminalPath;
CHString chsFullTerminalPath;
pTerminal->GetCHString(L"__RELPATH", chsTerminalPath);
chsFullTerminalPath.Format(L"\\\\%s\\%s:%s", (LPCTSTR)GetLocalComputerName(), L"root\\cimv2", (LPCTSTR)chsTerminalPath);
pInstance->SetCHString(L"Element", chsFullTerminalPath);
pInstance->SetCHString(m_szTerminalName, chTermName);
// create a relpath for the TSPermissionsSetting
CHString chsTSAccountSettingPath;
chsTSAccountSettingPath.Format(L"\\\\%s\\%s:%s.%s=\"%s\"", (LPCTSTR)GetLocalComputerName(), L"root\\cimv2", L"Win32_TSAccount", m_szTerminalName, (LPCTSTR)chTermName);
// and set the reference in the association
pInstance->SetCHString(L"Setting", chsTSAccountSettingPath);
// to that relpath.
hr = pInstance->Commit();
} // end if
} // pTerminal not null
TerminalList.EndEnum();
} // IF BeginEnum
}
return( hr );
*/
}
//=--------------------
HRESULT CWin32_TSPermissionsSetting::LoadPropertyValues( CInstance *pInstance, ULONGLONG ulRequiredProperties, PWS pWS)
{
if( pInstance == NULL )
{
ERR((TB,"TSPermissionsSetting@LoadPropertyValues: invalid pointer" ));
return WBEM_E_ILLEGAL_NULL;
}
if( ulRequiredProperties & BIT_TERMINALNAME )
{
pInstance->SetCharSplat(m_szTerminalName, pWS->Name);
}
return S_OK;
}
//=--------------------
HRESULT CWin32_TSPermissionsSetting::PutInstance ( const CInstance &Instance, long lFlags)
{
return WBEM_E_PROVIDER_NOT_CAPABLE;
}
//=--------------------
HRESULT CWin32_TSPermissionsSetting::ExecMethod ( const CInstance& Inst,
const BSTR bstrMethodName,
CInstance *pInParams,
CInstance *pOutParams,
long lFlags)
{
HRESULT hr = WBEM_E_NOT_FOUND;
CHString chTermName;
CHString chAccountName;
DWORD dwPermissionPreSet = 0;
DWORD dwMask = 0;
DWORD dwPermissionDenyMask = 0;
BOOL fAudit = FALSE;
DWORD dwStatus = 0;
IUserSecurity *pUserSecurity = NULL;
PSID pSystemAcctSid = NULL;
PSID pSid = NULL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
Inst.GetCHString(m_szTerminalName, chTermName);
if( chTermName.GetLength() > WINSTATIONNAME_LENGTH )
{
return WBEM_E_VALUE_OUT_OF_RANGE;
}
if( chTermName.IsEmpty() != 0)
{
return WBEM_E_ILLEGAL_NULL;
}
hr = StackObj.m_pCfgComp->QueryInterface( IID_IUserSecurity , ( LPVOID * )&pUserSecurity );
if( SUCCEEDED( hr ) && pUserSecurity != NULL )
{
// Adds a new user or group to the existing set with
// the set of permissions defined.
// uint32 Add([In] string AccountName, [In] uint32 PermissionPreSet)
do
{
if( _wcsicmp( bstrMethodName, m_szAddAccount ) == 0 )
{
if(pInParams == NULL)
{
hr = WBEM_E_INVALID_METHOD_PARAMETERS;
break;
}
bool bRet;
chAccountName.Empty();
pInParams->GetCHString(m_szAccountName, chAccountName);
if( chAccountName.GetLength() > NASIUSERNAME_LENGTH )
{
hr = WBEM_E_VALUE_OUT_OF_RANGE;
break;
}
if( chAccountName.IsEmpty() != 0)
{
hr = WBEM_E_ILLEGAL_NULL;
break;
}
bRet = pInParams->GetDWORD(m_szPermissionPreSet, dwPermissionPreSet);
if( !bRet || dwPermissionPreSet > 3 )
{
hr = WBEM_E_VALUE_OUT_OF_RANGE;
break;
}
if( dwPermissionPreSet == 0 )
{
dwMask = WINSTATION_GUEST_ACCESS;
}
else if( dwPermissionPreSet == 1 )
{
dwMask = WINSTATION_USER_ACCESS;
}
else if( dwPermissionPreSet == 2 )
{
dwMask = WINSTATION_ALL_ACCESS;
}
DWORD SidSize = 0;
DWORD index = 0;
dwStatus = GetUserSid(chAccountName, NULL, &pSid);
if(dwStatus != ERROR_SUCCESS)
{
hr = WBEM_E_FAILED;
break;
}
//
// System account SID that we don't allow removing from our
// winstation security descriptor.
//
// Local System S-1-5-18
// Local Service S-1-5-19
// Network Service S-1-5-20
//
WELL_KNOWN_SID_TYPE RestrictedSid[] = {
WinLocalSystemSid,
WinLocalServiceSid,
WinNetworkServiceSid
};
DWORD numRestrictedSid = sizeof(RestrictedSid)/sizeof(RestrictedSid[0]);
// Check if SID is one of system account, if so, reject removing it from
// our winstation security.
pSystemAcctSid = LocalAlloc( LPTR, SECURITY_MAX_SID_SIZE );
if( NULL == pSystemAcctSid )
{
dwStatus = GetLastError();
hr = WBEM_E_OUT_OF_MEMORY;
break;
}
for( index = 0; index < numRestrictedSid; index++ )
{
SidSize = SECURITY_MAX_SID_SIZE;
if( !CreateWellKnownSid(RestrictedSid[index], NULL, pSystemAcctSid, &SidSize) )
{
dwStatus = GetLastError();
hr = WBEM_E_FAILED;
break;
}
if( EqualSid(pSystemAcctSid, pSid) )
{
dwStatus = ERROR_NOT_SUPPORTED;
hr = WBEM_E_NOT_SUPPORTED;
break;
}
}
if(index < numRestrictedSid )
{
break;
}
hr = pUserSecurity->ModifyUserAccess( (LPTSTR) (LPCTSTR)chTermName, // winsta to modify security
(LPTSTR) (LPCTSTR) chAccountName, // group or user
dwMask, // winsta permission
FALSE ,
TRUE , // t - allow permission f - deny perm
FALSE , // t - new object f - donot change previous permission
FALSE , // t - enable auditing f - no auditing
&dwStatus );
TRC2((TB,"TSPermissionsSetting@ExecMethod: Add ret 0x%x\n" , dwStatus ));
if( SUCCEEDED (dwStatus) && pOutParams != NULL )
{
hr = StackObj.m_pCfgComp->ForceUpdate();
pOutParams->SetDWORD(L"ReturnValue", WBEM_S_NO_ERROR);
}
else
{
hr = WBEM_E_INVALID_METHOD_PARAMETERS;
TRC2((TB,"TSPermissionsSetting@ExecMethod: Modify ret 0x%x\n" , hr));
break;
}
}
// Deletes the permission from the specified user or group.
// uint32 RestoreDefaults();
else if( _wcsicmp(bstrMethodName, m_szRestoreDefaults) == 0 )
{
dwStatus = 0;
DWORD dwLen = chTermName.GetLength();
HKEY hKey = NULL;
TCHAR* pBuffer = NULL;
if(pOutParams == NULL)
{
hr = WBEM_E_INVALID_METHOD_PARAMETERS;
break;
}
dwLen += (_tcslen(TS_PATH_WINSTATION) + 1);
pBuffer = (PTCHAR)LocalAlloc(LMEM_ZEROINIT, (dwLen * sizeof(TCHAR)));
if( pBuffer == NULL)
{
hr = WBEM_E_OUT_OF_MEMORY;
pOutParams->SetDWORD(L"ReturnValue", WBEM_E_OUT_OF_MEMORY);
break;
}
_tcscpy(pBuffer, TS_PATH_WINSTATION);
_tcscat(pBuffer, (LPTSTR)(LPCTSTR)chTermName);
dwStatus = RegOpenKeyEx( HKEY_LOCAL_MACHINE ,
pBuffer,
0,
KEY_WRITE ,
&hKey );
if( dwStatus != ERROR_SUCCESS )
{
hr = WBEM_E_FAILED;
pOutParams->SetDWORD(L"ReturnValue", WBEM_E_FAILED);
LocalFree(pBuffer);
pBuffer = NULL;
break;
}
dwStatus = RegDeleteValue(hKey, L"Security");
hr = WBEM_S_NO_ERROR;
hr = StackObj.m_pCfgComp->ForceUpdate();
pOutParams->SetDWORD(L"ReturnValue", WBEM_S_NO_ERROR);
TRC2((TB,"TSPermissionsSetting@ExecMethod: RestoreDefaults ret 0x%x\n" , hr));
if(hKey)
{
RegCloseKey(hKey);
}
if(pBuffer)
{
LocalFree(pBuffer);
}
}
else
{
hr = WBEM_E_INVALID_METHOD;
break;
}
}while(0);
}
if( pSystemAcctSid != NULL )
{
LocalFree( pSystemAcctSid );
}
if(pSid != NULL)
{
LocalFree(pSid);
}
if( pUserSecurity != NULL)
{
pUserSecurity->Release();
}
return hr;
}
//=-----------------
HRESULT CWin32_TSPermissionsSetting::ExecQuery (MethodContext *pMethodContext, CFrameworkQuery& Query, long lFlags)
{
HRESULT hr = WBEM_E_NOT_FOUND;
ULONGLONG ulRequiredProperties = 0;
CHStringArray asNames;
ULONG ulNum = 0;
ULONG ulSize = 0;
ULONG ulTerminals = 0;
PWS pWS = NULL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
// Method 2
Query.GetValuesForProp(m_szTerminalName, asNames);
BOOL bGetAllInstances = asNames.GetSize() == 0;
// Method 1
if (Query.IsPropertyRequired(m_szTerminalName))
ulRequiredProperties |= BIT_TERMINALNAME;
hr = StackObj.m_pCfgComp->GetWinstationList(&ulTerminals, &ulSize, &pWS);
if( SUCCEEDED( hr ) && pWS != NULL )
{
for ( ulNum = 0; ulNum < ulTerminals && SUCCEEDED( hr ) ; ulNum++)
{
// Method 2 - Check if the query CAN be processed by 'name'. If yes, return only those names.
if (bGetAllInstances || IsInList(asNames, pWS[ulNum].Name))
{
CInstance* pInstance = CreateNewInstance( pMethodContext );
if( pInstance == NULL)
{
TRC2((TB,"TSPermissionsSetting@ExecQuery: CreateNewInstance failed"));
hr = WBEM_E_OUT_OF_MEMORY;
break;
}
pInstance->SetCHString(m_szTerminalName, CHString(pWS[ulNum].Name));
hr = LoadPropertyValues( pInstance, ulRequiredProperties, &pWS[ ulNum ] );
if( SUCCEEDED( hr ) )
{
hr = pInstance->Commit();
}
pInstance->Release();
}
}
}
if( pWS != NULL )
{
CoTaskMemFree(pWS);
}
return hr;
}
//=------------------------------
/*
CWin32_TSNetworkAdapterListSetting::CWin32_TSNetworkAdapterListSetting ( const CHString& setName, LPCTSTR pszNameSpace )
: Provider (setName,pszNameSpace)
{
if ( g_hInstance != NULL)
{
TRC2((TB, "CWin32_TSNetworkAdapterListSetting_ctor"));
LoadString( g_hInstance , IDS_DEVICEID, m_szDeviceID, SIZE_OF_BUFFER(m_szDeviceID)-1 );
LoadString( g_hInstance , IDS_INDEX, m_szIndex, SIZE_OF_BUFFER(m_szIndex)-1 );
LoadString( g_hInstance , IDS_DESCRIPTION, m_szDescription, SIZE_OF_BUFFER(m_szDescription)-1 );
LoadString( g_hInstance , IDS_NETWORKADAPTERID, m_szNetworkAdapterID, SIZE_OF_BUFFER(m_szNetworkAdapterID)-1 );
LoadString( g_hInstance , IDS_TERMINALNAME, m_szTerminalName, SIZE_OF_BUFFER(m_szTerminalName)-1 );
}
}
CWin32_TSNetworkAdapterListSetting::~CWin32_TSNetworkAdapterListSetting ()
{
}
HRESULT CWin32_TSNetworkAdapterListSetting::EnumerateInstances (MethodContext* pMethodContext, long lFlags)
{
HRESULT hr = WBEM_E_FAILED;
CInstancePtr pInstance;
// Collections
TRefPointerCollection<CInstance> AdapterList;
// Perform queries
//================
if (SUCCEEDED(hr = CWbemProviderGlue::GetInstancesByQuery(L"select DeviceID, Description, Index from Win32_NetworkAdapter",
&AdapterList, pMethodContext)))
{
TRC2((TB,"TSNetworkAdapterListSetting@EnumerateInstances: GetInstancesByQuery ret 0x%x\n" , hr));
REFPTRCOLLECTION_POSITION pos;
CInstancePtr pAdapter(NULL);
if( AdapterList.BeginEnum( pos ) )
{
for (pAdapter.Attach(AdapterList.GetNext( pos ) ) ;
SUCCEEDED(hr) && ( pAdapter != NULL ) ;
pAdapter.Attach(AdapterList.GetNext( pos ) ) )
{
CHString chTermName;
CHString chDeviceID;
CHString chDescription;
DWORD dwIndex = 0;
pAdapter->GetCHString(m_szDeviceID, chDeviceID);
pAdapter->GetCHString(m_szDescription, chDescription);
pAdapter->GetDWORD(m_szIndex, dwIndex);
// No maximum limit check
if( chDeviceID.IsEmpty() != 0)
{
return WBEM_E_ILLEGAL_NULL;
}
pInstance.Attach(CreateNewInstance(pMethodContext));
if( NULL != pInstance )
{
// set relpath to Adapter
CHString chsAdapterPath;
CHString chsFullAdapterPath;
pAdapter->GetCHString(L"__RELPATH", chsAdapterPath);
chsFullAdapterPath.Format(L"\\\\%s\\%s:%s", (LPCTSTR)GetLocalComputerName(), L"root\\cimv2", (LPCTSTR)chsAdapterPath);
pInstance->SetCHString(L"Element", chsFullAdapterPath);
pInstance->SetCHString(m_szDescription, chDescription);
pInstance->SetCHString(m_szDeviceID, chDeviceID);
pInstance->SetCHString(m_szNetworkAdapterID, chDeviceID);
pInstance->SetDWORD(m_szIndex, dwIndex);
// create a relpath for the NetworkAdapterSettingsConfig
CHString chsNetworkAdapterSettingPath;
chsNetworkAdapterSettingPath.Format(L"\\\\%s\\%s:%s.%s=\"%s\"", (LPCTSTR)GetLocalComputerName(), L"root\\cimv2", L"Win32_TSNetworkAdapterSetting", m_szNetworkAdapterID, (LPCTSTR)chDeviceID);
// and set the reference in the association
pInstance->SetCHString(L"Setting", chsNetworkAdapterSettingPath);
// to that relpath.
CInstancePtr pNewInstance(NULL);
if( SUCCEEDED(hr = CWbemProviderGlue::GetInstanceKeysByPath(chsNetworkAdapterSettingPath, &pNewInstance, pMethodContext)) )
{
pNewInstance->GetCHString(m_szTerminalName, chTermName);
pInstance->SetCHString(m_szTerminalName, chTermName);
}
TRC2((TB,"TSNetworkAdapterListSetting@EnumerateInstances: GetInstanceKeysByPath ret 0x%x\n" , hr));
hr = pInstance->Commit();
} // end if
} // pAdapter not null
AdapterList.EndEnum();
} // IF BeginEnum
}
return(hr);
}
HRESULT CWin32_TSNetworkAdapterListSetting::GetObject ( CInstance* pInstance, long lFlags)
{
HRESULT hr = WBEM_E_NOT_FOUND;
// get the object for the Win32_Terminal
CHString chsAdapter;
CInstancePtr pAdapter(NULL);
if( pInstance != NULL )
{
pInstance->GetCHString(L"Element", chsAdapter);
MethodContext* pMethodContext = pInstance->GetMethodContext();
hr = CWbemProviderGlue::GetInstanceByPath(chsAdapter, &pAdapter, pMethodContext);
TRC2((TB,"TSNetworkAdapterListSetting@GetObject: GetInstanceByPath ret 0x%x\n" , hr));
do
{
if( SUCCEEDED( hr ) && pAdapter != NULL )
{
// Got the account. Now, match it to the GUID.
// first, generate a relpath with which to compare.
CHString chDeviceID;
CHString chNetworkAdapterSettingInstance;
CHString chDescription;
DWORD dwIndex = 0;
pAdapter->GetCHString(m_szDeviceID, chDeviceID);
pAdapter->GetCHString(m_szDescription, chDescription);
pAdapter->GetDWORD(m_szIndex, dwIndex);
// create a relpath for the sid
CHString chsNetworkAdapterSettingPath;
chsNetworkAdapterSettingPath.Format(L"\\\\%s\\%s:%s.%s=\"%s\"", (LPCTSTR)GetLocalComputerName(), L"root\\cimv2", L"Win32_TSNetworkAdapterSetting", m_szNetworkAdapterID, (LPCTSTR)chDeviceID);
// get the SID path from the instance
pInstance->GetCHString(L"Setting", chNetworkAdapterSettingInstance);
// compare it to our generated relpath
if( 0 != chNetworkAdapterSettingInstance.CompareNoCase(chsNetworkAdapterSettingPath) )
{
hr = WBEM_E_NOT_FOUND;
TRC2((TB,"TSNetworkAdapterListSetting@GetObject: CompareNoCase for relpath ret 0x%x\n" , hr));
break;
}
pInstance->SetCHString(m_szDescription, chDescription);
pInstance->SetCHString(m_szDeviceID, chDeviceID);
pInstance->SetCHString(m_szNetworkAdapterID, chDeviceID);
pInstance->SetDWORD(m_szIndex, dwIndex);
}
}while (0);
}
return(hr);
}
*/
CWin32_TSNetworkAdapterListSetting::CWin32_TSNetworkAdapterListSetting ( const CHString& setName, LPCTSTR pszNameSpace )
: Provider (setName,pszNameSpace)
{
if ( g_hInstance != NULL)
{
TRC2((TB, "CWin32_TSNetworkAdapterListSetting_ctor"));
_tcscpy(m_szNetworkAdapterID, _T("NetworkAdapterID"));
_tcscpy(m_szDescription, _T("Description"));
_tcscpy(m_szNetworkAdapterIP, _T("NetworkAdapterIP"));
}
}
CWin32_TSNetworkAdapterListSetting::~CWin32_TSNetworkAdapterListSetting ()
{
}
/*****************************************************************************
*
* FUNCTION : CWin32_TSNetworkAdapterListSetting::EnumerateInstances
*
* DESCRIPTION : Returns all the instances of this class.
*
* INPUTS : A pointer to the MethodContext for communication with WinMgmt.
* A long that contains the flags described in
* IWbemServices::CreateInstanceEnumAsync. Note that the following
* flags are handled by (and filtered out by) WinMgmt:
* WBEM_FLAG_DEEP, WBEM_FLAG_SHALLOW, WBEM_FLAG_RETURN_IMMEDIATELY,
* WBEM_FLAG_FORWARD_ONLY, WBEM_FLAG_BIDIRECTIONAL
*
* RETURNS : WBEM_S_NO_ERROR if successful
*
* COMMENTS : All instances on the machine are returned here and
* all properties that this class knows how to populate must
* be filled in. If there are no instances, return
* WBEM_S_NO_ERROR.
*****************************************************************************/
HRESULT CWin32_TSNetworkAdapterListSetting::EnumerateInstances (MethodContext* pMethodContext, long lFlags)
{
HRESULT hr = WBEM_S_NO_ERROR;
DWORD dwData = 0;
PIP_ADAPTER_INFO pAdapterInfo = NULL, pAdapt = NULL;
DWORD AdapterInfoSize = 0;
PIP_ADDR_STRING pAddrStr;
DWORD Err;
ULONGLONG ulRequiredProperties = BIT_ALL_PROP;
//
// Enumerate all of the adapter specific information using the IP_ADAPTER_INFO structure.
// Note: IP_ADAPTER_INFO contains a linked list of adapter entries.
GetAdaptersInfo(NULL, &AdapterInfoSize);
if(AdapterInfoSize == 0)
{
return WBEM_E_FAILED;
}
// Allocate memory from sizing information
if ((pAdapterInfo = (PIP_ADAPTER_INFO) GlobalAlloc(GPTR, AdapterInfoSize)) == NULL)
{
hr = WBEM_E_OUT_OF_MEMORY;
return hr;
}
// Get actual adapter information
if ((Err = GetAdaptersInfo(pAdapterInfo, &AdapterInfoSize)) != 0)
{
hr = WBEM_E_OUT_OF_MEMORY;
goto cleanup;
}
pAdapt = pAdapterInfo;
while (pAdapt)
{
pAddrStr = &(pAdapt->IpAddressList);
while(pAddrStr)
{
CInstance* pInstance = CreateNewInstance(pMethodContext);
if( pInstance != NULL )
{
TRC2((TB, "Win32_TSNetworkAdapterListSetting@EnumerateInstances: CreateNewInstance succeeded"));
pInstance->SetCharSplat(m_szDescription, pAdapt->Description );
pInstance->SetCHString(m_szNetworkAdapterID, pAdapt->AdapterName);
pInstance->SetCHString(m_szNetworkAdapterIP, pAddrStr->IpAddress.String);
if( SUCCEEDED( hr ))
{
hr = pInstance->Commit();
}
pInstance->Release( );
}
pAddrStr = pAddrStr->Next;
}
pAdapt = pAdapt->Next;
}
cleanup:
if(pAdapterInfo)
GlobalFree(pAdapterInfo);
return hr;
}
HRESULT CWin32_TSNetworkAdapterListSetting::GetObject ( CInstance* pInstance, long lFlags, CFrameworkQuery &Query)
{
HRESULT hr = WBEM_E_NOT_FOUND;
CHString chTerminalProtocol;
CHString chTransport;
CHString chGuid;
ULONG ulNAdapters = 0;
ULONG ulNumAdapters = 0;
DWORD dwSdclass = 0;
ULONGLONG ulRequiredProperties = 0;
PIP_ADAPTER_INFO pAdapterInfo = NULL, pAdapt = NULL;
DWORD AdapterInfoSize = 0;
PIP_ADDR_STRING pAddrStr;
DWORD Err;
CHString chAddress;
chAddress.Empty();
CHString chIPAddress;
if (Query.IsPropertyRequired(m_szDescription))
ulRequiredProperties |= BIT_DESCRIPTION;
if (Query.IsPropertyRequired(m_szNetworkAdapterID))
ulRequiredProperties |= BIT_NETWORKADAPTERID;
if(NULL == pInstance)
{
return hr;
}
pInstance->GetCHString(m_szNetworkAdapterIP, chIPAddress);
//
// Enumerate all of the adapter specific information using the IP_ADAPTER_INFO structure.
// Note: IP_ADAPTER_INFO contains a linked list of adapter entries.
//
GetAdaptersInfo(NULL, &AdapterInfoSize);
if (AdapterInfoSize == 0)
{
return WBEM_E_FAILED;
}
// Allocate memory from sizing information
if ((pAdapterInfo = (PIP_ADAPTER_INFO) GlobalAlloc(GPTR, AdapterInfoSize)) == NULL)
{
hr = WBEM_E_OUT_OF_MEMORY;
return hr;
}
// Get actual adapter information
if ((Err = GetAdaptersInfo(pAdapterInfo, &AdapterInfoSize)) != 0)
{
hr = WBEM_E_OUT_OF_MEMORY;
goto cleanup;
}
pAdapt = pAdapterInfo;
for (; pAdapt ; pAdapt = pAdapt->Next)
{
pAddrStr = &(pAdapt->IpAddressList);
while(pAddrStr)
{
if( !_tcsicmp((LPWSTR)(pAddrStr->IpAddress.String), chIPAddress))
goto found;
pAddrStr = pAddrStr->Next;
}
}
found:
if(pAdapt)
{
pAddrStr = &(pAdapt->IpAddressList);
while(pAddrStr)
{
if(!chAddress.IsEmpty())
{
chAddress+=L"; ";
}
chAddress += pAddrStr->IpAddress.String;
pAddrStr = pAddrStr->Next;
}
if( ulRequiredProperties & BIT_DESCRIPTION)
{
pInstance->SetCharSplat(m_szDescription, pAdapt->Description );
}
if( ulRequiredProperties & BIT_NETWORKADAPTERID)
{
pInstance->SetCHString(m_szNetworkAdapterID, pAdapt->AdapterName);
}
pInstance->SetCHString(m_szNetworkAdapterIP, chAddress);
}
cleanup:
if(pAdapterInfo)
GlobalFree(pAdapterInfo);
return hr;
}
//=-------------------------------
CWin32_TSAccount::CWin32_TSAccount (LPCWSTR lpwszName, LPCWSTR lpwszNameSpace ) :
Provider( lpwszName, lpwszNameSpace )
{
if ( g_hInstance != NULL)
{
TRC2((TB, "CWin32_TSAccount_ctor"));
_tcscpy(m_szPermissionPreSet, _T("PermissionPreSet"));
_tcscpy(m_szPermissionMask, _T("PermissionMask"));
_tcscpy(m_szPermissionsAllowed, _T("PermissionsAllowed"));
_tcscpy(m_szPermissionsDenied, _T("PermissionsDenied"));
_tcscpy(m_szAuditSuccess, _T("AuditSuccess"));
_tcscpy(m_szAuditFail, _T("AuditFail"));
_tcscpy(m_szAllow, _T("Allow"));
_tcscpy(m_szSuccess, _T("Success"));
_tcscpy(m_szSID, _T("SID"));
_tcscpy(m_szDelete, _T("Delete"));
_tcscpy(m_szModifyPermissions, _T("ModifyPermissions"));
_tcscpy(m_szModifyAuditPermissions, _T("ModifyAuditPermissions"));
_tcscpy(m_szTerminalName, _T("TerminalName"));
_tcscpy(m_szAccountName, _T("AccountName"));
}
}
//=--------------------
CWin32_TSAccount::~CWin32_TSAccount ()
{
}
//=--------------------
/*****************************************************************************
*
* FUNCTION : CWin32_TSAccount::EnumerateInstances
*
* DESCRIPTION : Returns all the instances of this class.
*
* INPUTS : A pointer to the MethodContext for communication with WinMgmt.
* A long that contains the flags described in
* IWbemServices::CreateInstanceEnumAsync. Note that the following
* flags are handled by (and filtered out by) WinMgmt:
* WBEM_FLAG_DEEP, WBEM_FLAG_SHALLOW, WBEM_FLAG_RETURN_IMMEDIATELY,
* WBEM_FLAG_FORWARD_ONLY, WBEM_FLAG_BIDIRECTIONAL
*
* RETURNS : WBEM_S_NO_ERROR if successful
*
* COMMENTS : All instances on the machine are returned here and
* all properties that this class knows how to populate must
* be filled in. If there are no instances, return
* WBEM_S_NO_ERROR.
*****************************************************************************/
HRESULT CWin32_TSAccount::EnumerateInstances (MethodContext* pMethodContext, long lFlags )
{
HRESULT hr = WBEM_S_NO_ERROR;
DWORD dwData = 0;
ULONG ulTerminals = 0;
ULONG ulSize = 0;
LONG lSize = 0;
ULONG ulNum = 0;
ULONG ulAuditNum = 0;
bool bFound = 0;
DWORD cbItems = 0;
DWORD cbAuditItems = 0;
PWS pWS = NULL;
PUSERPERMLIST pUserList = NULL;
PUSERPERMLIST pUserAuditList = NULL;
IUserSecurity *pUserSecurity = NULL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
hr = StackObj.m_pCfgComp->GetWinstationList(&ulTerminals, &ulSize, &pWS);
if( SUCCEEDED( hr ) && pWS != NULL )
{
for( ulNum = 0; ulNum < ulTerminals && SUCCEEDED( hr ) ; ulNum++ )
{
hr = StackObj.m_pCfgComp->QueryInterface( IID_IUserSecurity , ( LPVOID * )&pUserSecurity );
if( SUCCEEDED (hr) && pUserSecurity != NULL )
{
hr = pUserSecurity->GetUserPermList( pWS[ulNum].Name , &cbItems , &pUserList, 0 );
hr = pUserSecurity->GetUserPermList( pWS[ulNum].Name , &cbAuditItems , &pUserAuditList, 1 );
for( DWORD i = 0; i < cbItems && SUCCEEDED( hr ) ; ++i )
{
for( DWORD j = 0;j < cbAuditItems ; j ++ )
{
bFound = 0;
if( lstrcmpi (pUserAuditList[j].Name, pUserList[i].Name) == 0 )
{
bFound = 1;
ulAuditNum = j;
break;
}
}
CInstance* pInstance = CreateNewInstance(pMethodContext);
if( pInstance == NULL)
{
ERR((TB,"TSAccount@EnumerateInstances: CreateNewInstance failed"));
hr = WBEM_E_OUT_OF_MEMORY;
break;
}
TRC2((TB,"TSAccount@EnumerateInstances: GetWinstationList ret 0x%x\n" , hr));
if( bFound == 1 )
{
hr = LoadPropertyValues(pInstance, BIT_ALL_PROP, &pWS[ulNum], &pUserList[i], &pUserAuditList[ulAuditNum]);
}
else
{
hr = LoadPropertyValues(pInstance, BIT_ALL_PROP, &pWS[ulNum], &pUserList[i], NULL);
}
if( SUCCEEDED( hr ) )
{
hr = pInstance->Commit();
}
pInstance->Release( );
}
if( pUserList != NULL )
{
CoTaskMemFree( pUserList );
pUserList = NULL;
}
if( pUserAuditList != NULL )
{
CoTaskMemFree( pUserAuditList );
pUserAuditList = NULL;
}
}
if(pUserSecurity)
{
pUserSecurity->Release( );
pUserSecurity = NULL;
}
}
}
if( pUserList != NULL )
{
CoTaskMemFree( pUserList );
pUserList = NULL;
}
if( pUserAuditList != NULL )
{
CoTaskMemFree( pUserAuditList );
pUserAuditList = NULL;
}
if( pWS != NULL )
{
CoTaskMemFree( pWS );
}
if (pUserSecurity != NULL)
{
pUserSecurity->Release();
pUserSecurity = NULL;
}
return hr;
}
HRESULT CWin32_TSAccount::ExecMethod ( const CInstance& Inst,
const BSTR bstrMethodName,
CInstance *pInParams,
CInstance *pOutParams,
long lFlags)
{
HRESULT hr = WBEM_E_NOT_FOUND;
CHString chTermName;
CHString chAccountName;
DWORD dwPermissionPreSet = 0;
DWORD dwMask = 0;
DWORD dwPermissionDenyMask = 0;
BOOL fAudit = FALSE;
DWORD dwStatus = 0;
IUserSecurity *pUserSecurity = NULL;
PSID pSystemAcctSid = NULL;
PSID pSid = NULL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
Inst.GetCHString(m_szTerminalName, chTermName);
if( chTermName.GetLength() > WINSTATIONNAME_LENGTH )
{
return WBEM_E_VALUE_OUT_OF_RANGE;
}
if( chTermName.IsEmpty() != 0)
{
return WBEM_E_ILLEGAL_NULL;
}
hr = StackObj.m_pCfgComp->QueryInterface( IID_IUserSecurity , ( LPVOID * )&pUserSecurity );
if( SUCCEEDED( hr ) && pUserSecurity != NULL )
{
do
{
// Deletes the permission from the specified user or group.
// uint32 Delete();
if( _wcsicmp(bstrMethodName, m_szDelete) == 0 )
{
dwStatus = 0;
DWORD dwData = 0;
LONG lSize;
RegGetMachinePolicy( &m_gpPolicy );
Inst.GetCHString(m_szAccountName, chAccountName);
if( chAccountName.GetLength() > NASIUSERNAME_LENGTH )
{
hr = WBEM_E_VALUE_OUT_OF_RANGE;
break;
}
if( chAccountName.IsEmpty() != 0)
{
hr = WBEM_E_ILLEGAL_NULL;
break;
}
if ( m_gpPolicy.fPolicyWritableTSCCPermissionsTAB == 0)
{
hr = pUserSecurity->ModifyUserAccess( (LPTSTR) (LPCTSTR)chTermName, // winsta to modify security
(LPTSTR) (LPCTSTR) chAccountName, // group or user
0, // winsta permission
TRUE ,
FALSE , // t - allow permission f - deny perm
FALSE , // t - new object f - donot change previous permission
FALSE , // t - enable auditing f - no auditing
&dwStatus );
TRC2((TB,"TSAccount@ExecMethod: Delete with Deny=True and Audit=False ret 0x%x\n", dwStatus));
if(dwStatus == ERROR_NOT_SUPPORTED)
{
hr = WBEM_E_NOT_SUPPORTED;
break;
}
else if(dwStatus != ERROR_SUCCESS)
{
hr = WBEM_E_INVALID_METHOD_PARAMETERS;
break;
}
hr = pUserSecurity->ModifyUserAccess( (LPTSTR) (LPCTSTR)chTermName, // winsta to modify security
(LPTSTR) (LPCTSTR) chAccountName, // group or user
0, // winsta permission
TRUE ,
FALSE , // t - allow permission f - deny perm
FALSE , // t - new object f - donot change previous permission
TRUE , // t - enable auditing f - no auditing
&dwStatus );
TRC2((TB,"TSAccount@ExecMethod: Delete with Deny=True and Audit=True ret 0x%x\n", dwStatus));
if (pOutParams != NULL && SUCCEEDED( hr ) && SUCCEEDED( dwStatus ))
{
StackObj.m_pCfgComp->ForceUpdate();
pOutParams->SetDWORD(L"ReturnValue", WBEM_S_NO_ERROR);
}
else
{
hr = WBEM_E_INVALID_METHOD_PARAMETERS;
break;
}
}
else
{
hr = WBEM_E_INVALID_OPERATION;
break;
}
}
// Restores the default permissions to default set of users and groups.
// uint32 ModifyPermissions([In] uint32 PermissionMask, [In] boolean Allow)
else if( _wcsicmp(bstrMethodName, m_szModifyPermissions) == 0 )
{
dwStatus = 0;
DWORD dwData = 0;
LONG lSize;
ULONG ulOffset = 0;
DWORD cbItems = 0;
ULONG ulPermissionMask = 0;
bool fAllow;
bool bRet;
DWORD index = 0;
RegGetMachinePolicy(&m_gpPolicy);
Inst.GetCHString(m_szAccountName, chAccountName);
if( chAccountName.GetLength() > NASIUSERNAME_LENGTH )
{
hr = WBEM_E_VALUE_OUT_OF_RANGE;
break;
}
if( chAccountName.IsEmpty() != 0 )
{
hr = WBEM_E_ILLEGAL_NULL;
break;
}
if(pInParams == NULL)
{
hr = WBEM_E_INVALID_METHOD_PARAMETERS;
break;
}
DWORD SidSize = 0;
dwStatus = GetUserSid(chAccountName, NULL, &pSid);
if(dwStatus != ERROR_SUCCESS)
{
hr = WBEM_E_FAILED;
break;
}
//
// System account SID that we don't allow removing from our
// winstation security descriptor.
//
// Local System S-1-5-18
// Local Service S-1-5-19
// Network Service S-1-5-20
//
WELL_KNOWN_SID_TYPE RestrictedSid[] = {
WinLocalSystemSid,
WinLocalServiceSid,
WinNetworkServiceSid
};
DWORD numRestrictedSid = sizeof(RestrictedSid)/sizeof(RestrictedSid[0]);
// Check if SID is one of system account, if so, reject removing it from
// our winstation security.
pSystemAcctSid = LocalAlloc( LPTR, SECURITY_MAX_SID_SIZE );
if( NULL == pSystemAcctSid )
{
dwStatus = GetLastError();
hr = WBEM_E_OUT_OF_MEMORY;
break;
}
for( index = 0; index < numRestrictedSid; index++ )
{
SidSize = SECURITY_MAX_SID_SIZE;
if( !CreateWellKnownSid(RestrictedSid[index], NULL, pSystemAcctSid, &SidSize) )
{
dwStatus = GetLastError();
hr = WBEM_E_FAILED;
break;
}
if( EqualSid(pSystemAcctSid, pSid) )
{
dwStatus = ERROR_NOT_SUPPORTED;
hr = WBEM_E_NOT_SUPPORTED;
break;
}
}
if(index < numRestrictedSid )
{
break;
}
bRet = pInParams->GetDWORD(m_szPermissionMask, ulPermissionMask);
if( !bRet || ulPermissionMask > 9 || (ulPermissionMask == 6) )
{
hr = WBEM_E_VALUE_OUT_OF_RANGE;
break;
}
if(ulPermissionMask == 3) // WINSTATION_VIRTUAL | STANDARD_RIGHTS_REQUIRED
{
dwMask = 0xF0008;
}
else
{
ULONG ulBase = 1;
for (ULONG ulIndex = 1; ulIndex <= ulPermissionMask; ulIndex++)
{
ulBase *= 2;
}
dwMask = ulBase;
}
RegGetMachinePolicy(&m_gpPolicy);
pInParams->Getbool(m_szAllow, fAllow);
if( fAllow != 0 && fAllow != 1 )
{
hr = WBEM_E_VALUE_OUT_OF_RANGE;
break;
}
/*
if( fAudit != 0 && fAudit != 1 )
{
hr = WBEM_E_VALUE_OUT_OF_RANGE;
break;
}
*/
if( m_gpPolicy.fPolicyWritableTSCCPermissionsTAB == 0 )
{
pUserSecurity->ModifyUserAccess( (LPTSTR) (LPCTSTR)chTermName, // winsta to modify security
(LPTSTR) (LPCTSTR) chAccountName, // group or user
dwMask, // winsta permission
FALSE ,
fAllow , // t - allow permission f - deny perm
FALSE , // t - new object f - donot change previous permission
FALSE , // t - enable auditing f - no auditing
&dwStatus );
TRC2((TB,"TSAccount@ExecMethod: Modify with Audit=0 ret 0x%x\n", dwStatus));
if( SUCCEEDED (dwStatus) && pOutParams != NULL )
{
StackObj.m_pCfgComp->ForceUpdate();
pOutParams->SetDWORD(L"ReturnValue", WBEM_S_NO_ERROR);
}
else
{
hr = WBEM_E_INVALID_METHOD_PARAMETERS;
ERR((TB,"TSAccount@ExecMethod: Modify ret 0x%x\n", hr));
break;
}
}
else
{
hr = WBEM_E_INVALID_OPERATION;
break;
}
}
// Modifies Audit permissions of users and groups.
// uint32 ModifyAuditPermissions([In] uint32 PermissionMask, [In] boolean Allow)
else if( _wcsicmp(bstrMethodName, m_szModifyAuditPermissions) == 0 )
{
dwStatus = 0;
DWORD dwData = 0;
LONG lSize;
ULONG ulOffset = 0;
DWORD cbItems = 0;
ULONG ulPermissionMask = 0;
bool fSuccess;
bool bRet;
RegGetMachinePolicy( &m_gpPolicy );
Inst.GetCHString(m_szAccountName, chAccountName);
if( chAccountName.GetLength() > NASIUSERNAME_LENGTH )
{
hr = WBEM_E_VALUE_OUT_OF_RANGE;
break;
}
if( chAccountName.IsEmpty() != 0)
{
hr = WBEM_E_ILLEGAL_NULL;
break;
}
if(pInParams == NULL)
{
hr = WBEM_E_INVALID_METHOD_PARAMETERS;
break;
}
DWORD SidSize = 0;
DWORD index = 0;
dwStatus = GetUserSid( chAccountName, NULL, &pSid);
if(dwStatus != ERROR_SUCCESS)
{
hr = WBEM_E_FAILED;
break;
}
//
// System account SID that we don't allow removing from our
// winstation security descriptor.
//
// Local System S-1-5-18
// Local Service S-1-5-19
// Network Service S-1-5-20
//
WELL_KNOWN_SID_TYPE RestrictedSid[] = {
WinLocalSystemSid,
WinLocalServiceSid,
WinNetworkServiceSid
};
DWORD numRestrictedSid = sizeof(RestrictedSid)/sizeof(RestrictedSid[0]);
// Check if SID is one of system account, if so, reject removing it from
// our winstation security.
pSystemAcctSid = LocalAlloc( LPTR, SECURITY_MAX_SID_SIZE );
if( NULL == pSystemAcctSid )
{
dwStatus = GetLastError();
hr = WBEM_E_OUT_OF_MEMORY;
break;
}
for( index = 0; index < numRestrictedSid; index++ )
{
SidSize = SECURITY_MAX_SID_SIZE;
if( !CreateWellKnownSid(RestrictedSid[index], NULL, pSystemAcctSid, &SidSize) )
{
dwStatus = GetLastError();
hr = WBEM_E_FAILED;
break;
}
if( EqualSid(pSystemAcctSid, pSid) )
{
dwStatus = ERROR_NOT_SUPPORTED;
hr = WBEM_E_NOT_SUPPORTED;
break;
}
}
if( index < numRestrictedSid)
{
break;
}
bRet = pInParams->GetDWORD(m_szPermissionMask, ulPermissionMask);
if( !bRet || ulPermissionMask > 9 || (ulPermissionMask == 6) )
{
hr = WBEM_E_VALUE_OUT_OF_RANGE;
break;
}
if(ulPermissionMask == 3) // WINSTATION_VIRTUAL is defined as 0x00000008 but
{ // GetExplicitEntriesFromAcl is returning 983048
dwMask = 0xF0008;
}
else
{
ULONG ulBase = 1;
for( ULONG ulIndex = 1; ulIndex <= ulPermissionMask; ulIndex++ )
{
ulBase *= 2;
}
dwMask = ulBase;
}
pInParams->Getbool(m_szSuccess, fSuccess);
if( fSuccess != 0 && fSuccess != 1 )
{
hr = WBEM_E_VALUE_OUT_OF_RANGE;
break;
}
if( m_gpPolicy.fPolicyWritableTSCCPermissionsTAB == 0 )
{
pUserSecurity->ModifyUserAccess( (LPTSTR) (LPCTSTR)chTermName, // winsta to modify security
(LPTSTR) (LPCTSTR) chAccountName, // group or user
dwMask, // winsta permission
FALSE ,
fSuccess , // t - allow permission f - deny perm
FALSE , // t - new object f - donot change previous permission
TRUE , // t - enable auditing f - no auditing
&dwStatus );
TRC2((TB,"TSAccount@ExecMethod: ModifyAuditPermissions ret 0x%x\n", dwStatus));
if( SUCCEEDED (dwStatus) && pOutParams != NULL )
{
StackObj.m_pCfgComp->ForceUpdate();
pOutParams->SetDWORD(L"ReturnValue", WBEM_S_NO_ERROR);
}
else
{
hr = WBEM_E_INVALID_METHOD_PARAMETERS;
TRC2((TB,"TSAccount@ExecMethod: Modify ret 0x%x\n", hr));
break;
}
}
else
{
hr = WBEM_E_INVALID_OPERATION;
break;
}
}
else
{
hr = WBEM_E_INVALID_METHOD;
break;
}
}while(0);
}
if( pSystemAcctSid != NULL )
{
LocalFree( pSystemAcctSid );
}
if(pSid != NULL)
{
LocalFree(pSid);
}
if( pUserSecurity != NULL)
{
pUserSecurity->Release();
}
return hr;
}
//=--------------------
HRESULT CWin32_TSAccount::ExecQuery (MethodContext *pMethodContext, CFrameworkQuery& Query, long lFlags)
{
HRESULT hr = WBEM_E_NOT_FOUND;
ULONGLONG ulRequiredProperties = 0;
CHStringArray asNames;
ULONG ulNum = 0;
ULONG ulSize = 0;
ULONG ulTerminals = 0;
ULONG ulAuditNum = 0;
PWS pWS = NULL;
PUSERPERMLIST pUserList = NULL;
PUSERPERMLIST pUserAuditList = NULL;
DWORD cbItems = 0;
DWORD cbAuditItems = 0;
bool bFound = 0;
IUserSecurity *pUserSecurity = NULL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
// Method 2
Query.GetValuesForProp(m_szTerminalName, asNames);
BOOL bGetAllInstances = asNames.GetSize() == 0;
// Method 1
if (Query.IsPropertyRequired(m_szTerminalName))
ulRequiredProperties |= BIT_TERMINALNAME;
if (Query.IsPropertyRequired(m_szSID))
ulRequiredProperties |= BIT_SID;
if (Query.IsPropertyRequired(m_szAccountName))
ulRequiredProperties |= BIT_ACCOUNTNAME;
if (Query.IsPropertyRequired(m_szAuditSuccess))
ulRequiredProperties |= BIT_AUDITSUCCESS;
if (Query.IsPropertyRequired(m_szAuditFail))
ulRequiredProperties |= BIT_AUDITFAIL;
if (Query.IsPropertyRequired(m_szPermissionsAllowed))
ulRequiredProperties |= BIT_PERMISSIONSALLOWED;
if (Query.IsPropertyRequired(m_szPermissionsDenied))
ulRequiredProperties |= BIT_PERMISSIONSDENIED;
hr = StackObj.m_pCfgComp->GetWinstationList(&ulTerminals, &ulSize, &pWS);
if( SUCCEEDED( hr ) && pWS != NULL )
{
for( ulNum = 0; ulNum < ulTerminals && SUCCEEDED( hr ) ; ulNum++)
{
// Method 2
if (bGetAllInstances || IsInList(asNames, pWS[ulNum].Name))
{
hr = StackObj.m_pCfgComp->QueryInterface( IID_IUserSecurity , ( LPVOID * )&pUserSecurity );
if (SUCCEEDED ( hr ) && pUserSecurity != NULL)
{
hr = pUserSecurity->GetUserPermList( pWS[ulNum].Name , &cbItems , &pUserList, 0 );
hr = pUserSecurity->GetUserPermList( pWS[ulNum].Name , &cbAuditItems , &pUserAuditList, 1 );
for( DWORD i = 0; i < cbItems && SUCCEEDED( hr ) ; ++i )
{
for( DWORD j = 0;j < cbAuditItems ; j ++ )
{
bFound = 0;
if( lstrcmpi (pUserAuditList[j].Name, pUserList[i].Name) == 0 )
{
bFound = 1;
ulAuditNum = j;
break;
}
}
CInstance* pInstance = CreateNewInstance(pMethodContext);
if( pInstance == NULL )
{
ERR((TB,"TSAccount@ExecQuery: CreateNewInstance failed"));
hr = WBEM_E_OUT_OF_MEMORY;
break;
}
if( bFound == 1 )
{
hr = LoadPropertyValues(pInstance, ulRequiredProperties, &pWS[ulNum], &pUserList[i], &pUserAuditList[ulAuditNum]);
}
else
{
hr = LoadPropertyValues(pInstance, ulRequiredProperties, &pWS[ulNum], &pUserList[i], NULL);
}
if( SUCCEEDED( hr ) )
{
hr = pInstance->Commit();
}
pInstance->Release();
}
if( pUserList != NULL )
{
CoTaskMemFree( pUserList );
pUserList = NULL;
}
if( pUserAuditList != NULL )
{
CoTaskMemFree( pUserAuditList );
pUserAuditList = NULL;
}
}
if( pUserSecurity != NULL )
{
pUserSecurity->Release();
pUserSecurity = NULL;
}
}
}
}
if( pUserList != NULL )
{
CoTaskMemFree( pUserList );
pUserList = NULL;
}
if( pUserAuditList != NULL )
{
CoTaskMemFree( pUserAuditList );
pUserAuditList = NULL;
}
if( pWS != NULL )
{
CoTaskMemFree(pWS);
}
if( pUserSecurity != NULL )
{
pUserSecurity->Release();
pUserSecurity = NULL;
}
return hr;
}
//=------------------------------
HRESULT CWin32_TSAccount::GetObject ( CInstance* pInstance, long lFlags, CFrameworkQuery &Query )
{
HRESULT hr = WBEM_E_NOT_FOUND;
DWORD dwData = 0;
CHString chTermName;
CHString chAccountName;
DWORD cbItems = 0;
DWORD cbAuditItems = 0;
ULONG ulSize = 0;
ULONGLONG ulRequiredProperties = 0;
LONG lSize = 0;
bool bFound = 0;
PWS pWS = NULL;
PUSERPERMLIST pUserList = NULL;
PUSERPERMLIST pUserAuditList = NULL;
ULONG ulNum = 0;
ULONG ulAuditNum = 0;
IUserSecurity *pUserSecurity = NULL;
CStackClass StackObj;
if( StackObj.m_pCfgComp == NULL)
{
return WBEM_E_ILLEGAL_NULL;
}
if( pInstance == NULL )
{
ERR((TB,"TSAccount@GetObject: invalid pointer"));
return WBEM_E_ILLEGAL_NULL;
}
pInstance->GetCHString(m_szTerminalName, chTermName);
if( chTermName.GetLength() > WINSTATIONNAME_LENGTH )
{
return WBEM_E_VALUE_OUT_OF_RANGE;
}
if( chTermName.IsEmpty() != 0 )
{
return WBEM_E_ILLEGAL_NULL;
}
pInstance->GetCHString(m_szAccountName, chAccountName);
if( chAccountName.GetLength() > NASIUSERNAME_LENGTH )
{
return WBEM_E_VALUE_OUT_OF_RANGE;
}
if( chAccountName.IsEmpty() != 0 )
{
return WBEM_E_ILLEGAL_NULL;
}
if( Query.IsPropertyRequired(m_szTerminalName) )
ulRequiredProperties |= BIT_TERMINALNAME;
if( Query.IsPropertyRequired(m_szSID) )
ulRequiredProperties |= BIT_SID;
if( Query.IsPropertyRequired(m_szAccountName) )
ulRequiredProperties |= BIT_ACCOUNTNAME;
if( Query.IsPropertyRequired(m_szAuditSuccess) )
ulRequiredProperties |= BIT_AUDITSUCCESS;
if( Query.IsPropertyRequired(m_szAuditFail) )
ulRequiredProperties |= BIT_AUDITFAIL;
if( Query.IsPropertyRequired(m_szPermissionsAllowed) )
ulRequiredProperties |= BIT_PERMISSIONSALLOWED;
if( Query.IsPropertyRequired(m_szPermissionsDenied) )
ulRequiredProperties |= BIT_PERMISSIONSDENIED;
hr = StackObj.m_pCfgComp->GetWSInfo( ( LPTSTR )( LPCTSTR )chTermName, &lSize, &pWS);
hr = StackObj.m_pCfgComp->QueryInterface( IID_IUserSecurity , ( LPVOID * )&pUserSecurity );
if( pUserSecurity != NULL && pWS != NULL && SUCCEEDED( hr ))
{
do
{
hr = pUserSecurity->GetUserPermList( ( LPTSTR )( LPCTSTR ) chTermName , &cbAuditItems , &pUserAuditList, 1 );
if( SUCCEEDED( hr ) && pUserAuditList != NULL)
{
for( ulAuditNum = 0; ulAuditNum < cbAuditItems ; ulAuditNum ++ )
{
bFound = 0;
if( lstrcmpi (pUserAuditList[ulAuditNum].Name, (LPCTSTR) chAccountName) == 0 )
{
bFound = 1;
break;
}
}
}
hr = pUserSecurity->GetUserPermList( ( LPTSTR )( LPCTSTR ) chTermName , &cbItems , &pUserList, 0 );
if( SUCCEEDED (hr) && pUserList != NULL )
{
for( ulNum = 0; ulNum < cbItems ; ulNum ++ )
{
if( lstrcmpi (pUserList[ulNum].Name, (LPCTSTR) chAccountName) != 0 )
continue;
if( bFound == 1 )
{
hr = LoadPropertyValues(pInstance, ulRequiredProperties, pWS, &pUserList[ulNum], &pUserAuditList[ulAuditNum]);
}
else
{
hr = LoadPropertyValues(pInstance, ulRequiredProperties, pWS, &pUserList[ulNum], NULL);
}
if( !(SUCCEEDED ( hr ) ))
{
hr = WBEM_E_INVALID_OBJECT;
break;
}
}
}
}while(0);
}
if( pUserList != NULL )
{
CoTaskMemFree( pUserList );
}
if( pUserAuditList != NULL )
{
CoTaskMemFree( pUserAuditList );
}
if( pWS != NULL )
{
CoTaskMemFree (pWS);
}
if( pUserSecurity != NULL )
{
pUserSecurity->Release();
}
return hr;
}
//=--------------------
BOOL CWin32_TSAccount::IsInList(const CHStringArray &asArray, LPCWSTR pszString)
{
DWORD dwSize = asArray.GetSize();
for( DWORD x=0; x < dwSize; x++ )
{
if( asArray[x].CompareNoCase(pszString) == 0 )
{
return TRUE;
}
}
return FALSE;
}
//=-----------------
HRESULT CWin32_TSAccount::LoadPropertyValues( CInstance *pInstance, ULONGLONG ulRequiredProperties, PWS pWS, PUSERPERMLIST pUserList, PUSERPERMLIST pUserAuditList)
{
HRESULT hr = S_OK;
LONG lSize ;
DWORD dwData = 0 ;
DWORD cbItems = 0;
if( pInstance == NULL )
{
return WBEM_E_INVALID_PARAMETER;
}
if( pWS != NULL && pUserList != NULL )
{
if( ulRequiredProperties & BIT_TERMINALNAME )
{
pInstance->SetCharSplat(m_szTerminalName, pWS->Name);
}
if( ulRequiredProperties & BIT_SID )
{
pInstance->SetWCHARSplat(m_szSID, pUserList->Sid);
}
if( ulRequiredProperties & BIT_ACCOUNTNAME )
{
pInstance->SetCharSplat(m_szAccountName, pUserList->Name);
}
if( ulRequiredProperties & BIT_PERMISSIONSALLOWED )
{
if( pUserList->Type == 1 )
{
pInstance->SetDWORD(m_szPermissionsAllowed, pUserList->Mask);
}
else
{
pInstance->SetDWORD(m_szPermissionsAllowed, 0);
}
}
if( ulRequiredProperties & BIT_PERMISSIONSDENIED )
{
if( pUserList->Type == 3 )
{
pInstance->SetDWORD(m_szPermissionsDenied, pUserList->Mask);
}
else
{
pInstance->SetDWORD(m_szPermissionsDenied, 0);
}
}
if( ulRequiredProperties & BIT_AUDITSUCCESS )
{
if( pUserAuditList != NULL && pUserAuditList->Type == 5 )
{
pInstance->SetDWORD(m_szAuditSuccess, pUserAuditList->Mask);
}
else
{
pInstance->SetDWORD(m_szAuditSuccess, 0);
}
}
if( ulRequiredProperties & BIT_AUDITFAIL )
{
if( pUserAuditList != NULL && pUserAuditList->Type == 6 )
{
pInstance->SetDWORD(m_szAuditFail, pUserAuditList->Mask);
}
else
{
pInstance->SetDWORD(m_szAuditFail, 0);
}
}
}
return S_OK;
}