Здравствуйте, <Аноним>, Вы писали:
А>Привет всем. Есть задача программно создать приглашение (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>>