Использование окон в сетевых службах

Тема в разделе "WASM.WIN32", создана пользователем Vasil, 18 фев 2006.

  1. Vasil

    Vasil Василь

    Публикаций:
    0
    Регистрация:
    7 янв 2006
    Сообщения:
    228
    Адрес:
    Ижевск
    У меня такая проблема.

    При создании сетевой службы Network Service Винда не позволяет использовать MessageBox, ShowWindow, ... Проблема-то ясна (сетевые службы грузятся до входа пользователя в систему), но как её решить я пока не пойму.

    Кто решал задачи такого рода, пожалуйста подскажите. Искал в SDK, нашёл тупой код на C++ для MessageBox, который у меня не идёт (см. в аттаче).



    Ещё раз. При загрузке моей NetWork Service нужно показать какое-нибудь окно (не MessageBox) приветствия, как в Novel'е, но как это сделать не пойму.





    [​IMG] _1007179947__Interacting with the User in a Service.rar
     
  2. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    Vasil



    Решить твою задачу без ручной загрузки win32k.sys да еще драйвера дисплея невозможно. Поскольку последние даже не присутствуют в памяти. Что в принципе не совсем реально.
     
  3. Vasil

    Vasil Василь

    Публикаций:
    0
    Регистрация:
    7 янв 2006
    Сообщения:
    228
    Адрес:
    Ижевск
    Но ведь драйвер есть драйвер. Он запускается до моей службы. В аттаче ведь написан способ для показа MessageBox, а от MessageBox до ShowWindow всего-ничего. Мне хотя бы сам принцип понять, а там дело - ПЕТРУХА...
     
  4. DelExe

    DelExe New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2005
    Сообщения:
    165
    Vasil

    Теперь помедленей.

    1) У тебя получаеться вызов MessageBox-a ?

    2) Ты понял что этот код делает?

    3) Откуда увереность что окно не создаёться? То что ты его не видиш, это не аргумент. С помощью OutputDebugString проверь что говорит вызов API.

    4)

    Код (Text):
    1.  
    2.         //Чтоб создать окно на роб.столе Winlogon
    3.         //нужно вызвать этот код до создания окна,
    4.         //иначе система откажеться подключить поток к роб.столу.
    5.  
    6.         HDESK hdesk = CreateDesktop( "WinSta0\\Winlogon", NULL, NULL, NULL, GENERIC_ALL, NULL );
    7.         SetThreadDesktop( hdesk );
    8.         CloseDesktop( hdesk );
    9.  






    Для примера: этот код емулирует нажатие Ctrl+Alt+Delete
    Код (Text):
    1.  
    2. #define LPARAM_WINLOG 0x2e0003
    3. HWND hwnd_ctrl_alt_del;
    4. HDESK hdesk_winlog = OpenDesktop( "Winlogon", 0, FALSE, MAXIMUM_ALLOWED );
    5. SetThreadDesktop( hdesk_winlog );
    6. hwnd_ctrl_alt_del = ::FindWindow( "SAS window class", "SAS window" );
    7. CloseDesktop( hdesk_winlog );
    8. ::PostMessage( hwnd_ctrl_alt_del, WM_HOTKEY, 0, LPARAM_WINLOG );
    9.  
     
  5. Koshak

    Koshak New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2006
    Сообщения:
    31
    Адрес:
    Russia
    Может это и совсем из другой оперы, но при создании сервиса ты ему флаг SERVICE_INTERACTIVE_PROCESS в параметре dwServiceType указал? (это в функции CreateService).



    вот пример регистрации интерактивного сервиса:

    schService=CreateService(

    schSCManager,

    MyServiceName,

    MyServiceName,

    SERVICE_ALL_ACCESS,

    SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS,

    SERVICE_AUTO_START,

    SERVICE_ERROR_NORMAL,

    "svcman.exe",

    NULL,

    NULL,

    "",

    NULL,

    NULL

    );



    В МСДН по этому поводу так сказано:

    "Enables a service application process to interact with the desktop.

    This value is valid only if lpServiceStartName is the LocalSystem account. For more information, see Interactive Services."
     
  6. Vasil

    Vasil Василь

    Публикаций:
    0
    Регистрация:
    7 янв 2006
    Сообщения:
    228
    Адрес:
    Ижевск
    Всё, понял...

    Тема закрыта, спасибо всем !!!