Здравствуйте, <Аноним>, Вы писали:
А>Привет всем. Есть задача программно создать приглашение (ticket) штатного удаленного помощника windows. Сам формат приглашения известен и описание выложено на сайте микрософта. Но проблема в том, что помимо самого пришлашения, в системе производятся еще некоторые действия. В частности известно что запускается служба helpsvc и включается стандартная учетная запись HelpAssistant.
Вкратце. Берите OleView и смотрите TypeLib в sessmgr.exe. Там всё есть. Имена методов говорят сами за себя.
На что стоит обратить внимание. Между XP SP1 и XP SP2 был патчик, который удалял из реестра информацию о TypeLib'е sesmgr.exe.
Поэтому его нужно создавать вот так:
HRESULT hr;
hr = m_pSessionMgr.CoCreateInstance(
RDSESSMGRLib::CLSID_RemoteDesktopHelpSessionMgr);
ATLTRACE(_T("m_pSessionMgr.CoCreateInstance 0x%08X\n"), hr);
if (TYPE_E_LIBNOTREGISTERED == hr)
{
// Bung for damaged sessionmgr (XP pre sp2)
//
ATLTRACE(_T("Applying patch for sessmgr.exe type library\n"));
static LPCTSTR c_szSessMgrPath = _T("sessmgr.exe");
static LPCTSTR c_szSessMgrTypelib =
_T("TypeLib\\{71F1098A-2D69-45D7-B19E-D3B902323F66}\\1.0\\0\\win32");
ATL::CRegKey key;
if (S_OK == key.Create(HKEY_CLASSES_ROOT, c_szSessMgrTypelib))
key.SetStringValue(NULL, c_szSessMgrPath);
// Retry with this bung
//
hr = m_pSessionMgr.CoCreateInstance(
RDSESSMGRLib::CLSID_RemoteDesktopHelpSessionMgr);
ATLTRACE(_T("m_pSessionMgr.CoCreateInstance (with bung) 0x%08X\n"), hr);
}
ATLASSERT(SUCCEEDED(hr));
return hr;
Далее. Удалённая помощь может быть выключена через "Мой компутер->Свойства".
Включается в реестре (желательно спросить мнение пользователя)
hr = m_pSessionMgr->CreateHelpSessionEx(dwFalgs
, false, dwTimeOut, 0, bstrSid, bstrEmpty, &pSession);
if (FAILED(hr))
{
// Remote assistance may be disabled. Enable it now.
//
static LPCTSTR c_szAllowToGetHelp = _T("fAllowToGetHelp");
static LPCTSTR c_szTermSrvKey =
_T("SYSTEM\\CurrentControlSet\\Control\\Terminal Server");
// Reg key scope
//
{
ATL::CRegKey key;
if (S_OK == key.Create(HKEY_LOCAL_MACHINE, c_szTermSrvKey))
key.SetDWORDValue(c_szAllowToGetHelp, TRUE);
}
// Try to reset the Help assistance account
//
hr = m_pSessionMgr->ResetHelpAssistantAccount(-1);
ATLTRACE(_T("HelpAssistance Reset 0x%08X\n"), hr);
// Try again
//
hr = m_pSessionMgr->CreateHelpSessionEx(dwFalgs
, false, dwTimeOut, 0, bstrSid, bstrEmpty, &pSession);
}
Далее тупо получаем информацию о подключении и отсылаем клиенту
if (SUCCEEDED(hr))
{
hr = pSession->get_AssistantAccountName(pbstrUserName);
if (SUCCEEDED(hr))
hr = pSession->get_ConnectParms(&bstrConnectParms);
if (SUCCEEDED(hr))
hr = _ParseConnectParms(bstrConnectParms
, pbstrPassword, pbstrFolder, pbstrShell);
if (SUCCEEDED(hr))
hr = pSession->get_HelpSessionId(&bstrSessionId);
}
Хотите верьте, хотите нет, но полученные имя пользователя, пароль, папку и оболочку можно скормить обычному MSTSC контролу.
Он сам догадается, что это сеанс помощи и сделает всё что нужно.
... << RSDN@Home 1.2.0 alpha rev. 774>>
Привет всем. Есть задача программно создать приглашение (ticket) штатного удаленного помощника windows. Сам формат приглашения известен и описание выложено на сайте микрософта. Но проблема в том, что помимо самого пришлашения, в системе производятся еще некоторые действия. В частности известно что запускается служба helpsvc и включается стандартная учетная запись HelpAssistant. Впринципе это програмно реализуемо, но этого мало для того чтобы по сгенерированому приглашению можно было подключиться. Т.е. стандартный визард производит еще какие-то действия для активации сеанса. Вот собственно и вопрос: что еще нужно сделать? Может быть в winapi существуют средства, чтобы все это провернуть и обойтись малой кровью? Поиск по сдк, и в гугле ничего не дал
Здравствуйте, Блудов Павел, Вы писали:
БП>Вкратце. Берите OleView и смотрите TypeLib в sessmgr.exe. Там всё есть. Имена методов говорят сами за себя.
Спасибо огромное, хоть сходу и не вьехал что нужно делать, но хотя бы стало известно в каком направлении копать
Здравствуйте, al.t, Вы писали:
AT>Спасибо огромное, хоть сходу и не вьехал что нужно делать, но хотя бы стало известно в каком направлении копать 
sessmgr.exe в каждом методе проверяет, под какой учётной записью выполняется вызвавшей его процесс.
И если это не LocalSystem, то посылает нафиг. Вот такие пироги. Так что весь код работающий в ним нужно вынести в службу.

Отлаживать это дело — мечта любого мазлхиста.
... << RSDN@Home 1.2.0 alpha rev. 774>>
Извеняюсь за, возможно, глупый вопрос, но никак не могу понять как использоватль эти методы, которые в oleview описаны

Никакой по ним документации найти не удалось. Сначала казалось что в sessmgr они просто представлены в виде неких экспортируемых функций, но вроде как оказывается все не так просто. Не могли бы вы меня ткнуть в доку где описано как работать с этими библиотеками? или в идеале пример кода. Спасибо.
Здравствуйте, <Аноним>, Вы писали:
А>Не могли бы вы меня ткнуть в доку где описано как работать с этими библиотеками? или в идеале пример кода. Спасибо.
Просто добавьте себе в stdafx.h строку
#import <sessmgr.exe> raw_interfaces_only named_guids
После чего можно будет делать так:
ATL::CComPtr<RDSESSMGRLib::IRemoteDesktopHelpSessionMgr> m_pSessionMgr;
HRESULT hr;
hr = m_pSessionMgr.CoCreateInstance(
RDSESSMGRLib::CLSID_RemoteDesktopHelpSessionMgr);
if (SUCCEEDED(hr))
{
hr = m_pSessionMgr->CreateHelpSessionEx(dwFalgs
, false, dwTimeOut, 0, bstrSid, bstrEmpty, &pSession);
}
Документации (ровно как и гарантии, что ничего не поменяется) нету.
Но начиная с Win2k3 SP1 интерфейс не менялся. Так что пользоваться можно.
... << RSDN@Home 1.2.0 alpha rev. 774>>