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>>
Удаленный помощник
От: Аноним  
Дата: 19.11.07 09:35
Оценка:
Привет всем. Есть задача программно создать приглашение (ticket) штатного удаленного помощника windows. Сам формат приглашения известен и описание выложено на сайте микрософта. Но проблема в том, что помимо самого пришлашения, в системе производятся еще некоторые действия. В частности известно что запускается служба helpsvc и включается стандартная учетная запись HelpAssistant. Впринципе это програмно реализуемо, но этого мало для того чтобы по сгенерированому приглашению можно было подключиться. Т.е. стандартный визард производит еще какие-то действия для активации сеанса. Вот собственно и вопрос: что еще нужно сделать? Может быть в winapi существуют средства, чтобы все это провернуть и обойтись малой кровью? Поиск по сдк, и в гугле ничего не дал
Re[2]: Удаленный помощник
От: al.t  
Дата: 20.11.07 09:10
Оценка:
Здравствуйте, Блудов Павел, Вы писали:

БП>Вкратце. Берите OleView и смотрите TypeLib в sessmgr.exe. Там всё есть. Имена методов говорят сами за себя.


Спасибо огромное, хоть сходу и не вьехал что нужно делать, но хотя бы стало известно в каком направлении копать
И самое главное.
От: Блудов Павел Россия  
Дата: 21.11.07 02:08
Оценка:
Здравствуйте, al.t, Вы писали:

AT>Спасибо огромное, хоть сходу и не вьехал что нужно делать, но хотя бы стало известно в каком направлении копать

sessmgr.exe в каждом методе проверяет, под какой учётной записью выполняется вызвавшей его процесс.
И если это не LocalSystem, то посылает нафиг. Вот такие пироги. Так что весь код работающий в ним нужно вынести в службу.
Отлаживать это дело — мечта любого мазлхиста.
... << RSDN@Home 1.2.0 alpha rev. 774>>
Re: И самое главное.
От: Аноним  
Дата: 21.11.07 05:52
Оценка:
Извеняюсь за, возможно, глупый вопрос, но никак не могу понять как использоватль эти методы, которые в oleview описаны Никакой по ним документации найти не удалось. Сначала казалось что в sessmgr они просто представлены в виде неких экспортируемых функций, но вроде как оказывается все не так просто. Не могли бы вы меня ткнуть в доку где описано как работать с этими библиотеками? или в идеале пример кода. Спасибо.
А в чём пролема-то?
От: Блудов Павел Россия  
Дата: 21.11.07 06:03
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Не могли бы вы меня ткнуть в доку где описано как работать с этими библиотеками? или в идеале пример кода. Спасибо.

Просто добавьте себе в 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>>
Re: А в чём пролема-то?
От: Аноним  
Дата: 23.10.08 06:27
Оценка:
Здравствуйте, Блудов Павел,!

очень полезная инфа!

Вы писали:
Хотите верьте, хотите нет, но полученные имя пользователя, пароль, папку и оболочку можно скормить обычному MSTSC контролу.
Он сам догадается, что это сеанс помощи и сделает всё что нужно.

можно ли поподробнее?
какому такому обычному MSTSC контролу — mstscax.dll ?
и что такое "...папку и оболочку..."
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.