Re: Удаленный помощник
От: Блудов Павел Россия  
Дата: 20.11.07 03:14
Оценка: 46 (5)
Здравствуйте, <Аноним>, Вы писали:

А>Привет всем. Есть задача программно создать приглашение (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>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.