Jump to content

Programmatically publish application on Longhorn Terminal server.


Recommended Posts

Guest amitmane82@gmail.com
Posted

Hi All

I want to programmatically publish a remote application on

longhorn terminal server.

To do this I have used "Win32_TSPublishedApplication" class of latest

WMI.

But PutInstance() method of IWbemServices fails for this class with

errors "The parameter is incorrect".

I don't have any idea why it fails.

 

Below is the code

 

 

 

HRESULT hr;

 

hr = CoInitializeEx(0, COINIT_MULTITHREADED);

 

if (FAILED (hr))

return 0;

 

CComPtr<IWbemLocator> pLoc = NULL;

 

hr = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER,

IID_IWbemLocator, (LPVOID *) &pLoc);

 

if (FAILED(hr))

{

return 0;

}

 

IWbemServices *pSvc = NULL;

 

hr = pLoc->ConnectServer(

_bstr_t(L"root\\cimv2\\TerminalServices"),

NULL,

NULL,

0,

NULL,

0,

0,

&pSvc

);

 

if (FAILED (hr))

return 0;

 

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

);

 

if (FAILED (hr))

return 0;

 

IWbemClassObject *pclsObj = NULL; //SMS_ST_RecurInterval class

IWbemClassObject *pclsInstObj = NULL; //Instance of

SMS_ST_RecurInterval

 

 

 

hr = pSvc->GetObject(_bstr_t(L"Win32_TSPublishedApplication"), 0,

NULL, &pclsObj, 0);

hr = pclsObj->SpawnInstance(0, &pclsInstObj);

pclsObj->Release();

 

 

VARIANT v;

VariantInit(&v);

 

//Set the name property

V_VT(&v) = VT_BSTR;

V_BSTR(&v) = SysAllocString(L"Calculator");

 

LPCWSTR strClassProp = L"Name";

hr = pclsInstObj->Put(strClassProp, 0, &v, 0);

 

//Set the alias property

V_VT(&v) = VT_BSTR;

V_BSTR(&v) = SysAllocString(L"calc");

 

strClassProp = L"Alias";

hr = pclsInstObj->Put(strClassProp, 0, &v, 0);

 

//Set the path property

V_VT(&v) = VT_BSTR;

V_BSTR(&v) = SysAllocString(L"C:\\Windows\\System32\\calc.exe");

 

strClassProp = L"Path";

hr = pclsInstObj->Put(strClassProp, 0, &v, 0);

 

//Set the Vpath property

V_VT(&v) = VT_BSTR;

V_BSTR(&v) = SysAllocString(L"%SYSTEMDRIVE%\\Windows\\System32\

\calc.exe");

 

strClassProp = L"VPath";

hr = pclsInstObj->Put(strClassProp, 0, &v, 0);

 

//Set the Iconpath property

V_VT(&v) = VT_BSTR;

V_BSTR(&v) = SysAllocString(L"%SYSTEMDRIVE%\\Windows\\System32\

\calc.exe");

 

strClassProp = L"IconPath";

hr = pclsInstObj->Put(strClassProp, 0, &v, 0);

 

 

//Set the IconIndex property

V_VT(&v) = VT_I4;

v.intVal = 0;

 

strClassProp = L"IconIndex";

hr = pclsInstObj->Put(strClassProp, 0, &v, 0);

 

 

//Set the commandline settings

V_VT(&v) = VT_UINT;

v.uintVal = 0;

 

strClassProp = L"CommandLineSetting";

hr = pclsInstObj->Put(strClassProp, 0, &v, 0);

 

//Set the RequiredCommandLine property

V_VT(&v) = VT_BSTR;

V_BSTR(&v) = SysAllocString(L"");

 

strClassProp = L"RequiredCommandLine";

hr = pclsInstObj->Put(strClassProp, 0, &v, 0);

 

 

//Set the alias ShowInPortal settings

V_VT(&v) = VT_BOOL;

v.boolVal = true;

 

strClassProp = L"ShowInPortal";

hr = pclsInstObj->Put(strClassProp, 0, &v, 0);

 

//Set the alias ShowInPortal settings

V_VT(&v) = VT_BOOL;

v.boolVal = true;

 

strClassProp = L"PathExists";

hr = pclsInstObj->Put(strClassProp, 0, &v, 0);

 

 

 

 

hr = pSvc->PutInstance(pclsInstObj, WBEM_FLAG_CREATE_ONLY, NULL,

NULL);

 

//Here is failes with error "The parameter is incorrect".

 

 

if (FAILED (hr))

{

MessageBox (NULL, _T("Failed"),NULL,NULL);

return 0;

}

 

pclsInstObj->Release();

 

MessageBox (NULL, _T("Success"),NULL,NULL);

// Clean up.

VariantClear(&v);

 

 

 

Can any one guide me to solve this problem.

Or please tell me if there is any alternative way to programmatically

publish application on Longhorn Terminal server.

 

Any help will be appreciated

 

 

Thanks,

Amit..

  • Replies 2
  • Created
  • Last Reply
Guest Rob Leitman [MS]
Posted

Re: Programmatically publish application on Longhorn Terminal server.

 

PathExists is read-only, so you shouldn't try to set it.

 

RDPFileContents is requred, so you need to set it. You can get this by

saving an RDP using mstsc, or by copying an RDP file from another source.

 

You may want to pass WBEM_FLAG_CREATE_OR_UPDATE in case the app already

exists.

 

Rob

 

<amitmane82@gmail.com> wrote in message

news:71651bc4-8717-4b48-825a-91a135ce5e5f@u36g2000prf.googlegroups.com...

> Hi All

> I want to programmatically publish a remote application on

> longhorn terminal server.

> To do this I have used "Win32_TSPublishedApplication" class of latest

> WMI.

> But PutInstance() method of IWbemServices fails for this class with

> errors "The parameter is incorrect".

> I don't have any idea why it fails.

>

> Below is the code

>

>

>

> HRESULT hr;

>

> hr = CoInitializeEx(0, COINIT_MULTITHREADED);

>

> if (FAILED (hr))

> return 0;

>

> CComPtr<IWbemLocator> pLoc = NULL;

>

> hr = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER,

> IID_IWbemLocator, (LPVOID *) &pLoc);

>

> if (FAILED(hr))

> {

> return 0;

> }

>

> IWbemServices *pSvc = NULL;

>

> hr = pLoc->ConnectServer(

> _bstr_t(L"root\\cimv2\\TerminalServices"),

> NULL,

> NULL,

> 0,

> NULL,

> 0,

> 0,

> &pSvc

> );

>

> if (FAILED (hr))

> return 0;

>

> 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

> );

>

> if (FAILED (hr))

> return 0;

>

> IWbemClassObject *pclsObj = NULL; //SMS_ST_RecurInterval class

> IWbemClassObject *pclsInstObj = NULL; //Instance of

> SMS_ST_RecurInterval

>

>

>

> hr = pSvc->GetObject(_bstr_t(L"Win32_TSPublishedApplication"), 0,

> NULL, &pclsObj, 0);

> hr = pclsObj->SpawnInstance(0, &pclsInstObj);

> pclsObj->Release();

>

>

> VARIANT v;

> VariantInit(&v);

>

> //Set the name property

> V_VT(&v) = VT_BSTR;

> V_BSTR(&v) = SysAllocString(L"Calculator");

>

> LPCWSTR strClassProp = L"Name";

> hr = pclsInstObj->Put(strClassProp, 0, &v, 0);

>

> //Set the alias property

> V_VT(&v) = VT_BSTR;

> V_BSTR(&v) = SysAllocString(L"calc");

>

> strClassProp = L"Alias";

> hr = pclsInstObj->Put(strClassProp, 0, &v, 0);

>

> //Set the path property

> V_VT(&v) = VT_BSTR;

> V_BSTR(&v) = SysAllocString(L"C:\\Windows\\System32\\calc.exe");

>

> strClassProp = L"Path";

> hr = pclsInstObj->Put(strClassProp, 0, &v, 0);

>

> //Set the Vpath property

> V_VT(&v) = VT_BSTR;

> V_BSTR(&v) = SysAllocString(L"%SYSTEMDRIVE%\\Windows\\System32\

> \calc.exe");

>

> strClassProp = L"VPath";

> hr = pclsInstObj->Put(strClassProp, 0, &v, 0);

>

> //Set the Iconpath property

> V_VT(&v) = VT_BSTR;

> V_BSTR(&v) = SysAllocString(L"%SYSTEMDRIVE%\\Windows\\System32\

> \calc.exe");

>

> strClassProp = L"IconPath";

> hr = pclsInstObj->Put(strClassProp, 0, &v, 0);

>

>

> //Set the IconIndex property

> V_VT(&v) = VT_I4;

> v.intVal = 0;

>

> strClassProp = L"IconIndex";

> hr = pclsInstObj->Put(strClassProp, 0, &v, 0);

>

>

> //Set the commandline settings

> V_VT(&v) = VT_UINT;

> v.uintVal = 0;

>

> strClassProp = L"CommandLineSetting";

> hr = pclsInstObj->Put(strClassProp, 0, &v, 0);

>

> //Set the RequiredCommandLine property

> V_VT(&v) = VT_BSTR;

> V_BSTR(&v) = SysAllocString(L"");

>

> strClassProp = L"RequiredCommandLine";

> hr = pclsInstObj->Put(strClassProp, 0, &v, 0);

>

>

> //Set the alias ShowInPortal settings

> V_VT(&v) = VT_BOOL;

> v.boolVal = true;

>

> strClassProp = L"ShowInPortal";

> hr = pclsInstObj->Put(strClassProp, 0, &v, 0);

>

> //Set the alias ShowInPortal settings

> V_VT(&v) = VT_BOOL;

> v.boolVal = true;

>

> strClassProp = L"PathExists";

> hr = pclsInstObj->Put(strClassProp, 0, &v, 0);

>

>

>

>

> hr = pSvc->PutInstance(pclsInstObj, WBEM_FLAG_CREATE_ONLY, NULL,

> NULL);

>

> //Here is failes with error "The parameter is incorrect".

>

>

> if (FAILED (hr))

> {

> MessageBox (NULL, _T("Failed"),NULL,NULL);

> return 0;

> }

>

> pclsInstObj->Release();

>

> MessageBox (NULL, _T("Success"),NULL,NULL);

> // Clean up.

> VariantClear(&v);

>

>

>

> Can any one guide me to solve this problem.

> Or please tell me if there is any alternative way to programmatically

> publish application on Longhorn Terminal server.

>

> Any help will be appreciated

>

>

> Thanks,

> Amit..

>

>

>

>

>

>

Guest amitmane82@gmail.com
Posted

Re: Programmatically publish application on Longhorn Terminal server.

 

On Apr 11, 5:30 am, "Rob Leitman [MS]" <robl...@online.microsoft.com>

wrote:

> PathExists is read-only, so you shouldn't try to set it.

>

> RDPFileContents is requred, so you need to set it.  You can get this by

> saving an RDP using mstsc, or by copying an RDP file from another source.

>

> You may want to pass WBEM_FLAG_CREATE_OR_UPDATE in case the app already

> exists.

>

> Rob

>

> <amitman...@gmail.com> wrote in message

>

> news:71651bc4-8717-4b48-825a-91a135ce5e5f@u36g2000prf.googlegroups.com...

>

>

>

> > Hi All

> >       I want to programmatically publish a remote application on

> > longhorn terminal server.

> > To do this I have used "Win32_TSPublishedApplication" class of latest

> > WMI.

> > But  PutInstance() method of IWbemServices fails for this class with

> > errors "The parameter is incorrect".

> >      I don't have any idea why it fails.

>

> > Below is the code

>

> > HRESULT hr;

>

> >    hr =  CoInitializeEx(0, COINIT_MULTITHREADED);

>

> > if (FAILED (hr))

> > return 0;

>

> > CComPtr<IWbemLocator> pLoc = NULL;

>

> > hr = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER,

> > IID_IWbemLocator, (LPVOID *) &pLoc);

>

> > if (FAILED(hr))

> > {

> > return 0;

> > }

>

> > IWbemServices *pSvc = NULL;

>

> > hr = pLoc->ConnectServer(

> > _bstr_t(L"root\\cimv2\\TerminalServices"),

> > NULL,

> > NULL,

> > 0,

> > NULL,

> > 0,

> > 0,

> > &pSvc

> > );

>

> > if (FAILED (hr))

> > return 0;

>

> > 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

> >    );

>

> > if (FAILED (hr))

> > return 0;

>

> > IWbemClassObject  *pclsObj = NULL;       //SMS_ST_RecurInterval class

> > IWbemClassObject  *pclsInstObj = NULL;      //Instance of

> > SMS_ST_RecurInterval

>

> > hr = pSvc->GetObject(_bstr_t(L"Win32_TSPublishedApplication"), 0,

> > NULL, &pclsObj, 0);

> > hr = pclsObj->SpawnInstance(0, &pclsInstObj);

> > pclsObj->Release();

>

> > VARIANT v;

> > VariantInit(&v);

>

> > //Set the name property

> > V_VT(&v) = VT_BSTR;

> > V_BSTR(&v) = SysAllocString(L"Calculator");

>

> > LPCWSTR strClassProp = L"Name";

> > hr = pclsInstObj->Put(strClassProp, 0, &v, 0);

>

> > //Set the alias property

> > V_VT(&v) = VT_BSTR;

> > V_BSTR(&v) = SysAllocString(L"calc");

>

> > strClassProp = L"Alias";

> > hr = pclsInstObj->Put(strClassProp, 0, &v, 0);

>

> > //Set the path property

> > V_VT(&v) = VT_BSTR;

> > V_BSTR(&v) = SysAllocString(L"C:\\Windows\\System32\\calc.exe");

>

> > strClassProp = L"Path";

> > hr = pclsInstObj->Put(strClassProp, 0, &v, 0);

>

> > //Set the Vpath property

> > V_VT(&v) = VT_BSTR;

> > V_BSTR(&v) = SysAllocString(L"%SYSTEMDRIVE%\\Windows\\System32\

> > \calc.exe");

>

> > strClassProp = L"VPath";

> > hr = pclsInstObj->Put(strClassProp, 0, &v, 0);

>

> > //Set the Iconpath property

> > V_VT(&v) = VT_BSTR;

> > V_BSTR(&v) = SysAllocString(L"%SYSTEMDRIVE%\\Windows\\System32\

> > \calc.exe");

>

> > strClassProp = L"IconPath";

> > hr = pclsInstObj->Put(strClassProp, 0, &v, 0);

>

> > //Set the IconIndex property

> > V_VT(&v) = VT_I4;

> > v.intVal = 0;

>

> > strClassProp = L"IconIndex";

> > hr = pclsInstObj->Put(strClassProp, 0, &v, 0);

>

> > //Set the  commandline settings

> > V_VT(&v) = VT_UINT;

> > v.uintVal = 0;

>

> > strClassProp = L"CommandLineSetting";

> > hr = pclsInstObj->Put(strClassProp, 0, &v, 0);

>

> > //Set the RequiredCommandLine property

> > V_VT(&v) = VT_BSTR;

> > V_BSTR(&v) = SysAllocString(L"");

>

> > strClassProp = L"RequiredCommandLine";

> > hr = pclsInstObj->Put(strClassProp, 0, &v, 0);

>

> > //Set the alias ShowInPortal settings

> > V_VT(&v) = VT_BOOL;

> > v.boolVal = true;

>

> > strClassProp = L"ShowInPortal";

> > hr = pclsInstObj->Put(strClassProp, 0, &v, 0);

>

> > //Set the alias ShowInPortal settings

> > V_VT(&v) = VT_BOOL;

> > v.boolVal = true;

>

> > strClassProp = L"PathExists";

> > hr = pclsInstObj->Put(strClassProp, 0, &v, 0);

>

> > hr = pSvc->PutInstance(pclsInstObj, WBEM_FLAG_CREATE_ONLY, NULL,

> > NULL);

>

> >      //Here is failes with error "The parameter is incorrect".

>

> > if (FAILED (hr))

> > {

> > MessageBox (NULL, _T("Failed"),NULL,NULL);

> > return 0;

> > }

>

> > pclsInstObj->Release();

>

> > MessageBox (NULL, _T("Success"),NULL,NULL);

> > // Clean up.

> > VariantClear(&v);

>

> > Can any one guide me to solve this problem.

> > Or please tell me if there is any alternative way to programmatically

> > publish application on Longhorn Terminal server.

>

> > Any help will be appreciated

>

> > Thanks,

> > Amit..- Hide quoted text -

>

> - Show quoted text -

 

Hi Rob ,

Your solution worked perfectly.

Thanks lot...........!!

 

~Amit.


×
×
  • Create New...