S
Sanil
Guest
Hi,
I am trying to add a user to Terminal services RDP-Tcp
permission / security by using WMI. for that purpose i am doing using
Win32_TSPermissionSetting class and it's AddAccount method.
I have tried a lot but ExecMethod fails telling me invalid parameter.
Any help / suggestion will be appreciated
#include "stdafx.h"
#define TERMINAL_SERVER_ROOT _T("root\\cimv2\\TerminalServices")
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
HRESULT hr = E_FAIL;
//Initialize COM
hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
if(FAILED(hr))
{
OutputDebugString(_T("TSEUtil::Failed to CoInitialize "));
}
// Obtain the initial locator to WMI
IWbemLocator *pLoc = NULL;
hr = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER,
IID_IWbemLocator, (LPVOID *) &pLoc);
if(FAILED(hr))
{
OutputDebugString(_T("TSEUtil::CoCreateInstance for IWbemLocator
Failed"));
}
IWbemServices *pSvc = NULL;
hr = pLoc->ConnectServer( _bstr_t(TERMINAL_SERVER_ROOT), NULL, NULL,
0, NULL, 0, 0, &pSvc);
if(FAILED(hr))
{
OutputDebugString(_T("TSEUtil::CoCreateInstance for IWbemServices
Failed"));
}
// Set security levels on the proxy
hr = CoSetProxyBlanket(
pSvc, // Indicates the proxy to set
RPC_C_AUTHN_WINNT, // RPC_C_AUTHN_xxx
RPC_C_AUTHZ_NONE, // RPC_C_AUTHZ_xxx
NULL, // Server principal name
RPC_C_AUTHN_LEVEL_PKT_PRIVACY, // RPC_C_AUTHN_LEVEL_xxx
RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
NULL, // client identity
EOAC_NONE // proxy capabilities
);
IWbemClassObject *pclsInstObj = NULL;
BSTR MethodName = SysAllocString(L"AddAccount");
BSTR ClassName = SysAllocString(L"Win32_TSPermissionsSetting");
//Get object
IWbemClassObject* pClass = NULL;
hr = pSvc->GetObject(ClassName, 0, NULL, &pClass, NULL);
if (FAILED (hr))
return FALSE;
VARIANT varTerminalName;
VariantInit(&varTerminalName);
varTerminalName.vt = VT_BSTR;
varTerminalName.bstrVal = L"RDP-Tcp";
hr = pClass->Put(L"TerminalName", 0,&varTerminalName, 0);
if (FAILED (hr))
return FALSE;
//Get method
IWbemClassObject* pInParamsDefinition = NULL;
hr = pClass->GetMethod(MethodName, 0, &pInParamsDefinition, NULL);
if (FAILED (hr))
return FALSE;
//Spawn instance
IWbemClassObject* pClassInstance = NULL;
hr = pInParamsDefinition->SpawnInstance(0, &pClassInstance);
if (FAILED (hr))
return FALSE;
//Set the method parameters
VARIANT varAccountName;
VariantInit(&varAccountName);
varAccountName.vt = VT_BSTR;
varAccountName.bstrVal = L"eng\\sanilt";
hr = pClassInstance->Put(L"AccountName", 0,&varAccountName, 0);
if (FAILED (hr))
return FALSE;
VARIANT var;
VariantInit(&var);
V_VT(&var) = VT_I4;
var.intVal = 2;
hr = pClassInstance->Put(L"PermissionPreSet", 0, &var, 0);
if (FAILED (hr))
return FALSE;
IWbemClassObject* pOutParams = NULL;
hr = pSvc->ExecMethod(ClassName, MethodName, 0,NULL,
pClassInstance, &pOutParams, NULL);
if(FAILED(hr))
{
MessageBox(NULL,_T("Exec Method Failed"),_T(""),MB_OK);
}
return 0;
}
I am trying to add a user to Terminal services RDP-Tcp
permission / security by using WMI. for that purpose i am doing using
Win32_TSPermissionSetting class and it's AddAccount method.
I have tried a lot but ExecMethod fails telling me invalid parameter.
Any help / suggestion will be appreciated
#include "stdafx.h"
#define TERMINAL_SERVER_ROOT _T("root\\cimv2\\TerminalServices")
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
HRESULT hr = E_FAIL;
//Initialize COM
hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
if(FAILED(hr))
{
OutputDebugString(_T("TSEUtil::Failed to CoInitialize "));
}
// Obtain the initial locator to WMI
IWbemLocator *pLoc = NULL;
hr = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER,
IID_IWbemLocator, (LPVOID *) &pLoc);
if(FAILED(hr))
{
OutputDebugString(_T("TSEUtil::CoCreateInstance for IWbemLocator
Failed"));
}
IWbemServices *pSvc = NULL;
hr = pLoc->ConnectServer( _bstr_t(TERMINAL_SERVER_ROOT), NULL, NULL,
0, NULL, 0, 0, &pSvc);
if(FAILED(hr))
{
OutputDebugString(_T("TSEUtil::CoCreateInstance for IWbemServices
Failed"));
}
// Set security levels on the proxy
hr = CoSetProxyBlanket(
pSvc, // Indicates the proxy to set
RPC_C_AUTHN_WINNT, // RPC_C_AUTHN_xxx
RPC_C_AUTHZ_NONE, // RPC_C_AUTHZ_xxx
NULL, // Server principal name
RPC_C_AUTHN_LEVEL_PKT_PRIVACY, // RPC_C_AUTHN_LEVEL_xxx
RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
NULL, // client identity
EOAC_NONE // proxy capabilities
);
IWbemClassObject *pclsInstObj = NULL;
BSTR MethodName = SysAllocString(L"AddAccount");
BSTR ClassName = SysAllocString(L"Win32_TSPermissionsSetting");
//Get object
IWbemClassObject* pClass = NULL;
hr = pSvc->GetObject(ClassName, 0, NULL, &pClass, NULL);
if (FAILED (hr))
return FALSE;
VARIANT varTerminalName;
VariantInit(&varTerminalName);
varTerminalName.vt = VT_BSTR;
varTerminalName.bstrVal = L"RDP-Tcp";
hr = pClass->Put(L"TerminalName", 0,&varTerminalName, 0);
if (FAILED (hr))
return FALSE;
//Get method
IWbemClassObject* pInParamsDefinition = NULL;
hr = pClass->GetMethod(MethodName, 0, &pInParamsDefinition, NULL);
if (FAILED (hr))
return FALSE;
//Spawn instance
IWbemClassObject* pClassInstance = NULL;
hr = pInParamsDefinition->SpawnInstance(0, &pClassInstance);
if (FAILED (hr))
return FALSE;
//Set the method parameters
VARIANT varAccountName;
VariantInit(&varAccountName);
varAccountName.vt = VT_BSTR;
varAccountName.bstrVal = L"eng\\sanilt";
hr = pClassInstance->Put(L"AccountName", 0,&varAccountName, 0);
if (FAILED (hr))
return FALSE;
VARIANT var;
VariantInit(&var);
V_VT(&var) = VT_I4;
var.intVal = 2;
hr = pClassInstance->Put(L"PermissionPreSet", 0, &var, 0);
if (FAILED (hr))
return FALSE;
IWbemClassObject* pOutParams = NULL;
hr = pSvc->ExecMethod(ClassName, MethodName, 0,NULL,
pClassInstance, &pOutParams, NULL);
if(FAILED(hr))
{
MessageBox(NULL,_T("Exec Method Failed"),_T(""),MB_OK);
}
return 0;
}