3188 lines
103 KiB
C++
3188 lines
103 KiB
C++
/******************************************************************
|
|
Copyright (C) 2000 Microsoft Corp.
|
|
|
|
Terminal.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>
|
|
#include "Terminal.h"
|
|
#include "registry.h"
|
|
#include "smartptr.h"
|
|
#include <windows.h>
|
|
#include "cfgbkend_i.c"
|
|
|
|
|
|
#define TS_PATH TEXT("SYSTEM\\ControlSet\\Control\\Terminal Server")
|
|
#define TS_LOGON_PATH TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon")
|
|
#define TERMINAL_SERVICE_PARAM_DISCOVERY TEXT("SYSTEM\\CurrentControlSet\\Services\\TermService\\Parameters")
|
|
#define TERMINAL_SERVICE_PARAM_DISCOVERY_SERVERS TEXT("SYSTEM\\CurrentControlSet\\Services\\TermService\\Parameters\\LicenseServers")
|
|
|
|
|
|
extern TCHAR tchErrorMessage[ 80 ];
|
|
|
|
|
|
|
|
// TO DO: Replace "NameSpace" with the appropriate namespace for your
|
|
// provider instance. For instance: "root\\default or "root\\cimv2".
|
|
//===================================================================
|
|
|
|
|
|
// Property names
|
|
//===============
|
|
|
|
|
|
// Property names
|
|
//===============
|
|
|
|
const static WCHAR* pErrorClass = L"\\\\.\\root\\cimv2:TerminalServiceSettingError";
|
|
|
|
|
|
CStackClass::CStackClass ( )
|
|
{
|
|
HRESULT hr;
|
|
|
|
m_pCfg = NULL;
|
|
m_pCfgComp = NULL;
|
|
|
|
hr = CoGetClassObject(CLSID_CfgComp, CLSCTX_INPROC_SERVER, NULL, IID_IClassFactory, (void **)&m_pCfg);
|
|
|
|
TRC2((TB, "StackClass@Constructor: CoGetClassObject of IClassFactory ret 0x%x", hr));
|
|
|
|
if( SUCCEEDED ( hr ) && m_pCfg != NULL )
|
|
{
|
|
hr = m_pCfg->CreateInstance(NULL, IID_ICfgComp, (void **)&m_pCfgComp);
|
|
|
|
TRC2((TB, "StackClass@Constructor: CoCreateInstance of ICfgComp ret 0x%x", hr));
|
|
|
|
if( SUCCEEDED ( hr ) && m_pCfgComp != NULL )
|
|
{
|
|
hr = m_pCfgComp->Initialize( );
|
|
}
|
|
else
|
|
{
|
|
m_pCfgComp = NULL;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_pCfgComp = NULL;
|
|
m_pCfg = NULL;
|
|
}
|
|
}
|
|
|
|
|
|
//=--------------------
|
|
/******************************************************************************************************
|
|
*
|
|
*DESCRIPTION : CWin32_TSProvider class is a base class from which all other classes are derived.
|
|
* The destructor releases the CfgBkEnd interface pointer.
|
|
*
|
|
********************************************************************************************************/
|
|
|
|
CStackClass::~CStackClass ()
|
|
{
|
|
if ( NULL != m_pCfgComp )
|
|
{
|
|
m_pCfgComp->Release();
|
|
|
|
TRC2((TB, "StackClass@Destructor for ICfgComp: succeeded"));
|
|
}
|
|
if ( NULL != m_pCfg )
|
|
{
|
|
m_pCfg->Release();
|
|
|
|
TRC2((TB, "StackClass@Destructor for IClassFactory: succeeded"));
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//------------------------
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* FUNCTION : CWin32_TerminalServiceSetting::CWin32_TerminalServiceSetting
|
|
* This class reads and sets the Server Settings such as Terminal
|
|
* server mode, license type, active desktop state, temp folders,
|
|
* logon and Help.
|
|
*
|
|
*****************************************************************************/
|
|
CWin32_TerminalServiceSetting::CWin32_TerminalServiceSetting (LPCWSTR lpwszName, LPCWSTR lpwszNameSpace ) : Provider( lpwszName, lpwszNameSpace )
|
|
{
|
|
|
|
if ( g_hInstance != NULL)
|
|
{
|
|
|
|
TRC2((TB, "CWin32_TerminalServiceSetting_ctor"));
|
|
|
|
_tcscpy(m_szServerName, _T("ServerName"));
|
|
|
|
_tcscpy(m_szMode, _T("TerminalServerMode"));
|
|
|
|
_tcscpy(m_szLicensingName, _T("LicensingName"));
|
|
|
|
_tcscpy(m_szLicensingDescription, _T("LicensingDescription"));
|
|
|
|
_tcscpy(m_szActiveDesktop, _T("ActiveDesktop"));
|
|
|
|
_tcscpy(m_szUserPerm, _T("UserPermission"));
|
|
|
|
_tcscpy(m_szDeleteTempFolders, _T("DeleteTempFolders"));
|
|
|
|
_tcscpy(m_szUseTempFolders, _T("UseTempFolders"));
|
|
|
|
_tcscpy(m_szLogons, _T("Logons"));
|
|
|
|
_tcscpy(m_szHelp, _T("Help"));
|
|
|
|
_tcscpy(m_szValue, _T("Value"));
|
|
|
|
_tcscpy(m_szPropertyName, _T("PropertyName"));
|
|
|
|
_tcscpy(m_szChangeMode, _T("ChangeMode"));
|
|
|
|
_tcscpy(m_szLicensingType, _T("LicensingType"));
|
|
|
|
_tcscpy(m_szSetPolicyPropertyName, _T("SetPolicyPropertyName"));
|
|
|
|
_tcscpy(m_szAllowTSConnections, _T("AllowTSConnections"));
|
|
|
|
_tcscpy(m_szSetAllowTSConnections, _T("SetAllowTSConnections"));
|
|
|
|
_tcscpy(m_szSingleSession, _T("SingleSession"));
|
|
|
|
_tcscpy(m_szSetSingleSession, _T("SetSingleSession"));
|
|
|
|
_tcscpy(m_szProfilePath, _T("ProfilePath"));
|
|
|
|
_tcscpy(m_szHomeDirectory, _T("HomeDirectory"));
|
|
|
|
_tcscpy(m_szSetProfilePath, _T("SetProfilePath"));
|
|
|
|
_tcscpy(m_szSetHomeDirectory, _T("SetHomeDirectory"));
|
|
|
|
_tcscpy(m_szDirectConnectLicenseServers, _T("DirectConnectLicenseServers"));
|
|
|
|
_tcscpy(m_szAddDirectConnectLicenseServer, _T("AddDirectConnectLicenseServer"));
|
|
|
|
_tcscpy(m_szDeleteDirectConnectLicenseServer, _T("DeleteDirectConnectLicenseServer"));
|
|
|
|
_tcscpy(m_szLicenseServerName, _T("LicenseServerName"));
|
|
|
|
}
|
|
RegGetMachinePolicy(&m_gpPolicy);
|
|
|
|
}
|
|
|
|
//=-------------
|
|
/*****************************************************************************
|
|
*
|
|
* FUNCTION : CWin32_TerminalServiceSetting::~CWin32_TerminalServiceSetting
|
|
*****************************************************************************/
|
|
CWin32_TerminalServiceSetting::~CWin32_TerminalServiceSetting ()
|
|
{
|
|
}
|
|
//=-------------
|
|
/*****************************************************************************
|
|
*
|
|
* FUNCTION : CWin32_TerminalServiceSetting::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_TerminalServiceSetting::EnumerateInstances (MethodContext* pMethodContext, long lFlags )
|
|
{
|
|
HRESULT hr = WBEM_E_INVALID_PARAMETER;
|
|
|
|
CInstance* pInstance = CreateNewInstance(pMethodContext);
|
|
|
|
if( pInstance != NULL )
|
|
{
|
|
|
|
TRC2((TB, "TerminalServiceSetting@EnumerateInstances: CreateNewInstance succeeded"));
|
|
|
|
hr = LoadPropertyValues(pInstance, BIT_ALL_PROPERTIES);
|
|
|
|
if( SUCCEEDED( hr ))
|
|
{
|
|
hr = pInstance->Commit();
|
|
|
|
}
|
|
pInstance->Release( );
|
|
}
|
|
|
|
return hr ;
|
|
}
|
|
//=---------
|
|
/*****************************************************************************
|
|
*
|
|
* FUNCTION : CWin32_TerminalServiceSetting::GetObject
|
|
*
|
|
* DESCRIPTION : Find a single instance based on the key property, the 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_TerminalServiceSetting::GetObject ( CInstance* pInstance, long lFlags, CFrameworkQuery &Query )
|
|
{
|
|
|
|
|
|
HRESULT hr = WBEM_S_NO_ERROR;
|
|
DWORD dwMode = 0; // Mode
|
|
BOOL bActivate ;
|
|
DWORD dwStatus = 0;
|
|
CRegistry oRegObject;
|
|
DWORD dwData = 0;
|
|
DWORD dwRequiredProperties = 0;
|
|
|
|
|
|
if( Query.IsPropertyRequired(m_szServerName))
|
|
dwRequiredProperties |= BIT_SERVERNAME;
|
|
|
|
if (Query.IsPropertyRequired(m_szMode))
|
|
dwRequiredProperties |= BIT_MODE;
|
|
|
|
if (Query.IsPropertyRequired(m_szActiveDesktop))
|
|
dwRequiredProperties |= BIT_ACTIVEDESKTOP;
|
|
|
|
if (Query.IsPropertyRequired(m_szDeleteTempFolders))
|
|
dwRequiredProperties |= BIT_DELETETEMPDIRS;
|
|
|
|
if (Query.IsPropertyRequired(m_szLicensingType))
|
|
dwRequiredProperties |= BIT_LICENSING;
|
|
|
|
if (Query.IsPropertyRequired(m_szLicensingName))
|
|
dwRequiredProperties |= BIT_LICENSING;
|
|
|
|
if (Query.IsPropertyRequired(m_szLicensingDescription))
|
|
dwRequiredProperties |= BIT_LICENSING;
|
|
|
|
if (Query.IsPropertyRequired(m_szLogons))
|
|
dwRequiredProperties |= BIT_LOGONS;
|
|
|
|
if (Query.IsPropertyRequired(m_szUserPerm))
|
|
dwRequiredProperties |= BIT_USERPERM;
|
|
|
|
if (Query.IsPropertyRequired(m_szUseTempFolders))
|
|
dwRequiredProperties |= BIT_PERSESSIONTEMPDIR;
|
|
|
|
if (Query.IsPropertyRequired(m_szHelp))
|
|
dwRequiredProperties |= BIT_HELP;
|
|
|
|
if (Query.IsPropertyRequired(m_szAllowTSConnections))
|
|
dwRequiredProperties |= BIT_ALLOWTSCONNECTIONS;
|
|
|
|
if (Query.IsPropertyRequired(m_szSingleSession))
|
|
dwRequiredProperties |= BIT_SINGLESESSION;
|
|
|
|
if (Query.IsPropertyRequired(m_szProfilePath))
|
|
dwRequiredProperties |= BIT_PROFILEPATH;
|
|
|
|
if (Query.IsPropertyRequired(m_szHomeDirectory))
|
|
dwRequiredProperties |= BIT_HOMEDIRECTORY;
|
|
|
|
if (Query.IsPropertyRequired(m_szDirectConnectLicenseServers))
|
|
dwRequiredProperties |= BIT_DIRECTCONNECTLICENSESERVERS;
|
|
|
|
hr = LoadPropertyValues(pInstance, dwRequiredProperties);
|
|
|
|
|
|
return S_OK ;
|
|
}
|
|
//=---------
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* FUNCTION : CWin32_TerminalServiceSetting::ExecQuery
|
|
*
|
|
* DESCRIPTION : The method context is passed for 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.
|
|
*
|
|
* INPUTS : A pointer to the MethodContext for communication with WinMgmt.
|
|
* A query object describing the query to satisfy.
|
|
* 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_FORWARD_ONLY
|
|
* WBEM_FLAG_BIDIRECTIONAL
|
|
* WBEM_FLAG_ENSURE_LOCATABLE
|
|
*
|
|
* RETURNS : WBEM_E_PROVIDER_NOT_CAPABLE if queries not supported for
|
|
* this class or if the query is too complex for this class
|
|
* to interpret. The framework will call the EnumerateInstances
|
|
* function instead and let Winmgmt post filter.
|
|
* WBEM_E_FAILED if the query failed
|
|
* WBEM_S_NO_ERROR if query was successful
|
|
*
|
|
* COMMENTS : TO DO: Most providers will not need to implement this method. If you don't, WinMgmt
|
|
* will call your enumerate function to get all the instances and perform the
|
|
* filtering for you. Unless you expect SIGNIFICANT savings from implementing
|
|
* queries, you should remove this method. You should also remove this method
|
|
* if you are implementing a 'method only' provider.
|
|
*
|
|
*****************************************************************************/
|
|
HRESULT CWin32_TerminalServiceSetting::ExecQuery (MethodContext *pMethodContext, CFrameworkQuery& Query, long lFlags)
|
|
{
|
|
|
|
HRESULT hr = WBEM_E_NOT_FOUND;
|
|
DWORD dwRequiredProperties = 0;
|
|
CHStringArray asNames;
|
|
DWORD dwMode = 0;
|
|
DWORD dwStatus = 0;
|
|
CStackClass StackObj;
|
|
|
|
if( StackObj.m_pCfgComp == NULL)
|
|
{
|
|
return WBEM_E_ILLEGAL_NULL;
|
|
}
|
|
|
|
// Method 2
|
|
Query.GetValuesForProp(m_szServerName, asNames);
|
|
|
|
BOOL bGetAllInstances = asNames.GetSize() == 0;
|
|
|
|
// Method 1
|
|
if (Query.IsPropertyRequired(m_szServerName))
|
|
dwRequiredProperties |= BIT_SERVERNAME;
|
|
|
|
if (Query.IsPropertyRequired(m_szMode))
|
|
dwRequiredProperties |= BIT_MODE;
|
|
|
|
if (Query.IsPropertyRequired(m_szActiveDesktop))
|
|
dwRequiredProperties |= BIT_ACTIVEDESKTOP;
|
|
|
|
if (Query.IsPropertyRequired(m_szDeleteTempFolders))
|
|
dwRequiredProperties |= BIT_DELETETEMPDIRS;
|
|
|
|
if (Query.IsPropertyRequired(m_szLicensingType))
|
|
dwRequiredProperties |= BIT_LICENSING;
|
|
|
|
if (Query.IsPropertyRequired(m_szLogons))
|
|
dwRequiredProperties |= BIT_LOGONS;
|
|
|
|
if (Query.IsPropertyRequired(m_szUserPerm))
|
|
dwRequiredProperties |= BIT_USERPERM;
|
|
|
|
if (Query.IsPropertyRequired(m_szUseTempFolders))
|
|
dwRequiredProperties |= BIT_PERSESSIONTEMPDIR;
|
|
|
|
if (Query.IsPropertyRequired(m_szHelp))
|
|
dwRequiredProperties |= BIT_HELP;
|
|
|
|
if (Query.IsPropertyRequired(m_szAllowTSConnections))
|
|
dwRequiredProperties |= BIT_ALLOWTSCONNECTIONS;
|
|
|
|
if (Query.IsPropertyRequired(m_szSingleSession))
|
|
dwRequiredProperties |= BIT_SINGLESESSION;
|
|
|
|
if (Query.IsPropertyRequired(m_szProfilePath))
|
|
dwRequiredProperties |= BIT_PROFILEPATH;
|
|
|
|
if (Query.IsPropertyRequired(m_szHomeDirectory))
|
|
dwRequiredProperties |= BIT_HOMEDIRECTORY;
|
|
|
|
if (Query.IsPropertyRequired(m_szDirectConnectLicenseServers))
|
|
dwRequiredProperties |= BIT_DIRECTCONNECTLICENSESERVERS;
|
|
|
|
|
|
ISettingsComp *pSettings = NULL;
|
|
|
|
hr = StackObj.m_pCfgComp->QueryInterface( IID_ISettingsComp , ( PVOID * )&pSettings ) ;
|
|
|
|
do
|
|
{
|
|
if( SUCCEEDED( hr ) && pSettings != NULL )
|
|
{
|
|
|
|
// Method 2
|
|
|
|
CInstance* pInstance = CreateNewInstance(pMethodContext);
|
|
|
|
if( pInstance == NULL)
|
|
{
|
|
|
|
ERR((TB, "TerminalServiceSetting@ExecQuery: CreateNewInstance failed"));
|
|
|
|
hr = WBEM_E_OUT_OF_MEMORY;
|
|
|
|
break;
|
|
}
|
|
|
|
hr = LoadPropertyValues(pInstance, dwRequiredProperties);
|
|
|
|
if( SUCCEEDED( hr ) )
|
|
{
|
|
hr = pInstance->Commit();
|
|
}
|
|
|
|
pInstance->Release();
|
|
}
|
|
|
|
}while (0);
|
|
|
|
if ( pSettings != NULL )
|
|
{
|
|
pSettings->Release();
|
|
}
|
|
|
|
return hr;
|
|
|
|
}
|
|
|
|
|
|
//=--------------
|
|
|
|
BOOL CWin32_TerminalServiceSetting::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_TerminalServiceSetting::PutInstance
|
|
*
|
|
* DESCRIPTION : PutInstance is in provider classes that can
|
|
* write instance information back to the registry.
|
|
*
|
|
* INPUTS : A pointer to a CInstance object containing the key
|
|
* property - TerminalServerMode.
|
|
*
|
|
* 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 : ActiveDesktop state, UserPerm and Logon are configurable through
|
|
* this method as they are not Group Policy based nor server-overridable.
|
|
*
|
|
***************************************************************************************/
|
|
|
|
HRESULT CWin32_TerminalServiceSetting::PutInstance ( const CInstance &Instance, long lFlags)
|
|
{
|
|
HRESULT hr = 0;
|
|
DWORD dwMode = 0;
|
|
DWORD dwlicensing = 0; // Licensing mode
|
|
DWORD dwActiveDesktop = 0; // Active Desktop Enabled or Disabled
|
|
DWORD dwUserPerm = 0; // Application Compatibility
|
|
DWORD dwDeleteTempFolders = 0; // Delete Temporary Directories on Exit
|
|
DWORD dwUseTempFolders = 0;
|
|
DWORD dwData = 0;
|
|
DWORD dwStatus = 0;
|
|
CHString chData;
|
|
CRegistry oRegObject;
|
|
OSVERSIONINFOW OsVersionInfo;
|
|
OsVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW);
|
|
TCHAR tch[MAX_PATH] = {0};
|
|
ICfgComp *pCfgComp = NULL;
|
|
|
|
hr = WBEM_S_NO_ERROR;
|
|
|
|
CStackClass StackObj;
|
|
|
|
if(StackObj.m_pCfgComp == NULL)
|
|
{
|
|
return WBEM_E_ILLEGAL_NULL;
|
|
}
|
|
|
|
ISettingsComp *pSettings = NULL;
|
|
|
|
hr = StackObj.m_pCfgComp->QueryInterface( IID_ISettingsComp , ( PVOID * )&pSettings ) ;
|
|
|
|
do
|
|
{
|
|
if( SUCCEEDED (hr) && pSettings != NULL )
|
|
{
|
|
if( Instance.GetDWORD(m_szActiveDesktop, dwActiveDesktop ) )
|
|
{
|
|
if( dwActiveDesktop != 0 && dwActiveDesktop != 1 )
|
|
{
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
|
|
break;
|
|
}
|
|
|
|
pSettings->SetActiveDesktopState( dwActiveDesktop, &dwStatus );
|
|
|
|
TRC2((TB, "TerminalServiceSetting@PutInstance: SetActiveDesktopState returned 0x%x\n" , dwStatus));
|
|
}
|
|
|
|
if( Instance.GetDWORD( m_szUserPerm, dwUserPerm ) )
|
|
{
|
|
if( dwUserPerm != 0 && dwUserPerm != 1 )
|
|
{
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
|
|
break;
|
|
}
|
|
|
|
pSettings->SetUserPerm(dwUserPerm, &dwStatus );
|
|
|
|
TRC2((TB, "TerminalServiceSetting@PutInstance: SetUserPerm returned 0x%x\n" , dwStatus));
|
|
}
|
|
|
|
|
|
|
|
hr = oRegObject.OpenKey(HKEY_LOCAL_MACHINE, TS_LOGON_PATH);
|
|
|
|
chData.Empty();
|
|
|
|
if( SUCCEEDED( hr ) )
|
|
{
|
|
if( GetVersionEx( &OsVersionInfo) )
|
|
{
|
|
if( OsVersionInfo.dwMajorVersion == 5 && OsVersionInfo.dwMinorVersion == 0 )
|
|
{
|
|
TRC2((TB, "TerminalServiceSetting@GetObject GetVersionInfo is Win2000"));
|
|
|
|
if( Instance.GetCHString(m_szLogons, chData ) )
|
|
{
|
|
if( chData.IsEmpty() || ((lstrcmp ((LPCTSTR)chData, L"0") != 0 ) && (lstrcmp ((LPCTSTR) chData, L"1") != 0)) )
|
|
{
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
|
|
break;
|
|
}
|
|
|
|
// Todo: Add this for Beta2 to reverse logic
|
|
|
|
/*
|
|
|
|
if( lstrcmp ((LPCTSTR)chData, L"0") == 0 )
|
|
{
|
|
chData.Empty();
|
|
chData = L"1";
|
|
}
|
|
else
|
|
{
|
|
chData.Empty();
|
|
chData = L"0";
|
|
}
|
|
*/
|
|
|
|
hr = oRegObject.WriteRegString(L"WinStationsDisabled", (LPTSTR) (LPCTSTR) chData);
|
|
|
|
TRC2((TB, "TerminalServiceSetting@PutInstance WinStationsDisabled returned 0x%x\n" , hr));
|
|
}
|
|
}
|
|
|
|
else
|
|
{
|
|
TRC2((TB, "TermServiceSetting@PutInstance GetVersionInfo is Whistler"));
|
|
|
|
if( Instance.GetCHString(m_szLogons, chData ) )
|
|
{
|
|
if( chData.IsEmpty() || ((lstrcmp ((LPCTSTR)chData, L"0") != 0 ) && (lstrcmp ((LPCTSTR) chData, L"1") != 0)) )
|
|
{
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
|
|
break;
|
|
}
|
|
|
|
/*
|
|
|
|
if( lstrcmp ((LPCTSTR)chData, L"0") == 0 )
|
|
{
|
|
chData.Empty();
|
|
chData = L"1";
|
|
}
|
|
else
|
|
{
|
|
chData.Empty();
|
|
chData = L"0";
|
|
}
|
|
*/
|
|
|
|
hr = oRegObject.WriteRegString(L"WinStationsDisabled", (LPTSTR) (LPCTSTR) chData);
|
|
|
|
TRC2((TB, "TermServiceSetting@PutInstance WinStationDisabled returned 0x%x\n" , hr));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// ForceUpdate() is called explicitly to update WinstationsDisabled in the registry.
|
|
|
|
if( SUCCEEDED( hr ) )
|
|
{
|
|
StackObj.m_pCfgComp->ForceUpdate();
|
|
}
|
|
}
|
|
|
|
}while(0);
|
|
|
|
|
|
if( pSettings != NULL )
|
|
{
|
|
pSettings->Release();
|
|
}
|
|
|
|
return hr;
|
|
|
|
}
|
|
|
|
|
|
//=---------
|
|
/*****************************************************************************
|
|
*
|
|
* FUNCTION : CWin32_TerminalServiceSetting::DeleteInstance
|
|
*
|
|
* DESCRIPTION : DeleteInstance, like PutInstance, actually writes information
|
|
* to the software or hardware. For most hardware devices,
|
|
* DeleteInstance should not be implemented, but for software
|
|
* configuration, DeleteInstance implementation is plausible.
|
|
*
|
|
* INPUTS : A pointer to a CInstance object containing the key properties.
|
|
* A long that contains the flags described in
|
|
* IWbemServices::DeleteInstanceAsync.
|
|
*
|
|
* RETURNS : WBEM_E_PROVIDER_NOT_CAPABLE if DeleteInstance is not available.
|
|
* WBEM_E_FAILED if there is an error deleting the instance.
|
|
* WBEM_E_INVALID_PARAMETER if any of the instance properties
|
|
* are incorrect.
|
|
* WBEM_S_NO_ERROR if instance is properly deleted.
|
|
*
|
|
* COMMENTS : TO DO: If you don't intend to support deleting instances or are
|
|
* creating a 'method only' provider, remove this method.
|
|
*
|
|
*****************************************************************************/
|
|
HRESULT CWin32_TerminalServiceSetting::DeleteInstance ( const CInstance &Instance, long lFlags )
|
|
{
|
|
|
|
|
|
return (WBEM_E_PROVIDER_NOT_CAPABLE);
|
|
|
|
}
|
|
|
|
|
|
//=---------
|
|
/*****************************************************************************
|
|
*
|
|
* FUNCTION : CWin32_TerminalServiceSetting::ExecMethod
|
|
*
|
|
* DESCRIPTION : Override this function to provide support for methods.
|
|
* A method is an entry point for the user of your provider
|
|
* to request your class perform some function above and
|
|
* beyond a change of state. (A change of state should be
|
|
* handled by PutInstance() )
|
|
*
|
|
* INPUTS : A pointer to a CInstance containing the instance the method was executed against.
|
|
* A string containing the method name
|
|
* A pointer to the CInstance which contains the IN parameters.
|
|
* A pointer to the CInstance to contain the OUT parameters.
|
|
* A set of specialized method flags
|
|
*
|
|
* RETURNS : WBEM_E_PROVIDER_NOT_CAPABLE if not implemented for this class
|
|
* WBEM_S_NO_ERROR if method executes successfully
|
|
* WBEM_E_FAILED if error occurs executing method
|
|
*
|
|
* COMMENTS : Provides method to configure the License type base on
|
|
* the Terminal server mode, UseTempFolders, DeleteTempFolders
|
|
* and Help that are group policy based.
|
|
*
|
|
*****************************************************************************/
|
|
HRESULT CWin32_TerminalServiceSetting::ExecMethod ( const CInstance& Inst,
|
|
const BSTR bstrMethodName,
|
|
CInstance *pInParams,
|
|
CInstance *pOutParams,
|
|
long lFlags)
|
|
|
|
{
|
|
|
|
|
|
DWORD dwMode = 0;
|
|
DWORD dwLicensing = 0;
|
|
DWORD dwStatus = 0;
|
|
DWORD dwNewStatus = 0;
|
|
DWORD dwData = 0;
|
|
HANDLE hServer = NULL;
|
|
BOOL fRet = FALSE;
|
|
CHString chData;
|
|
bool fData;
|
|
bool bRet;
|
|
CRegistry oRegObject;
|
|
HRESULT hr = WBEM_E_INVALID_PARAMETER;
|
|
CStackClass StackObj;
|
|
HKEY hKey = NULL;
|
|
HKEY hOutKey = NULL;
|
|
|
|
|
|
if(StackObj.m_pCfgComp == NULL)
|
|
{
|
|
return WBEM_E_ILLEGAL_NULL;
|
|
}
|
|
|
|
ISettingsComp *pSettings = NULL;
|
|
|
|
if(pInParams == NULL)
|
|
{
|
|
return WBEM_E_INVALID_METHOD_PARAMETERS;
|
|
}
|
|
|
|
hr = StackObj.m_pCfgComp->QueryInterface( IID_ISettingsComp , ( PVOID * )&pSettings ) ;
|
|
|
|
do
|
|
{
|
|
if( SUCCEEDED (hr) && pSettings != NULL )
|
|
{
|
|
if( _wcsicmp(bstrMethodName, m_szChangeMode) == 0 )
|
|
{
|
|
// Configures License type based on the Terminal Server Mode. {None, Remote Administration} for "Remote Admin",
|
|
// {Per Seat, Per CPU, ICL} for "Application Server" and {Personal Terminal Server} for "Personal Terminal Server".
|
|
// uint32 ChangeMode([In] uint32 LicensingType);
|
|
|
|
hr = WBEM_S_NO_ERROR ;
|
|
|
|
|
|
bRet = pInParams->GetDWORD(m_szLicensingType, dwLicensing);
|
|
|
|
if ( !bRet )
|
|
{
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
|
|
break;
|
|
}
|
|
|
|
|
|
hServer = ServerLicensingOpen(NULL);
|
|
|
|
if (NULL != hServer)
|
|
{
|
|
dwStatus = ServerLicensingSetPolicy(hServer, dwLicensing, &dwNewStatus);
|
|
|
|
TRC2( (TB, "TermServiceSetting@ExecMethod:ChangeMode ServerLicensingSetPolicy ret old: 0x%x new: 0x%x\n" , dwStatus, dwNewStatus) );
|
|
|
|
if( ERROR_SUCCESS == dwStatus && ERROR_SUCCESS == dwNewStatus && pOutParams != NULL )
|
|
{
|
|
pOutParams->SetDWORD(L"ReturnValue", WBEM_S_NO_ERROR);
|
|
}
|
|
else if( ERROR_SUCCESS != dwStatus || ERROR_SUCCESS != dwNewStatus )
|
|
{
|
|
hr = WBEM_E_INVALID_OPERATION;
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
else if( _wcsicmp( bstrMethodName, m_szSetAllowTSConnections ) == 0 )
|
|
{
|
|
|
|
dwData = 0;
|
|
dwStatus = 0;
|
|
bRet;
|
|
|
|
RegGetMachinePolicy(&m_gpPolicy);
|
|
|
|
if( m_gpPolicy.fPolicyDenyTSConnections == 0 )
|
|
{
|
|
TRC2((TB, "Condition to update fPolicyDenyTSConnections satisfied"));
|
|
|
|
bRet = pInParams->GetDWORD(m_szAllowTSConnections, dwData);
|
|
|
|
|
|
if ( !bRet || (dwData != 0 && dwData != 1 ))
|
|
{
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
|
|
break;
|
|
}
|
|
|
|
// The bit is negated because it calls the function SetDenyTSConnections which is negative logic.
|
|
|
|
if( dwData == 0 )
|
|
{
|
|
dwData = 1;
|
|
}
|
|
else if( dwData == 1 )
|
|
{
|
|
dwData = 0;
|
|
}
|
|
|
|
hr = pSettings->SetDenyTSConnections( dwData , &dwStatus );
|
|
|
|
if( SUCCEEDED( hr ) && pOutParams != NULL )
|
|
{
|
|
hr = StackObj.m_pCfgComp->ForceUpdate();
|
|
|
|
pOutParams->SetDWORD(L"ReturnValue", WBEM_S_NO_ERROR);
|
|
|
|
TRC2((TB,"TSTerminalServiceSetting@ExecMethod: SetAllowTSConnections ret 0x%x\n" , hr ));
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
|
|
hr = WBEM_E_INVALID_OPERATION;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if( _wcsicmp( bstrMethodName, m_szSetSingleSession ) == 0 )
|
|
{
|
|
|
|
dwData = 0;
|
|
dwStatus = 0;
|
|
bRet;
|
|
|
|
RegGetMachinePolicy(&m_gpPolicy);
|
|
|
|
if( m_gpPolicy.fPolicySingleSessionPerUser == 0 )
|
|
{
|
|
TRC2((TB, "Condition to update fSingleSessionPerUser satisfied"));
|
|
|
|
bRet = pInParams->GetDWORD(m_szSingleSession, dwData);
|
|
|
|
|
|
if ( !bRet || (dwData != 0 && dwData != 1 ))
|
|
{
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
|
|
break;
|
|
}
|
|
|
|
hr = pSettings->SetSingleSessionState( dwData , &dwStatus );
|
|
|
|
if( SUCCEEDED( hr ) && pOutParams != NULL )
|
|
{
|
|
hr = StackObj.m_pCfgComp->ForceUpdate();
|
|
|
|
pOutParams->SetDWORD(L"ReturnValue", WBEM_S_NO_ERROR);
|
|
|
|
TRC2((TB,"TerminalServiceSetting@ExecMethod: SetSingleSession ret 0x%x\n" , hr ));
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
|
|
hr = WBEM_E_INVALID_OPERATION;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
else if( _wcsicmp( bstrMethodName, m_szSetProfilePath ) == 0 )
|
|
{
|
|
|
|
BSTR bstrVal = NULL;
|
|
dwStatus = 0;
|
|
bRet;
|
|
|
|
RegGetMachinePolicy(&m_gpPolicy);
|
|
|
|
if( m_gpPolicy.fPolicyWFProfilePath == 0 )
|
|
{
|
|
TRC2((TB, "Condition to update WFProfilePath satisfied"));
|
|
|
|
bRet = pInParams->GetCHString(m_szProfilePath, chData);
|
|
|
|
if ( !bRet )
|
|
{
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
|
|
break;
|
|
}
|
|
|
|
bstrVal = SysAllocString((LPTSTR) (LPCTSTR) (chData));
|
|
|
|
if(bstrVal != NULL)
|
|
{
|
|
hr = pSettings->SetProfilePath( bstrVal , &dwStatus );
|
|
|
|
if( SUCCEEDED( hr ) && pOutParams != NULL )
|
|
{
|
|
hr = StackObj.m_pCfgComp->ForceUpdate();
|
|
|
|
pOutParams->SetDWORD(L"ReturnValue", WBEM_S_NO_ERROR);
|
|
|
|
TRC2((TB,"TerminalServiceSetting@ExecMethod: SetProfilePath ret 0x%x\n" , hr ));
|
|
}
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
|
|
hr = WBEM_E_INVALID_OPERATION;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
else if( _wcsicmp( bstrMethodName, m_szSetHomeDirectory ) == 0 )
|
|
{
|
|
|
|
BSTR bstrVal = NULL;
|
|
dwStatus = 0;
|
|
bRet;
|
|
|
|
RegGetMachinePolicy(&m_gpPolicy);
|
|
|
|
if( m_gpPolicy.fPolicyWFHomeDir == 0 )
|
|
{
|
|
TRC2((TB, "Condition to update WFProfilePath satisfied"));
|
|
|
|
bRet = pInParams->GetCHString(m_szHomeDirectory, chData);
|
|
|
|
|
|
if ( !bRet )
|
|
{
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
|
|
break;
|
|
}
|
|
|
|
bstrVal = SysAllocString((LPTSTR) (LPCTSTR) (chData));
|
|
|
|
if(bstrVal != NULL)
|
|
{
|
|
hr = pSettings->SetHomeDir( bstrVal , &dwStatus );
|
|
|
|
if( SUCCEEDED( hr ) && pOutParams != NULL )
|
|
{
|
|
hr = StackObj.m_pCfgComp->ForceUpdate();
|
|
|
|
pOutParams->SetDWORD(L"ReturnValue", WBEM_S_NO_ERROR);
|
|
|
|
TRC2((TB,"TerminalServiceSetting@ExecMethod: SetHomeDirectory ret 0x%x\n" , hr ));
|
|
}
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
|
|
hr = WBEM_E_INVALID_OPERATION;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
else if( _wcsicmp(bstrMethodName, m_szSetPolicyPropertyName) == 0 )
|
|
{
|
|
// PropertyName is an enumeration of the properties:
|
|
// DeleteTempFolders, UseTempFolders and Help which are flags that are either set
|
|
// to False or True according as whether Value is set to 0 or 1 respectively.
|
|
//
|
|
// uint32 SetPolicyPropertyName([In] string PropertyName, [In] boolean Value) ;
|
|
|
|
RegGetMachinePolicy(&m_gpPolicy);
|
|
|
|
pInParams->GetCHString(m_szPropertyName, chData);
|
|
|
|
if( chData.CompareNoCase(m_szDeleteTempFolders) == 0 )
|
|
{
|
|
pInParams->Getbool(m_szValue, fData);
|
|
|
|
TRC2((TB, "m_gpPolicy.fPolicyDeleteTempFoldersOnExit ret 0x%x\n", m_gpPolicy.fPolicyDeleteTempFoldersOnExit));
|
|
|
|
if( m_gpPolicy.fPolicyDeleteTempFoldersOnExit == 0 )
|
|
{
|
|
TRC2((TB, "Condition to update fPolicyDeleteTempFoldersOnExit satisfied"));
|
|
|
|
if( fData != 0 && fData != 1 )
|
|
{
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
|
|
break;
|
|
}
|
|
|
|
hr = pSettings->SetDelDirsOnExit(fData);
|
|
|
|
TRC2((TB, "TerminalServiceSetting@PutInstance: SetDelDirsOnExit"));
|
|
|
|
if( pOutParams != NULL )
|
|
{
|
|
pOutParams->SetDWORD(L"ReturnValue", hr);
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
hr = WBEM_E_INVALID_OPERATION;
|
|
|
|
break;
|
|
}
|
|
}
|
|
else if( chData.CompareNoCase(m_szUseTempFolders) == 0 )
|
|
{
|
|
pInParams->Getbool(L"Value", fData);
|
|
|
|
TRC2((TB, "m_gpPolicy.fPolicyTempFoldersPerSession ret 0x%x\n", m_gpPolicy.fPolicyTempFoldersPerSession));
|
|
|
|
|
|
if( m_gpPolicy.fPolicyTempFoldersPerSession == 0 )
|
|
{
|
|
TRC2((TB, "Condition to update fPolicyTempFoldersPerSession satisfied"));
|
|
|
|
if( fData != 0 && fData != 1 )
|
|
{
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
|
|
break;
|
|
}
|
|
|
|
hr = pSettings->SetUseTempDirPerSession(fData );
|
|
|
|
TRC2((TB, "TerminalServiceSetting@ExecMethod: SetUseTempDirPerSession"));
|
|
|
|
if( pOutParams != NULL )
|
|
{
|
|
pOutParams->SetDWORD(L"ReturnValue", hr);
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
hr = WBEM_E_INVALID_OPERATION;
|
|
|
|
break;
|
|
}
|
|
}
|
|
else if( chData.CompareNoCase(m_szHelp) == 0 )
|
|
{
|
|
hr = oRegObject.OpenKey(HKEY_LOCAL_MACHINE, TS_POLICY_SUB_TREE);
|
|
|
|
if( SUCCEEDED (hr) )
|
|
{
|
|
if( ERROR_SUCCESS != oRegObject.ReadRegDWord(POLICY_TS_REMDSK_ALLOWTOGETHELP, &dwData) )
|
|
{
|
|
pInParams->Getbool(m_szValue, fData);
|
|
|
|
TRC2((TB, "Condition to update fAllowToGetHelp satisfied"));
|
|
|
|
if( fData != 0 && fData != 1 )
|
|
{
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
|
|
break;
|
|
}
|
|
|
|
hr = pSettings->SetSalemHelpMode(fData, &dwStatus );
|
|
|
|
TRC2((TB, "TerminalServiceSetting@ExecMethod: Help"));
|
|
|
|
if( pOutParams != NULL && dwStatus == ERROR_SUCCESS )
|
|
{
|
|
pOutParams->SetDWORD(L"ReturnValue", WBEM_S_NO_ERROR);
|
|
}
|
|
else
|
|
{
|
|
hr = WBEM_E_INVALID_OPERATION;
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = WBEM_E_INVALID_METHOD_PARAMETERS;
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
else if( _wcsicmp( bstrMethodName, m_szAddDirectConnectLicenseServer ) == 0 )
|
|
{
|
|
DWORD dwReturn = 0;
|
|
|
|
bRet = pInParams->GetCHString(m_szLicenseServerName, chData);
|
|
|
|
if( chData.IsEmpty() )
|
|
{
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
|
|
break;
|
|
}
|
|
|
|
|
|
|
|
hr = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
|
|
TERMINAL_SERVICE_PARAM_DISCOVERY ,
|
|
0,
|
|
KEY_READ ,
|
|
&hKey );
|
|
|
|
if( ERROR_SUCCESS == hr )
|
|
{
|
|
|
|
|
|
hr = RegCreateKeyEx( hKey ,
|
|
L"LicenseServers",
|
|
0,
|
|
NULL,
|
|
REG_OPTION_NON_VOLATILE,
|
|
KEY_ALL_ACCESS,
|
|
NULL,
|
|
&hOutKey ,
|
|
&dwReturn );
|
|
if( ERROR_SUCCESS == hr )
|
|
{
|
|
hr = RegCreateKeyEx( hOutKey ,
|
|
chData.LockBuffer(),
|
|
0,
|
|
NULL,
|
|
REG_OPTION_NON_VOLATILE,
|
|
KEY_ALL_ACCESS,
|
|
NULL,
|
|
&hOutKey ,
|
|
&dwReturn );
|
|
chData.UnlockBuffer();
|
|
|
|
TRC2((TB, "Win32_TerminalServiceSetting@ExecMethod: AddLicenseServer ret 0x%x" , hr));
|
|
}
|
|
|
|
if( hr == ERROR_SUCCESS )
|
|
{
|
|
|
|
pOutParams->SetDWORD(L"ReturnValue", WBEM_S_NO_ERROR);
|
|
}
|
|
|
|
chData.Empty();
|
|
}
|
|
}
|
|
|
|
else if( _wcsicmp( bstrMethodName, m_szDeleteDirectConnectLicenseServer ) == 0 )
|
|
{
|
|
DWORD dwReturn = 0;
|
|
|
|
bRet = pInParams->GetCHString(m_szLicenseServerName, chData );
|
|
|
|
|
|
if( chData.IsEmpty() )
|
|
{
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
|
|
break;
|
|
}
|
|
|
|
hr = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
|
|
TERMINAL_SERVICE_PARAM_DISCOVERY_SERVERS,
|
|
0,
|
|
KEY_ALL_ACCESS ,
|
|
&hKey );
|
|
|
|
if( ERROR_SUCCESS == hr )
|
|
{
|
|
|
|
hr = RegDeleteKey( hKey ,
|
|
chData.LockBuffer() );
|
|
|
|
TRC2((TB, "Win32_TerminalServiceSetting@ExecMethod: DeleteLicenseServer ret 0x%x" , hr));
|
|
|
|
if( hr == ERROR_SUCCESS )
|
|
{
|
|
|
|
pOutParams->SetDWORD(L"ReturnValue", WBEM_S_NO_ERROR);
|
|
}
|
|
|
|
chData.UnlockBuffer();
|
|
|
|
chData.Empty();
|
|
|
|
}
|
|
else
|
|
{
|
|
hr = S_OK;
|
|
}
|
|
}
|
|
}
|
|
|
|
}while (0);
|
|
|
|
if( NULL != hKey )
|
|
{
|
|
RegCloseKey(hKey);
|
|
}
|
|
|
|
if(NULL != hOutKey)
|
|
{
|
|
RegCloseKey(hOutKey);
|
|
}
|
|
|
|
if( NULL != hServer )
|
|
{
|
|
ServerLicensingClose(hServer);
|
|
}
|
|
|
|
if( pSettings != NULL )
|
|
{
|
|
pSettings->Release();
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
//=---------
|
|
|
|
HRESULT CWin32_TerminalServiceSetting::LoadPropertyValues( CInstance *pInstance, DWORD dwRequiredProperties)
|
|
{
|
|
int Licensing;
|
|
DWORD dwMode = 0;
|
|
DWORD dwData = 0;
|
|
ULONG ulMode = 0;
|
|
CRegistry oRegObject;
|
|
DWORD dwSize = 0;
|
|
BOOL bData = 0;
|
|
BOOL bActivate = 0;
|
|
DWORD dwStatus = 0;
|
|
DWORD dwType = 0;
|
|
HANDLE hServer = NULL;
|
|
BYTE bbyte;
|
|
OSVERSIONINFOW OsVersionInfo;
|
|
OsVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW);
|
|
LPTSTR lpLogon;
|
|
int iData;
|
|
LPLCPOLICYINFO_V1W pPolicyInfo = NULL;
|
|
ULONG ulInfoStructVersion = LCPOLICYINFOTYPE_CURRENT;
|
|
CHString chLogon;
|
|
CHString chData;
|
|
HKEY hParamKey = NULL;
|
|
HRESULT hr = WBEM_E_INVALID_PARAMETER;
|
|
CHString chServerName;
|
|
|
|
chServerName.Format(L"%s", (LPCTSTR)GetLocalComputerName());
|
|
|
|
CStackClass StackObj;
|
|
|
|
if(StackObj.m_pCfgComp == NULL)
|
|
{
|
|
return WBEM_E_ILLEGAL_NULL;
|
|
}
|
|
|
|
if( pInstance == NULL )
|
|
{
|
|
ERR((TB, "TermServiceSetting@LoadPropertyValues: invalid interface"));
|
|
|
|
return E_FAIL;
|
|
}
|
|
ISettingsComp *pSettings = NULL;
|
|
|
|
hr = StackObj.m_pCfgComp->QueryInterface( IID_ISettingsComp , ( PVOID * )&pSettings ) ;
|
|
|
|
if( SUCCEEDED (hr) && pSettings != NULL )
|
|
{
|
|
|
|
if( dwRequiredProperties & BIT_SERVERNAME )
|
|
{
|
|
pInstance->SetCHString(m_szServerName, chServerName);
|
|
}
|
|
|
|
if( dwRequiredProperties & BIT_MODE )
|
|
{
|
|
pSettings->GetTermSrvMode(&dwMode , &dwStatus );
|
|
|
|
TRC2((TB, "TermServiceSetting@LoadPropertyValues: GetTermSrvMode returned 0x%x\n" , dwStatus));
|
|
|
|
if( ERROR_SUCCESS == dwStatus )
|
|
{
|
|
pInstance->SetDWORD(m_szMode, dwMode);
|
|
}
|
|
}
|
|
|
|
if( dwRequiredProperties & BIT_LICENSING )
|
|
{
|
|
hServer = ServerLicensingOpen(NULL);
|
|
|
|
if (NULL != hServer)
|
|
{
|
|
if( ServerLicensingGetPolicy( hServer, &ulMode ) )
|
|
{
|
|
TRC2((TB, "TermServiceSetting@LoadPropertyValues: ServerLicensingGetPolicy ret 0x%x\n" , dwStatus));
|
|
|
|
pInstance->SetDWORD(m_szLicensingType, (DWORD &)ulMode);
|
|
|
|
if( ServerLicensingGetPolicyInformation( hServer, ulMode, &ulInfoStructVersion,
|
|
(LPLCPOLICYINFOGENERIC *) &pPolicyInfo ))
|
|
{
|
|
pInstance->SetCHString(m_szLicensingName, pPolicyInfo->lpPolicyName );
|
|
pInstance->SetCHString(m_szLicensingDescription, pPolicyInfo->lpPolicyDescription );
|
|
|
|
ServerLicensingFreePolicyInformation((LPLCPOLICYINFOGENERIC *)&pPolicyInfo);
|
|
}
|
|
}
|
|
|
|
ServerLicensingClose(hServer);
|
|
}
|
|
|
|
}
|
|
|
|
if( dwRequiredProperties & BIT_ACTIVEDESKTOP )
|
|
{
|
|
pSettings->GetActiveDesktopState(&bActivate , &dwStatus );
|
|
|
|
TRC2((TB, "TermServiceSetting@LoadPropertyValues: GetActiveDesktopState returned 0x%x\n" , dwStatus));
|
|
|
|
if( ERROR_SUCCESS == dwStatus )
|
|
{
|
|
pInstance->SetDWORD(m_szActiveDesktop, (DWORD &)bActivate);
|
|
}
|
|
|
|
if( 2 == dwStatus )
|
|
{
|
|
pInstance->SetDWORD(m_szActiveDesktop, 0);
|
|
}
|
|
}
|
|
|
|
if( dwRequiredProperties & BIT_USERPERM )
|
|
{
|
|
pSettings->GetUserPerm(&bActivate , &dwStatus );
|
|
|
|
TRC2((TB, "TermServiceSetting@LoadPropertyValues: GetUserPerm returned 0x%x\n" , dwStatus));
|
|
|
|
if( ERROR_SUCCESS == dwStatus )
|
|
{
|
|
pInstance->SetDWORD(m_szUserPerm, bActivate);
|
|
}
|
|
}
|
|
|
|
|
|
if( dwRequiredProperties & BIT_DELETETEMPDIRS )
|
|
{
|
|
RegGetMachinePolicy(&m_gpPolicy);
|
|
|
|
if( m_gpPolicy.fPolicyDeleteTempFoldersOnExit != 0 )
|
|
{
|
|
bActivate = m_gpPolicy.fDeleteTempFoldersOnExit;
|
|
}
|
|
else
|
|
{
|
|
pSettings->GetDelDirsOnExit( &bActivate );
|
|
}
|
|
|
|
TRC2((TB, "TermServiceSetting@LoadPropertyValues: GetDelDirsOnExit returned 0x%x\n" , hr));
|
|
|
|
pInstance->SetDWORD(m_szDeleteTempFolders, bActivate);
|
|
}
|
|
|
|
if( dwRequiredProperties & BIT_PERSESSIONTEMPDIR )
|
|
{
|
|
RegGetMachinePolicy(&m_gpPolicy);
|
|
|
|
if( m_gpPolicy.fPolicyTempFoldersPerSession != 0 )
|
|
{
|
|
bActivate = m_gpPolicy.fTempFoldersPerSession;
|
|
}
|
|
else
|
|
{
|
|
pSettings->GetUseTempDirPerSession(&bActivate );
|
|
}
|
|
|
|
TRC2((TB, "TermServiceSetting@LoadPropertyValues: GetUseTempDirsPerSession returned 0x%x\n" , hr));
|
|
|
|
pInstance->SetDWORD(m_szUseTempFolders, bActivate);
|
|
}
|
|
|
|
|
|
if( dwRequiredProperties & BIT_LOGONS )
|
|
{
|
|
hr = oRegObject.OpenKey(HKEY_LOCAL_MACHINE, TS_LOGON_PATH);
|
|
|
|
if( SUCCEEDED( hr ) )
|
|
{
|
|
if( GetVersionEx( &OsVersionInfo) )
|
|
{
|
|
|
|
if( OsVersionInfo.dwMajorVersion == 5 && OsVersionInfo.dwMinorVersion == 0 )
|
|
{
|
|
TRC2((TB, "TermServiceSetting@LoadPropertyValues: GetVersionInfo is Win2000"));
|
|
|
|
dwData = 0;
|
|
|
|
hr = oRegObject.ReadRegDWord(L"WinStationsDisabled", &dwData);
|
|
|
|
TRC2((TB, "TermServiceSetting@LoadPropertyValues: GetWinStationsDisabled returned 0x%x\n" , hr));
|
|
|
|
if( SUCCEEDED (hr) )
|
|
{
|
|
if( dwData == 0 )
|
|
{
|
|
pInstance->SetCharSplat(m_szLogons, L"0");
|
|
}
|
|
|
|
else
|
|
{
|
|
pInstance->SetCharSplat(m_szLogons, L"1");
|
|
}
|
|
}
|
|
}
|
|
|
|
else
|
|
{
|
|
TRC2((TB, "TermServiceSetting@LoadPropertyValues: GetVersionInfo is Whistler"));
|
|
|
|
hr = oRegObject.ReadRegString(L"WinStationsDisabled", &lpLogon, &dwData);
|
|
|
|
TRC2((TB, "TermServiceSetting@LoadPropertyValues: GetWinStationsDisabled returned 0x%x\n" , hr));
|
|
|
|
if( SUCCEEDED( hr ) )
|
|
{
|
|
pInstance->SetCharSplat(m_szLogons, lpLogon);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if( dwRequiredProperties & BIT_HELP )
|
|
{
|
|
|
|
hr = pSettings->GetSalemHelpMode(&iData, &dwStatus );
|
|
|
|
TRC2((TB, "TermServiceSetting@LoadPropertyValues: GetHelp returned 0x%x" , dwStatus));
|
|
|
|
if( S_OK == dwStatus )
|
|
{
|
|
pInstance->SetDWORD(m_szHelp, iData);
|
|
}
|
|
else
|
|
{
|
|
pInstance->SetDWORD(m_szHelp, 0);
|
|
}
|
|
}
|
|
|
|
if( dwRequiredProperties & BIT_ALLOWTSCONNECTIONS )
|
|
{
|
|
|
|
RegGetMachinePolicy(&m_gpPolicy);
|
|
|
|
if( m_gpPolicy.fPolicyDenyTSConnections != 0 )
|
|
{
|
|
iData = m_gpPolicy.fDenyTSConnections;
|
|
}
|
|
else
|
|
{
|
|
hr = pSettings->GetDenyTSConnections(&iData, &dwStatus );
|
|
|
|
TRC2((TB, "TermServiceSetting@LoadPropertyValues: GetAllowTSConnections returned 0x%x" , dwStatus));
|
|
}
|
|
|
|
// The bit is negated because it calls the function GetDenyTSConnections which is negative logic.
|
|
|
|
if( iData == 0)
|
|
{
|
|
iData = 1;
|
|
}
|
|
else if( iData == 1)
|
|
{
|
|
iData = 0;
|
|
}
|
|
|
|
pInstance->SetDWORD(m_szAllowTSConnections, iData);
|
|
|
|
TRC2((TB,"TSSessionSetting@LoadPropertyValues: AllowTSConnections" ));
|
|
}
|
|
|
|
if( dwRequiredProperties & BIT_SINGLESESSION)
|
|
{
|
|
RegGetMachinePolicy(&m_gpPolicy);
|
|
|
|
if( m_gpPolicy.fPolicySingleSessionPerUser != 0 )
|
|
{
|
|
bData = m_gpPolicy.fSingleSessionPerUser;
|
|
}
|
|
else
|
|
{
|
|
hr = pSettings->GetSingleSessionState( &bData, &dwStatus);
|
|
}
|
|
dwData = bData;
|
|
|
|
pInstance->SetDWORD(m_szSingleSession, dwData);
|
|
|
|
TRC2((TB,"TermServiceSetting@LoadPropertyValues: SingleSession" ));
|
|
}
|
|
|
|
if( dwRequiredProperties & BIT_PROFILEPATH)
|
|
{
|
|
BSTR bstrData = NULL;
|
|
|
|
chData.Empty();
|
|
|
|
RegGetMachinePolicy(&m_gpPolicy);
|
|
|
|
if( m_gpPolicy.fPolicyWFProfilePath != 0 )
|
|
{
|
|
chData.Format(L"%s", m_gpPolicy.WFProfilePath);
|
|
}
|
|
else
|
|
{
|
|
hr = pSettings->GetProfilePath( &bstrData, &dwStatus);
|
|
|
|
if( bstrData != NULL)
|
|
{
|
|
chData.Format(L"%s", (LPCWSTR)(bstrData));
|
|
|
|
SysFreeString(bstrData);
|
|
}
|
|
}
|
|
|
|
pInstance->SetCHString(m_szProfilePath, chData);
|
|
|
|
TRC2((TB,"TermServiceSetting@LoadPropertyValues: ProfilePath" ));
|
|
}
|
|
|
|
if( dwRequiredProperties & BIT_HOMEDIRECTORY)
|
|
{
|
|
BSTR bstrData = NULL;
|
|
|
|
chData.Empty();
|
|
|
|
RegGetMachinePolicy(&m_gpPolicy);
|
|
|
|
if( m_gpPolicy.fPolicyWFHomeDir != 0 )
|
|
{
|
|
chData.Format(L"%s", m_gpPolicy.WFHomeDir);
|
|
}
|
|
else
|
|
{
|
|
hr = pSettings->GetHomeDir( &bstrData, &dwStatus);
|
|
|
|
if(bstrData != NULL)
|
|
{
|
|
chData.Format(L"%s", (LPCWSTR)(bstrData));
|
|
|
|
SysFreeString(bstrData);
|
|
}
|
|
}
|
|
|
|
pInstance->SetCHString(m_szHomeDirectory, chData);
|
|
|
|
TRC2((TB,"TermServiceSetting@LoadPropertyValues: HomeDirectory" ));
|
|
}
|
|
|
|
if( dwRequiredProperties & BIT_DIRECTCONNECTLICENSESERVERS)
|
|
{
|
|
|
|
DWORD dwValueType;
|
|
DWORD cbValue = 0, dwDisp;
|
|
LONG lReturn;
|
|
DWORD cbServer;
|
|
DWORD cServers;
|
|
DWORD cchServerMax;
|
|
LPWSTR szServer;
|
|
DWORD i, j;
|
|
CHString chServers;
|
|
chServers.Empty();
|
|
|
|
do
|
|
{
|
|
|
|
lReturn = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
|
|
TERMINAL_SERVICE_PARAM_DISCOVERY_SERVERS,
|
|
0,
|
|
KEY_READ,
|
|
&hParamKey );
|
|
|
|
if (ERROR_SUCCESS != lReturn)
|
|
{
|
|
break;
|
|
}
|
|
|
|
lReturn = RegQueryInfoKey(hParamKey,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
&cServers,
|
|
&cchServerMax,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL);
|
|
|
|
if (ERROR_SUCCESS != lReturn)
|
|
{
|
|
RegCloseKey( hParamKey );
|
|
|
|
break;
|
|
}
|
|
|
|
if (0 == cServers)
|
|
{
|
|
RegCloseKey( hParamKey );
|
|
|
|
hParamKey = NULL;
|
|
|
|
break;
|
|
}
|
|
|
|
|
|
// Add one for null terminator
|
|
cchServerMax++;
|
|
|
|
szServer = (LPWSTR) LocalAlloc(LPTR,cchServerMax * sizeof(WCHAR));
|
|
|
|
if(NULL == szServer)
|
|
{
|
|
LocalFree(szServer);
|
|
|
|
RegCloseKey( hParamKey );
|
|
|
|
hParamKey = NULL;
|
|
|
|
break;
|
|
}
|
|
|
|
for (i = 0; i < cServers; i++)
|
|
{
|
|
if(!chServers.IsEmpty())
|
|
{
|
|
chServers+=L"; ";
|
|
}
|
|
|
|
cbServer = cchServerMax * sizeof(WCHAR);
|
|
|
|
lReturn = RegEnumKeyEx(hParamKey,
|
|
i,
|
|
szServer,
|
|
&cbServer,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL);
|
|
|
|
if (ERROR_SUCCESS != lReturn)
|
|
{
|
|
LocalFree(szServer);
|
|
|
|
RegCloseKey( hParamKey );
|
|
|
|
hParamKey = NULL;
|
|
|
|
break;
|
|
}
|
|
|
|
chServers+= szServer;
|
|
|
|
|
|
}
|
|
|
|
if(szServer)
|
|
{
|
|
LocalFree(szServer);
|
|
}
|
|
|
|
pInstance->SetCHString(m_szDirectConnectLicenseServers, chServers);
|
|
|
|
}while(0);
|
|
}
|
|
}
|
|
|
|
|
|
if(hParamKey)
|
|
{
|
|
RegCloseKey(hParamKey);
|
|
}
|
|
|
|
if( pSettings != NULL )
|
|
{
|
|
pSettings->Release();
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//=---------
|
|
/*************************************************************************************
|
|
*
|
|
* DESCRIPTION : CWin32_TerminalService class is subclassed from the Win32_Service
|
|
* class in CIM schema. It provides live information such as Total
|
|
* sessions, Disconnected sessions, Resource constraint and
|
|
* Raw session capacity.
|
|
*
|
|
***************************************************************************************/
|
|
|
|
CWin32_TerminalService::CWin32_TerminalService (LPCWSTR lpwszName, LPCWSTR lpwszNameSpace ) : Provider( lpwszName, lpwszNameSpace )
|
|
{
|
|
if (g_hInstance != NULL)
|
|
{
|
|
TRC2((TB, "CWin32_TerminalService_ctor"));
|
|
|
|
_tcscpy(m_szName, _T("Name"));
|
|
|
|
_tcscpy(m_szCaption, _T("Caption"));
|
|
|
|
_tcscpy(m_szTotalSessions, _T("TotalSessions"));
|
|
|
|
_tcscpy(m_szDisconnectedSessions, _T("DisconnectedSessions"));
|
|
|
|
_tcscpy(m_szResourceConstraint, _T("ResourceConstraint"));
|
|
|
|
_tcscpy(m_szRawSessionCapacity, _T("RawSessionCapacity"));
|
|
|
|
|
|
}
|
|
}
|
|
|
|
//=-----------------
|
|
|
|
CWin32_TerminalService::~CWin32_TerminalService ()
|
|
{
|
|
}
|
|
|
|
//=--------------------
|
|
/************************************************************************************
|
|
*
|
|
* DESCRIPTION : Find a single instance based on the key property, "Name".
|
|
*
|
|
* INPUTS : A pointer to a CInstance object containing the key property, "Name".
|
|
* 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_TerminalService::GetObject ( CInstance* pInstance, long lFlags, CFrameworkQuery &Query )
|
|
{
|
|
HRESULT hr = WBEM_E_NOT_FOUND;
|
|
CHString chServerName;
|
|
TCHAR tchServer[MAX_PATH] = {0};
|
|
HANDLE hServerName = SERVERNAME_CURRENT;
|
|
ULONG CurrentLogonId = (ULONG) -1;
|
|
WINSTATIONLOADINDICATORDATA LIData;
|
|
ULONG Length = 0;
|
|
DWORD dwRequiredProperties = 0;
|
|
CHString chName;
|
|
|
|
pInstance->GetCHString(m_szName, chName);
|
|
|
|
pInstance->SetCHString(m_szCaption, chName);
|
|
|
|
if( chName.CompareNoCase(L"TermService") == 0 )
|
|
{
|
|
chServerName.Format(L"%s", (LPCTSTR)GetLocalComputerName());
|
|
wcscpy (tchServer, chServerName);
|
|
bool bRet = 0;
|
|
|
|
if (Query.IsPropertyRequired(m_szTotalSessions))
|
|
dwRequiredProperties |= BIT_TOTALSESSIONS;
|
|
|
|
if (Query.IsPropertyRequired(m_szDisconnectedSessions))
|
|
dwRequiredProperties |= BIT_DISCONNECTEDSESSIONS;
|
|
|
|
if (Query.IsPropertyRequired(m_szEstimatedSessionCapacity))
|
|
dwRequiredProperties |= BIT_ESTIMATEDSESSIONCAPACITY;
|
|
|
|
if (Query.IsPropertyRequired(m_szResourceConstraint))
|
|
dwRequiredProperties |= BIT_RESOURCECONSTRAINT;
|
|
|
|
if (Query.IsPropertyRequired(m_szRawSessionCapacity))
|
|
dwRequiredProperties |= BIT_RAWSESSIONCAPACITY;
|
|
|
|
hServerName = WinStationOpenServer (tchServer);
|
|
|
|
CurrentLogonId = GetCurrentLogonId();
|
|
|
|
if( hServerName != NULL )
|
|
{
|
|
bRet = WinStationQueryInformation(hServerName, CurrentLogonId,
|
|
WinStationLoadIndicator,
|
|
&LIData,
|
|
sizeof(LIData), &Length) ;
|
|
if( bRet )
|
|
{
|
|
hr = LoadPropertyValues(pInstance, dwRequiredProperties, LIData);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ERR((TB, "Win32_TerminalService@GetObject: WinStationQueryInformation GetLastError returned: 0x%x\n" ,GetLastError()));
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
//=------------------
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* FUNCTION : CWin32_TerminalService::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_TerminalService::EnumerateInstances (MethodContext* pMethodContext, long lFlags )
|
|
{
|
|
|
|
return WBEM_S_NO_ERROR;
|
|
|
|
// Commented as implementation is protocol dependent
|
|
/*
|
|
CHString chServerName;
|
|
TCHAR tchServer[MAX_PATH] = {0};
|
|
HANDLE hServer = SERVERNAME_CURRENT;
|
|
WINSTATIONLOADINDICATORDATA LIData;
|
|
ULONG CurrentLogonId = (ULONG) -1;
|
|
ULONG Length;
|
|
chServerName.Format(L"%s", (LPCTSTR)GetLocalComputerName());
|
|
wcscpy (tchServer, chServerName);
|
|
hServer = WinStationOpenServer (tchServer);
|
|
bool bRet = 0;
|
|
|
|
CurrentLogonId = GetCurrentLogonId();
|
|
|
|
if (hServer != NULL)
|
|
{
|
|
|
|
bRet = WinStationQueryInformation(hServer, CurrentLogonId,
|
|
WinStationLoadIndicator,
|
|
&LIData,
|
|
sizeof(LIData), &Length);
|
|
|
|
TRC2((TB, "Win32_TerminalService@EnumerateInstances: WinStationQueryInformation bRet: 0x%x\n" , bRet));
|
|
|
|
if (bRet)
|
|
{
|
|
CInstance* pInstance = CreateNewInstance(pMethodContext);
|
|
|
|
if( pInstance != NULL )
|
|
{
|
|
|
|
pInstance->SetCHString(m_szServerName, chServerName);
|
|
|
|
hr = LoadPropertyValues(pInstance, BIT_ALL_PROPERTIES, LIData);
|
|
|
|
if ( SUCCEEDED( hr ))
|
|
{
|
|
hr = pInstance->Commit();
|
|
}
|
|
|
|
pInstance->Release();
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
|
|
TRC2((TB, "Win32_TerminalService@EnumerateInstances: WinStationQueryInformation GetLastError returned: 0x%x\n" , hr));
|
|
}
|
|
|
|
return hr;
|
|
*/
|
|
|
|
}
|
|
|
|
//=-------------
|
|
|
|
HRESULT CWin32_TerminalService::ExecQuery (MethodContext *pMethodContext, CFrameworkQuery& Query, long lFlags)
|
|
{
|
|
HRESULT hr = WBEM_S_NO_ERROR;
|
|
DWORD dwRequiredProperties = 0;
|
|
CHStringArray asNames;
|
|
DWORD dwMode;
|
|
DWORD dwStatus;
|
|
CHString chServerName;
|
|
TCHAR tchServer[MAX_PATH] = {0};
|
|
bool bRet = 0;
|
|
|
|
HANDLE hServerName = SERVERNAME_CURRENT;
|
|
WINSTATIONLOADINDICATORDATA LIData;
|
|
ULONG CurrentLogonId = (ULONG) -1;
|
|
ULONG Length = 0;
|
|
|
|
chServerName.Format(L"%s", (LPCTSTR)GetLocalComputerName());
|
|
|
|
wcscpy (tchServer, chServerName);
|
|
|
|
hServerName = WinStationOpenServer (tchServer);
|
|
|
|
CurrentLogonId = GetCurrentLogonId();
|
|
|
|
if( hServerName != NULL )
|
|
{
|
|
bRet = WinStationQueryInformation(hServerName, CurrentLogonId,
|
|
WinStationLoadIndicator,
|
|
&LIData,
|
|
sizeof(LIData), &Length);
|
|
if( bRet )
|
|
{
|
|
|
|
// Method 2
|
|
Query.GetValuesForProp(m_szName, asNames);
|
|
|
|
BOOL bGetAllInstances = asNames.GetSize() == 0;
|
|
|
|
// Method 1
|
|
if (Query.IsPropertyRequired(m_szTotalSessions))
|
|
dwRequiredProperties |= BIT_TOTALSESSIONS;
|
|
|
|
if (Query.IsPropertyRequired(m_szDisconnectedSessions))
|
|
dwRequiredProperties |= BIT_DISCONNECTEDSESSIONS;
|
|
|
|
if (Query.IsPropertyRequired(m_szEstimatedSessionCapacity))
|
|
dwRequiredProperties |= BIT_ESTIMATEDSESSIONCAPACITY;
|
|
|
|
if (Query.IsPropertyRequired(m_szResourceConstraint))
|
|
dwRequiredProperties |= BIT_RESOURCECONSTRAINT;
|
|
|
|
if (Query.IsPropertyRequired(m_szRawSessionCapacity))
|
|
dwRequiredProperties |= BIT_RAWSESSIONCAPACITY;
|
|
|
|
|
|
CInstance* pInstance = CreateNewInstance(pMethodContext);
|
|
|
|
if( pInstance != NULL)
|
|
{
|
|
|
|
pInstance->SetCHString(m_szName, chServerName);
|
|
|
|
pInstance->SetCHString(m_szCaption, chServerName);
|
|
|
|
hr = LoadPropertyValues( pInstance, dwRequiredProperties, LIData );
|
|
|
|
if( SUCCEEDED( hr ) )
|
|
{
|
|
hr = pInstance->Commit();
|
|
}
|
|
|
|
pInstance->Release();
|
|
}
|
|
else
|
|
{
|
|
ERR((TB, "Win32_TerminalService@GetObject@ExecQuery: CreateNewInstance failed"));
|
|
hr = WBEM_E_OUT_OF_MEMORY;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
|
|
TRC2((TB, "Win32_TerminalService@ExecQuery: WinStationQueryInformation GetLastError returned: 0x%x\n" , GetLastError()));
|
|
}
|
|
|
|
return hr;
|
|
|
|
}
|
|
|
|
//=---------------------
|
|
|
|
|
|
HRESULT CWin32_TerminalService::LoadPropertyValues( CInstance *pInstance, DWORD dwRequiredProperties, WINSTATIONLOADINDICATORDATA LIData)
|
|
{
|
|
|
|
if( pInstance != NULL )
|
|
{
|
|
|
|
if( dwRequiredProperties & BIT_TOTALSESSIONS )
|
|
{
|
|
pInstance->SetDWORD(m_szTotalSessions, LIData.TotalSessions);
|
|
}
|
|
|
|
if( dwRequiredProperties & BIT_DISCONNECTEDSESSIONS )
|
|
{
|
|
pInstance->SetDWORD(m_szDisconnectedSessions, LIData.DisconnectedSessions);
|
|
}
|
|
|
|
if( dwRequiredProperties & BIT_ESTIMATEDSESSIONCAPACITY )
|
|
{
|
|
pInstance->SetDWORD(m_szEstimatedSessionCapacity, LIData.RemainingSessionCapacity);
|
|
}
|
|
|
|
if( dwRequiredProperties & BIT_RESOURCECONSTRAINT )
|
|
{
|
|
switch( LIData.LoadFactor )
|
|
{
|
|
case 0:
|
|
pInstance->SetCharSplat(m_szResourceConstraint, L"Error");
|
|
break;
|
|
case 1:
|
|
pInstance->SetCharSplat(m_szResourceConstraint, L"PagedPool");
|
|
break;
|
|
case 2:
|
|
pInstance->SetCharSplat(m_szResourceConstraint, L"NonPagedPool");
|
|
break;
|
|
case 3:
|
|
pInstance->SetCharSplat(m_szResourceConstraint, L"Available Memory");
|
|
break;
|
|
case 4:
|
|
pInstance->SetCharSplat(m_szResourceConstraint, L"System PTEs");
|
|
break;
|
|
case 5:
|
|
pInstance->SetCharSplat(m_szResourceConstraint, L"CPU");
|
|
break;
|
|
|
|
default:
|
|
pInstance->SetCharSplat(m_szResourceConstraint, L"Error");
|
|
break;
|
|
}
|
|
}
|
|
if( dwRequiredProperties & BIT_RAWSESSIONCAPACITY )
|
|
{
|
|
pInstance->SetDWORD(m_szRawSessionCapacity, LIData.RawSessionCapacity);
|
|
}
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
//=--------------
|
|
|
|
CWin32_TSSessionDirectory::CWin32_TSSessionDirectory (LPCWSTR lpwszName, LPCWSTR lpwszNameSpace ) : Provider( lpwszName, lpwszNameSpace )
|
|
{
|
|
if ( g_hInstance != NULL)
|
|
{
|
|
|
|
TRC2((TB, "CWin32_TSSessionDirectory_ctor"));
|
|
|
|
_tcscpy(m_szMode, _T("TerminalServerMode"));
|
|
|
|
_tcscpy(m_szSessionDirectoryActive, _T("SessionDirectoryActive"));
|
|
|
|
_tcscpy(m_szSessionDirectoryLocation, _T("SessionDirectoryLocation"));
|
|
|
|
_tcscpy(m_szSessionDirectoryClusterName, _T("SessionDirectoryClusterName"));
|
|
|
|
// _tcscpy(m_szSessionDirectoryAdditionalParams, _T("SessionDirectoryAdditionalParams"));
|
|
|
|
_tcscpy(m_szSetSessionDirectoryProperty, _T("SetSessionDirectoryProperty"));
|
|
|
|
_tcscpy(m_szSetSessionDirectoryActive, _T("SetSessionDirectoryActive"));
|
|
|
|
_tcscpy(m_szPropertyName, _T("PropertyName"));
|
|
|
|
_tcscpy(m_szValue, _T("Value"));
|
|
|
|
_tcscpy(m_szSessionDirectoryExposeServerIP, _T("SessionDirectoryExposeServerIP"));
|
|
|
|
_tcscpy(m_szSetSessionDirectoryExposeServerIP, _T("SetSessionDirectoryExposeServerIP"));
|
|
|
|
}
|
|
}
|
|
|
|
//=-------------
|
|
|
|
CWin32_TSSessionDirectory::~CWin32_TSSessionDirectory ()
|
|
{
|
|
|
|
}
|
|
|
|
//=------------
|
|
|
|
HRESULT CWin32_TSSessionDirectory::DeleteInstance ( const CInstance &Instance, long lFlags )
|
|
{
|
|
return WBEM_E_PROVIDER_NOT_CAPABLE;
|
|
}
|
|
|
|
//=-------------------
|
|
/*****************************************************************************
|
|
*
|
|
* FUNCTION : CWin32_TSSessionDirectory::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_TSSessionDirectory::EnumerateInstances (MethodContext* pMethodContext, long lFlags )
|
|
{
|
|
|
|
HRESULT hr = WBEM_E_INVALID_CLASS;
|
|
OSVERSIONINFOW OsVersionInfo;
|
|
OsVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW);
|
|
ISettingsComp* pSettings = NULL;
|
|
DWORD dwStatus = 0;
|
|
DWORD dwMode = 0;
|
|
|
|
CStackClass StackObj;
|
|
|
|
if(StackObj.m_pCfgComp == NULL)
|
|
{
|
|
return WBEM_E_ILLEGAL_NULL;
|
|
}
|
|
|
|
if( GetVersionEx( &OsVersionInfo) )
|
|
{
|
|
if( ( OsVersionInfo.dwMajorVersion < 5 ) || ( OsVersionInfo.dwMajorVersion == 5 && OsVersionInfo.dwMinorVersion < 1 ))
|
|
{
|
|
return WBEM_E_INVALID_CLASS;
|
|
|
|
}
|
|
}
|
|
|
|
hr = StackObj.m_pCfgComp->QueryInterface( IID_ISettingsComp , ( PVOID * )&pSettings ) ;
|
|
|
|
if( SUCCEEDED( hr ) && pSettings != NULL )
|
|
{
|
|
pSettings->GetTermSrvMode(&dwMode , &dwStatus );
|
|
|
|
TRC2((TB, "Win32_TSSessionDirectory@EnumInst: GetTermSrvMode: dwMode ret 0x%x\n" , dwMode));
|
|
|
|
if( ERROR_SUCCESS == dwStatus && dwMode == 1)
|
|
{
|
|
CInstance* pInstance = CreateNewInstance(pMethodContext);
|
|
|
|
if( pInstance != NULL )
|
|
{
|
|
TRC2((TB, "Win32_TSSessionDirectory@EnumerateInstances: CreateNewInstance succeeded"));
|
|
|
|
hr = LoadPropertyValues(pInstance, BIT_ALL_PROPERTIES);
|
|
|
|
if( SUCCEEDED( hr ))
|
|
{
|
|
hr = pInstance->Commit();
|
|
}
|
|
|
|
pInstance->Release( );
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
if( pSettings != NULL)
|
|
{
|
|
pSettings->Release();
|
|
}
|
|
|
|
return hr ;
|
|
}
|
|
|
|
//=-------------
|
|
|
|
|
|
HRESULT CWin32_TSSessionDirectory::GetObject ( CInstance* pInstance, long lFlags, CFrameworkQuery &Query )
|
|
{
|
|
|
|
OSVERSIONINFOW OsVersionInfo;
|
|
OsVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW);
|
|
HRESULT hr = WBEM_E_INVALID_CLASS;
|
|
|
|
ISettingsComp* pSettings = NULL;
|
|
DWORD dwStatus = 0;
|
|
DWORD dwMode = 0;
|
|
ICfgComp *pCfgComp = NULL;
|
|
|
|
if( GetVersionEx( &OsVersionInfo) )
|
|
{
|
|
if( ( OsVersionInfo.dwMajorVersion < 5 ) || ( OsVersionInfo.dwMajorVersion == 5 && OsVersionInfo.dwMinorVersion < 1 ) )
|
|
{
|
|
return WBEM_E_INVALID_CLASS;
|
|
|
|
}
|
|
}
|
|
|
|
CStackClass StackObj;
|
|
|
|
if(StackObj.m_pCfgComp == NULL)
|
|
{
|
|
return WBEM_E_ILLEGAL_NULL;
|
|
}
|
|
|
|
hr = StackObj.m_pCfgComp->QueryInterface( IID_ISettingsComp , ( PVOID * )&pSettings ) ;
|
|
|
|
if( SUCCEEDED( hr ) && pSettings != NULL )
|
|
{
|
|
pSettings->GetTermSrvMode(&dwMode , &dwStatus );
|
|
|
|
if( ERROR_SUCCESS == dwStatus && dwMode == 1)
|
|
{
|
|
|
|
ULONGLONG dwRequiredProperties = 0;
|
|
|
|
if (Query.IsPropertyRequired(m_szMode))
|
|
dwRequiredProperties |= BIT_MODE;
|
|
|
|
if (Query.IsPropertyRequired(m_szSessionDirectoryActive))
|
|
dwRequiredProperties |= BIT_SESSIONDIRECTORYACTIVE;
|
|
|
|
if (Query.IsPropertyRequired(m_szSessionDirectoryLocation))
|
|
dwRequiredProperties |= BIT_SESSIONDIRECTORY;
|
|
|
|
if (Query.IsPropertyRequired(m_szSessionDirectoryClusterName))
|
|
dwRequiredProperties |= BIT_CLUSTERNAME;
|
|
|
|
if (Query.IsPropertyRequired(m_szSessionDirectoryExposeServerIP))
|
|
dwRequiredProperties |= BIT_SESSIONDIRECTORYEXPOSESERVERIP;
|
|
/*
|
|
if (Query.IsPropertyRequired(m_szSessionDirectoryAdditionalParams))
|
|
dwRequiredProperties |= BIT_ADDITIONALPARAMS;
|
|
*/
|
|
if( pInstance != NULL )
|
|
{
|
|
hr = LoadPropertyValues(pInstance, dwRequiredProperties);
|
|
|
|
TRC2((TB, "Win32_TSSessionDirectory@GetObject: LoadPropertyValues ret 0x%x\n" , hr));
|
|
}
|
|
}
|
|
}
|
|
|
|
if( pSettings != NULL)
|
|
{
|
|
pSettings->Release();
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
//=-----------------
|
|
|
|
HRESULT CWin32_TSSessionDirectory::ExecQuery (MethodContext *pMethodContext, CFrameworkQuery& Query, long lFlags)
|
|
{
|
|
DWORD dwRequiredProperties = 0;
|
|
CHStringArray asNames;
|
|
CHString chSessionDirectory;
|
|
HRESULT hr = WBEM_E_INVALID_CLASS;
|
|
ISettingsComp* pSettings = NULL;
|
|
DWORD dwStatus = 0;
|
|
DWORD dwMode = 0;
|
|
ICfgComp *pCfgComp = NULL;
|
|
|
|
OSVERSIONINFOW OsVersionInfo;
|
|
OsVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW);
|
|
|
|
if( GetVersionEx( &OsVersionInfo) )
|
|
{
|
|
if( ( OsVersionInfo.dwMajorVersion < 5 ) || ( OsVersionInfo.dwMajorVersion == 5 && OsVersionInfo.dwMinorVersion < 1 ))
|
|
{
|
|
return WBEM_E_INVALID_CLASS;
|
|
|
|
}
|
|
}
|
|
|
|
CStackClass StackObj;
|
|
|
|
if(StackObj.m_pCfgComp == NULL)
|
|
{
|
|
return WBEM_E_ILLEGAL_NULL;
|
|
}
|
|
|
|
hr = StackObj.m_pCfgComp->QueryInterface( IID_ISettingsComp , ( PVOID * )&pSettings ) ;
|
|
|
|
if( SUCCEEDED( hr ) && pSettings != NULL )
|
|
{
|
|
pSettings->GetTermSrvMode(&dwMode , &dwStatus );
|
|
|
|
if( ERROR_SUCCESS == dwStatus && dwMode == 1)
|
|
{
|
|
|
|
// Method 2
|
|
// Query.GetValuesForProp(m_szSessionDirectoryLocation, asNames);
|
|
Query.GetValuesForProp(m_szMode, asNames);
|
|
|
|
BOOL bGetAllInstances = asNames.GetSize() == 0;
|
|
|
|
// Method 1
|
|
|
|
if (Query.IsPropertyRequired(m_szMode))
|
|
dwRequiredProperties |= BIT_MODE;
|
|
|
|
if (Query.IsPropertyRequired(m_szSessionDirectoryActive))
|
|
dwRequiredProperties |= BIT_SESSIONDIRECTORYACTIVE;
|
|
|
|
if (Query.IsPropertyRequired(m_szSessionDirectoryLocation))
|
|
dwRequiredProperties |= BIT_SESSIONDIRECTORY;
|
|
|
|
if (Query.IsPropertyRequired(m_szSessionDirectoryClusterName))
|
|
dwRequiredProperties |= BIT_CLUSTERNAME;
|
|
|
|
if (Query.IsPropertyRequired(m_szSessionDirectoryExposeServerIP))
|
|
dwRequiredProperties |= BIT_SESSIONDIRECTORYEXPOSESERVERIP;
|
|
/*
|
|
if (Query.IsPropertyRequired(m_szSessionDirectoryAdditionalParams))
|
|
dwRequiredProperties |= BIT_ADDITIONALPARAMS;
|
|
|
|
*/
|
|
// Method 2
|
|
|
|
CInstance* pInstance = CreateNewInstance(pMethodContext);
|
|
|
|
if( pInstance != NULL)
|
|
{
|
|
|
|
pInstance->SetCHString(m_szSessionDirectoryLocation, chSessionDirectory );
|
|
|
|
hr = LoadPropertyValues(pInstance, dwRequiredProperties);
|
|
|
|
if( SUCCEEDED( hr ) )
|
|
{
|
|
hr = pInstance->Commit();
|
|
}
|
|
|
|
pInstance->Release();
|
|
}
|
|
else
|
|
{
|
|
ERR((TB, "Win32_TSSessionDirectory@ExecQuery: CreateNewInstance failed"));
|
|
|
|
hr = WBEM_E_OUT_OF_MEMORY;
|
|
}
|
|
}
|
|
}
|
|
|
|
if( pSettings != NULL )
|
|
{
|
|
pSettings->Release();
|
|
}
|
|
|
|
return hr;
|
|
|
|
}
|
|
|
|
|
|
//=--------------
|
|
|
|
BOOL CWin32_TSSessionDirectory::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_TSSessionDirectory::ExecMethod ( const CInstance& Inst,
|
|
const BSTR bstrMethodName,
|
|
CInstance *pInParams,
|
|
CInstance *pOutParams,
|
|
long lFlags)
|
|
|
|
{
|
|
|
|
DWORD dwData = 0;
|
|
CHString chData;
|
|
HKEY hKey = NULL;
|
|
LONG lRet = 0;
|
|
bool bRet;
|
|
bool bUpdate = FALSE;
|
|
DWORD dwSize = sizeof (DWORD);
|
|
TCHAR szName[ SESSDIR_LENGTH ];
|
|
ISettingsComp* pSettings = NULL;
|
|
DWORD dwStatus = 0;
|
|
DWORD dwMode = 0;
|
|
HRESULT hr = WBEM_E_INVALID_CLASS;
|
|
ICfgComp *pCfgComp = NULL;
|
|
CHString chSessDirName;
|
|
DWORD cbName;
|
|
|
|
OSVERSIONINFOW OsVersionInfo;
|
|
OsVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW);
|
|
|
|
|
|
|
|
CStackClass StackObj;
|
|
|
|
if(StackObj.m_pCfgComp == NULL)
|
|
{
|
|
return WBEM_E_ILLEGAL_NULL;
|
|
}
|
|
|
|
if( pInParams == NULL )
|
|
{
|
|
ERR((TB, "TSSessionDirectory@ExecQuery: invalid interface"));
|
|
|
|
return WBEM_E_INVALID_METHOD_PARAMETERS;
|
|
}
|
|
|
|
hr = StackObj.m_pCfgComp->QueryInterface( IID_ISettingsComp , ( PVOID * )&pSettings ) ;
|
|
|
|
if( SUCCEEDED( hr ) && pSettings != NULL )
|
|
{
|
|
pSettings->GetTermSrvMode(&dwMode , &dwStatus );
|
|
|
|
if( ERROR_SUCCESS == dwStatus && dwMode == 0)
|
|
{
|
|
return WBEM_E_INVALID_CLASS;
|
|
}
|
|
}
|
|
|
|
if( GetVersionEx( &OsVersionInfo) )
|
|
{
|
|
if( ( OsVersionInfo.dwMajorVersion < 5 ) || ( OsVersionInfo.dwMajorVersion == 5 && OsVersionInfo.dwMinorVersion < 1 ))
|
|
{
|
|
return WBEM_E_INVALID_CLASS;
|
|
|
|
}
|
|
}
|
|
|
|
/*
|
|
|
|
Inst.GetCHString(m_szSessionDirectoryLocation, chSessDirName);
|
|
|
|
if( chSessDirName.GetLength() > WINSTATIONNAME_LENGTH )
|
|
{
|
|
return WBEM_E_VALUE_OUT_OF_RANGE;
|
|
}
|
|
|
|
if( chSessDirName.IsEmpty() != 0 )
|
|
{
|
|
return WBEM_E_ILLEGAL_NULL;
|
|
}
|
|
*/
|
|
|
|
do
|
|
{
|
|
|
|
// Sets one of the properties: SessionDirectoryLocation or SessionDirectoryClusterName
|
|
|
|
// uint32 SetSessionDirectoryProperty([In] string PropertyName, string Value);
|
|
|
|
if( _wcsicmp(bstrMethodName, m_szSetSessionDirectoryProperty) == 0 )
|
|
{
|
|
lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE ,
|
|
REG_TS_CLUSTERSETTINGS ,
|
|
0,
|
|
KEY_READ | KEY_WRITE,
|
|
&hKey );
|
|
|
|
if( ERROR_SUCCESS != lRet )
|
|
{
|
|
ERR((TB, "TSSessionDirectory@ExecQuery: RegOpenKeyEx failed"));
|
|
|
|
hr = WBEM_E_INITIALIZATION_FAILURE;
|
|
|
|
break;
|
|
}
|
|
|
|
pInParams->GetCHString (m_szPropertyName, chData);
|
|
|
|
if( chData.CompareNoCase (m_szSessionDirectoryLocation) == 0 )
|
|
{
|
|
RegGetMachinePolicy(&m_gpPolicy);
|
|
|
|
chData.Empty();
|
|
|
|
bRet = pInParams->GetCHString(m_szValue, chData );
|
|
|
|
if( ( m_gpPolicy.fPolicySessionDirectoryLocation == 0) && bRet )
|
|
{
|
|
|
|
if( chData.IsEmpty() )
|
|
{
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
|
|
break;
|
|
}
|
|
|
|
if( chData.GetLength() > SESSDIR_LENGTH )
|
|
{
|
|
hr = WBEM_E_VALUE_OUT_OF_RANGE;
|
|
|
|
break;
|
|
}
|
|
|
|
lstrcpy(szName, chData);
|
|
cbName = (lstrlen(szName)+ 1) * sizeof(TCHAR);
|
|
|
|
lRet = RegSetValueEx( hKey ,
|
|
REG_TS_CLUSTER_STORESERVERNAME,
|
|
NULL ,
|
|
REG_SZ,
|
|
( CONST LPBYTE )szName ,
|
|
cbName );
|
|
|
|
TRC2((TB, "Win32_TSSessionDirectory@ExecMethod: SessionDirectory returned 0x%x" , lRet));
|
|
|
|
|
|
if( lRet == ERROR_SUCCESS )
|
|
{
|
|
bUpdate = TRUE;
|
|
|
|
pOutParams->SetDWORD(L"ReturnValue", WBEM_S_NO_ERROR);
|
|
}
|
|
|
|
chData.Empty();
|
|
}
|
|
else
|
|
{
|
|
hr = WBEM_E_INVALID_OPERATION;
|
|
|
|
break;
|
|
}
|
|
|
|
}
|
|
else if( chData.CompareNoCase(m_szSessionDirectoryClusterName) == 0 )
|
|
{
|
|
|
|
RegGetMachinePolicy(&m_gpPolicy);
|
|
|
|
chData.Empty();
|
|
|
|
bRet = pInParams->GetCHString(m_szValue, chData );
|
|
|
|
if( ( m_gpPolicy.fPolicySessionDirectoryClusterName == 0) && bRet )
|
|
{
|
|
|
|
if( chData.IsEmpty() )
|
|
{
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
|
|
break;
|
|
}
|
|
|
|
if( chData.GetLength() > SESSDIR_LENGTH )
|
|
{
|
|
hr = WBEM_E_VALUE_OUT_OF_RANGE;
|
|
|
|
break;
|
|
}
|
|
|
|
lstrcpy(szName, chData);
|
|
cbName = (lstrlen(szName)+ 1) * sizeof(TCHAR);
|
|
|
|
lRet = RegSetValueEx( hKey ,
|
|
REG_TS_CLUSTER_CLUSTERNAME,
|
|
NULL ,
|
|
REG_SZ,
|
|
( CONST LPBYTE )szName ,
|
|
cbName );
|
|
|
|
TRC2((TB, "Win32_TSSessionDirectory@ExecMethod: SessionDirectory returned 0x%x" , lRet));
|
|
|
|
if( lRet == ERROR_SUCCESS )
|
|
{
|
|
bUpdate = TRUE;
|
|
|
|
pOutParams->SetDWORD(L"ReturnValue", WBEM_S_NO_ERROR);
|
|
}
|
|
|
|
chData.Empty();
|
|
}
|
|
else
|
|
{
|
|
hr = WBEM_E_INVALID_OPERATION;
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
else
|
|
{
|
|
hr = WBEM_E_INVALID_METHOD;
|
|
|
|
break;
|
|
}
|
|
|
|
/*
|
|
|
|
else if( chData.CompareNoCase(m_szSessionDirectoryAdditionalParams) == 0 )
|
|
{
|
|
|
|
RegGetMachinePolicy(&m_gpPolicy);
|
|
|
|
chData.Empty();
|
|
|
|
bRet = pInParams->GetCHString(m_szValue, chData );
|
|
|
|
if( ( m_gpPolicy.fPolicySessionDirectoryAdditionalParams == 0) && bRet != 0 )
|
|
{
|
|
|
|
if( chData.IsEmpty() != 0 )
|
|
{
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
|
|
break;
|
|
}
|
|
|
|
if( chData.GetLength() > SESSDIR_LENGTH )
|
|
{
|
|
hr = WBEM_E_VALUE_OUT_OF_RANGE;
|
|
|
|
break;
|
|
}
|
|
|
|
lstrcpy(szName, chData);
|
|
|
|
|
|
lRet = RegSetValueEx( hKey ,
|
|
REG_TS_CLUSTER_OPAQUESETTINGS,
|
|
NULL ,
|
|
REG_SZ,
|
|
( CONST LPBYTE )szName ,
|
|
sizeof (szName) );
|
|
|
|
ERR((TB, "Win32_TSSessionDirectory@ExecMethod: SessionDirectory returned 0x%x" , lRet));
|
|
|
|
if( lRet == ERROR_SUCCESS )
|
|
{
|
|
pOutParams->SetDWORD(L"ReturnValue", WBEM_S_NO_ERROR);
|
|
}
|
|
|
|
chData.Empty();
|
|
}
|
|
else
|
|
{
|
|
hr = WBEM_E_INVALID_OPERATION;
|
|
|
|
break;
|
|
}
|
|
}
|
|
*/
|
|
|
|
}
|
|
|
|
// Enables / Disables participation of a server in Session Directory
|
|
|
|
// uint32 SetSessionDirectoryActive([In] uint32 Value);
|
|
|
|
else if( _wcsicmp(bstrMethodName, m_szSetSessionDirectoryActive) == 0 )
|
|
{
|
|
lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE ,
|
|
REG_CONTROL_TSERVER ,
|
|
0,
|
|
KEY_READ | KEY_WRITE,
|
|
&hKey );
|
|
|
|
if( ERROR_SUCCESS == lRet )
|
|
{
|
|
RegGetMachinePolicy(&m_gpPolicy);
|
|
|
|
bRet = pInParams->GetDWORD( m_szSessionDirectoryActive, dwData );
|
|
|
|
if( (m_gpPolicy.fPolicySessionDirectoryActive == 0) && bRet )
|
|
{
|
|
|
|
if( dwData != 0 && dwData != 1 )
|
|
{
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
|
|
break;
|
|
}
|
|
|
|
lRet = RegSetValueEx( hKey ,
|
|
REG_TS_SESSDIRACTIVE,
|
|
0 ,
|
|
REG_DWORD,
|
|
( LPBYTE )&dwData ,
|
|
dwSize );
|
|
|
|
TRC2((TB, "Win32_TSSessionDirectory@ExecMethod: SessionDirectoryActive returned 0x%x" , lRet));
|
|
|
|
if( ERROR_SUCCESS == lRet )
|
|
{
|
|
|
|
bUpdate = TRUE;
|
|
|
|
pOutParams->SetDWORD(L"ReturnValue", WBEM_S_NO_ERROR);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = WBEM_E_INVALID_METHOD;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Enables / Disables exposing the IP Address of Session Directory Server
|
|
|
|
// uint32 SetSessionDirectoryExposeServerIP([In] uint32 Value);
|
|
|
|
else if( _wcsicmp(bstrMethodName, m_szSetSessionDirectoryExposeServerIP) == 0 )
|
|
{
|
|
lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE ,
|
|
REG_CONTROL_TSERVER ,
|
|
0,
|
|
KEY_READ | KEY_WRITE,
|
|
&hKey );
|
|
|
|
if( ERROR_SUCCESS == lRet )
|
|
{
|
|
RegGetMachinePolicy(&m_gpPolicy);
|
|
|
|
bRet = pInParams->GetDWORD( m_szSessionDirectoryExposeServerIP, dwData );
|
|
|
|
//todo: change the policy to IP
|
|
if( (m_gpPolicy.fPolicySessionDirectoryExposeServerIP == 0) && bRet )
|
|
{
|
|
|
|
if( dwData != 0 && dwData != 1 )
|
|
{
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
|
|
break;
|
|
}
|
|
|
|
lRet = RegSetValueEx( hKey ,
|
|
REG_TS_SESSDIR_EXPOSE_SERVER_ADDR,
|
|
0 ,
|
|
REG_DWORD,
|
|
( LPBYTE )&dwData ,
|
|
dwSize );
|
|
|
|
TRC2((TB, "Win32_TSSessionDirectory@ExecMethod: SessionDirectoryExposeServerIP returned 0x%x" , lRet));
|
|
|
|
if( ERROR_SUCCESS == lRet )
|
|
{
|
|
|
|
bUpdate = TRUE;
|
|
|
|
pOutParams->SetDWORD(L"ReturnValue", WBEM_S_NO_ERROR);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = WBEM_E_INVALID_METHOD;
|
|
}
|
|
}
|
|
}
|
|
|
|
}while(0);
|
|
|
|
if( bUpdate )
|
|
{
|
|
StackObj.m_pCfgComp->UpdateSessionDirectory(&dwStatus);
|
|
}
|
|
|
|
if( hKey != NULL )
|
|
{
|
|
RegCloseKey( hKey );
|
|
}
|
|
|
|
|
|
if( pSettings != NULL )
|
|
{
|
|
pSettings->Release();
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
//=-------------
|
|
|
|
HRESULT CWin32_TSSessionDirectory::LoadPropertyValues( CInstance *pInstance, DWORD dwRequiredProperties)
|
|
{
|
|
LONG lRet = 0;
|
|
DWORD dwData = 0;
|
|
DWORD dwSize = 0;
|
|
HKEY hKey = NULL;
|
|
static WCHAR tchData[ OPAQUESETTINGS_LENGTH +1] ;
|
|
dwSize = sizeof( DWORD );
|
|
|
|
|
|
lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE ,
|
|
REG_CONTROL_TSERVER ,
|
|
0,
|
|
KEY_READ,
|
|
&hKey );
|
|
|
|
if( ERROR_SUCCESS == lRet && hKey != NULL)
|
|
{
|
|
if( dwRequiredProperties & BIT_SESSIONDIRECTORYACTIVE )
|
|
{
|
|
RegGetMachinePolicy(&m_gpPolicy);
|
|
|
|
if( m_gpPolicy.fPolicySessionDirectoryActive != 0 )
|
|
{
|
|
dwData = m_gpPolicy.SessionDirectoryActive;
|
|
}
|
|
else
|
|
{
|
|
lRet = RegQueryValueEx( hKey ,
|
|
REG_TS_SESSDIRACTIVE,
|
|
NULL ,
|
|
NULL ,
|
|
(LPBYTE)&dwData ,
|
|
&dwSize );
|
|
}
|
|
|
|
TRC2((TB, "Win32_TSSessionDirectory@LoadPropertyValues: SessionDirectoryActive returned 0x%x" , lRet));
|
|
|
|
if( ERROR_SUCCESS == lRet )
|
|
{
|
|
pInstance->SetDWORD(m_szSessionDirectoryActive, dwData);
|
|
}
|
|
}
|
|
|
|
if( dwRequiredProperties & BIT_SESSIONDIRECTORYEXPOSESERVERIP )
|
|
{
|
|
RegGetMachinePolicy(&m_gpPolicy);
|
|
|
|
if( m_gpPolicy.fPolicySessionDirectoryExposeServerIP != 0 )
|
|
{
|
|
dwData = m_gpPolicy.SessionDirectoryExposeServerIP;
|
|
}
|
|
else
|
|
{
|
|
lRet = RegQueryValueEx( hKey ,
|
|
REG_TS_SESSDIR_EXPOSE_SERVER_ADDR,
|
|
NULL ,
|
|
NULL ,
|
|
(LPBYTE)&dwData ,
|
|
&dwSize );
|
|
}
|
|
|
|
TRC2((TB, "Win32_TSSessionDirectory@LoadPropertyValues: SessionDirectoryExposeServerIP returned 0x%x" , lRet));
|
|
|
|
if( ERROR_SUCCESS == lRet )
|
|
{
|
|
pInstance->SetDWORD(m_szSessionDirectoryExposeServerIP, dwData);
|
|
}
|
|
}
|
|
|
|
|
|
RegCloseKey (hKey);
|
|
}
|
|
|
|
|
|
lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE ,
|
|
REG_TS_CLUSTERSETTINGS ,
|
|
0,
|
|
KEY_READ,
|
|
&hKey );
|
|
|
|
|
|
if( ERROR_SUCCESS == lRet && hKey != NULL)
|
|
{
|
|
|
|
if( dwRequiredProperties & BIT_SESSIONDIRECTORY )
|
|
{
|
|
RegGetMachinePolicy(&m_gpPolicy);
|
|
|
|
if( m_gpPolicy.fPolicySessionDirectoryLocation != 0 )
|
|
{
|
|
lstrcpy(tchData, m_gpPolicy.SessionDirectoryLocation);
|
|
}
|
|
else
|
|
{
|
|
|
|
dwSize = sizeof( tchData );
|
|
|
|
lRet = RegQueryValueEx( hKey ,
|
|
REG_TS_CLUSTER_STORESERVERNAME,
|
|
NULL ,
|
|
NULL ,
|
|
(LPBYTE)&tchData ,
|
|
&dwSize );
|
|
}
|
|
|
|
TRC2((TB, "Win32_TSSessionDirectory@LoadPropertyValues: SessionDirectoryLocation returned 0x%x" , lRet));
|
|
|
|
if( ERROR_SUCCESS == lRet )
|
|
{
|
|
pInstance->SetCHString(m_szSessionDirectoryLocation, (LPTSTR)(LPCTSTR)&tchData);
|
|
}
|
|
}
|
|
|
|
if( dwRequiredProperties & BIT_CLUSTERNAME )
|
|
{
|
|
RegGetMachinePolicy(&m_gpPolicy);
|
|
|
|
if( m_gpPolicy.fPolicySessionDirectoryClusterName != 0 )
|
|
{
|
|
lstrcpy( tchData, m_gpPolicy.SessionDirectoryClusterName );
|
|
}
|
|
else
|
|
{
|
|
dwSize = sizeof( tchData );
|
|
|
|
lRet = RegQueryValueEx( hKey ,
|
|
REG_TS_CLUSTER_CLUSTERNAME,
|
|
NULL ,
|
|
NULL ,
|
|
(LPBYTE)&tchData ,
|
|
&dwSize );
|
|
}
|
|
|
|
TRC2((TB, "Win32_TSSessionDirectory@LoadPropertyValues: ClusterName returned 0x%x" , lRet));
|
|
|
|
if( ERROR_SUCCESS == lRet )
|
|
{
|
|
pInstance->SetCHString(m_szSessionDirectoryClusterName, (LPTSTR)(LPCTSTR)&tchData);
|
|
}
|
|
}
|
|
|
|
/*
|
|
if( dwRequiredProperties & BIT_ADDITIONALPARAMS )
|
|
{
|
|
|
|
dwSize = sizeof( tchData );
|
|
|
|
lRet = RegQueryValueEx( hKey ,
|
|
REG_TS_CLUSTER_OPAQUESETTINGS,
|
|
NULL ,
|
|
NULL ,
|
|
(LPBYTE)&tchData ,
|
|
&dwSize );
|
|
|
|
|
|
TRC2((TB, "Win32_TSSessionDirectory@LoadPropertyValues: AdditionalParams returned 0x%x" , lRet));
|
|
|
|
if( ERROR_SUCCESS == lRet )
|
|
{
|
|
pInstance->SetCHString(m_szSessionDirectoryAdditionalParams, (LPTSTR)(LPCTSTR)&tchData);
|
|
}
|
|
}
|
|
*/
|
|
|
|
RegCloseKey( hKey );
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//=-------------------
|
|
/*
|
|
|
|
HRESULT CWin32_TSSessionDirectory::PutInstance ( const CInstance &Instance, long lFlags)
|
|
{
|
|
LONG hr = 0;
|
|
DWORD dwData;
|
|
CHString chData;
|
|
HKEY hKey;
|
|
LONG lRet;
|
|
DWORD dwSize = sizeof (DWORD);
|
|
TCHAR szName[ SESSDIR_LENGTH ];
|
|
|
|
hr = WBEM_S_NO_ERROR;
|
|
|
|
do
|
|
{
|
|
lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE ,
|
|
REG_CONTROL_TSERVER ,
|
|
0,
|
|
KEY_READ | KEY_WRITE,
|
|
&hKey );
|
|
|
|
if ( ERROR_SUCCESS == lRet )
|
|
{
|
|
if( Instance.GetDWORD( m_szSessionDirectoryActive, dwData ) )
|
|
{
|
|
if (dwData != 0 && dwData != 1)
|
|
{
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
|
|
break;
|
|
}
|
|
|
|
lRet = RegSetValueEx( hKey ,
|
|
REG_TS_SESSDIRACTIVE,
|
|
0 ,
|
|
REG_DWORD,
|
|
( LPBYTE )&dwData ,
|
|
dwSize );
|
|
|
|
ERR((TB, "Win32_TSSessionDirectory@PutInstance: SessionDirectoryActive returned 0x%x" , lRet));
|
|
|
|
if (ERROR_SUCCESS == lRet && g_pCfgComp != NULL)
|
|
{
|
|
g_pCfgComp->ForceUpdate();
|
|
}
|
|
}
|
|
|
|
RegCloseKey (hKey);
|
|
}
|
|
|
|
lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE ,
|
|
REG_TS_CLUSTERSETTINGS ,
|
|
0,
|
|
KEY_READ | KEY_WRITE,
|
|
&hKey );
|
|
|
|
if ( ERROR_SUCCESS == lRet )
|
|
{
|
|
chData.Empty();
|
|
|
|
if( Instance.GetCHString(m_szSessionDirectoryLocation, chData ) )
|
|
{
|
|
if (chData.IsEmpty() != 0)
|
|
{
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
|
|
break;
|
|
}
|
|
|
|
if (chData.GetLength() > SESSDIR_LENGTH )
|
|
{
|
|
hr = WBEM_E_VALUE_OUT_OF_RANGE;
|
|
|
|
break;
|
|
}
|
|
|
|
lstrcpy(szName, chData);
|
|
|
|
|
|
lRet = RegSetValueEx( hKey ,
|
|
REG_TS_CLUSTER_STORESERVERNAME,
|
|
NULL ,
|
|
REG_SZ,
|
|
( CONST LPBYTE )szName ,
|
|
sizeof (szName) );
|
|
|
|
ERR((TB, "Win32_TSSessionDirectory@PutInstance: SessionDirectory returned 0x%x" , lRet));
|
|
|
|
chData.Empty();
|
|
}
|
|
|
|
|
|
if( Instance.GetCHString( m_szSessionDirectoryClusterName, chData ) )
|
|
{
|
|
if (chData.IsEmpty() != 0)
|
|
{
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
|
|
break;
|
|
}
|
|
|
|
if (chData.GetLength() > SESSDIR_LENGTH )
|
|
{
|
|
hr = WBEM_E_VALUE_OUT_OF_RANGE;
|
|
|
|
break;
|
|
}
|
|
|
|
lstrcpy(szName, chData);
|
|
|
|
|
|
lRet = RegSetValueEx( hKey ,
|
|
REG_TS_CLUSTER_CLUSTERNAME,
|
|
NULL ,
|
|
REG_SZ,
|
|
( CONST LPBYTE )szName ,
|
|
sizeof (szName) );
|
|
|
|
ERR((TB, "Win32_TSSessionDirectory@PutInstance: ClusterName returned 0x%x" , lRet));
|
|
|
|
chData.Empty();
|
|
}
|
|
|
|
|
|
if( Instance.GetCHString( m_szSessionDirectoryAdditionalParams, chData ) )
|
|
{
|
|
if (chData.IsEmpty() != 0)
|
|
{
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
|
|
break;
|
|
}
|
|
|
|
if (chData.GetLength() > OPAQUESETTINGS_LENGTH )
|
|
{
|
|
hr = WBEM_E_VALUE_OUT_OF_RANGE;
|
|
|
|
break;
|
|
}
|
|
|
|
lstrcpy(szName, chData);
|
|
|
|
lRet = RegSetValueEx( hKey ,
|
|
REG_TS_CLUSTER_OPAQUESETTINGS,
|
|
NULL ,
|
|
REG_SZ,
|
|
( CONST LPBYTE )szName ,
|
|
sizeof (szName) );
|
|
|
|
ERR((TB, "Win32_TSSessionDirectory@PutInstance: AdditionalParams returned 0x%x" , lRet));
|
|
}
|
|
|
|
RegCloseKey( hKey );
|
|
}
|
|
|
|
if (g_pCfgComp != NULL)
|
|
{
|
|
g_pCfgComp->ForceUpdate();
|
|
}
|
|
|
|
}while (0);
|
|
|
|
return hr;
|
|
}
|
|
*/ |