/r/ сервисы и их окна

Тема в разделе "WASM.WIN32", создана пользователем Com[e]r, 24 мар 2010.

  1. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    за все эти годы, со всем моим кол-вом сообщений, это лишь третья тема, созданная мной на васме )
    да, так что сразу к делу: когда твоё приложение запущено как системный сервис, его дефолтный десктоп принадлежит соответственно NT_AUTHORITY, от которого он запущен, потому окна, создаваемые процессом все создаются там же, и юзер их наблюдать не имеет возможности.

    в win5 эта проблема решалась просто:
    Код (Text):
    1. bool setthrdsk(){
    2.   SetProcessWindowStation(OpenWindowStation("Winsta0", FALSE, WINSTA_READSCREEN));
    3.   return SetThreadDesktop(OpenDesktop("Default", NULL, FALSE, READ_CONTROL |DESKTOP_CREATEWINDOW));
    4. }
    но после висты система сервисов пережила значительные изменения, и они, к несчастью, коснулись и этой проблемы.

    если так же поменять десктоп в вин7, и попытаться создать окно, получится примерно следующая картина:
    [​IMG]
    объявляется Interactive Services Detection, который предлагает переключиться на сервисную winsta и поглядеть - чего же там от юзера хотят.

    на самом деле уже два дня мучаюсь, и даже замучался.
    сам UI0Detect для переключения десктопов использует
    WinStationGetSessionIds, WinStationRevertFromServicesSession, и WinStationSwitchToServicesSession из winsta.dll (спасибо грейту), но загвоздка в том, что ни прототипов, ни хедеров, ни экзамплов в интернетах я как ни старался - так и не нашёл.
    использование их наугад, поглядывая на разреверсеный UI0Detect.exe не дало никаких результатов:
    Код (Text):
    1.    PutAProc4("winsta",WinStationSwitchToServicesSession,DWORD,());
    2.    DBGV(p,WinStationSwitchToServicesSession);
    3.    DWORD res=WinStationSwitchToServicesSession();
    4.    DBGV(d,res);
    5.  
    6. /* тут код создания окна, контролов, обработка сообщений, все дела
    7.     потом идёт разрушение окна и, собственно, возврат к родной winsta: */
    8.  
    9.    DWORD (*WinStationRevertFromServicesSession)(char*,DWORD,char*,DWORD,DWORD,DWORD);
    10.    PutAProc2("winsta",WinStationRevertFromServicesSession);
    11.    DBGV(p,WinStationRevertFromServicesSession);
    12.    res=WinStationRevertFromServicesSession("{EF0F4B22-39FC-4902-A2FA-57A0730A2A7C}", 0, "My desktop", 0, 1, 20);
    13.    DBGV(d,res);
    прошу помощи, у кого какие идеи?
     
  2. G13

    G13 New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2006
    Сообщения:
    499
    То есть вариант "сервис + гуи-клиент", ненавязчиво насаждаемый Microsoft - не устраивает?

    Семёрки под рукой пока нет, проверить не на чем. Есть предположение, что WinStationSwitchToServicesSession надо бы выполнять из кода, запущенного в пользовательской сессии, с помощью CreateProcessAsUser или CreateProcessWithTokenW.

    Ссылочка в тему: http://www.codeproject.com/KB/vista-security/interaction-in-vista.aspx
     
  3. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    вот еще статья Ионеску на эту тему
    http://www.alex-ionescu.com/?p=60
     
  4. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Да, запуск приложения в сессии пользователя и дальнейшее общение юзера с приложением, а приложения с сервисом – это каноническое решение проблемы интеракции сервиса с юзером. На самом деле именно это и делает UI0Detect, когда создаёт самокопию и выводит табличку с запросом на скольжение.

    >Есть предположение, что WinStationSwitchToServicesSession надо бы выполнять из кода, запущенного в пользовательской сессии.
    Мы тоже так подумали – однако лог показывает, что вряд ли (UI0Detect из пользовательской сессии – ограниченный процесс):
    Код (Text):
    1. >sc create notehole binPath= C:\sys\notepad.exe type= own type= interact
    2. >sc start ui0detect
    3. >sc start notehole
    4.  
    5. Process 2692 started by parent 3324 [cmd.exe] running in session 1 with name \Windows\System32\sc.exe.
    6. Process 4752 started by parent 500 [services.exe] running in session 0 with name \bin\Notepad++\notepad++.exe.
    7. Process 2016 started by parent 2620 [ui0detect.exe, session0] running in session 1 with name \Windows\System32\UI0Detect.exe.
    8. ;
    9. ; Здесь нам предлагают переход и мы соглашаемся.
    10. ;
    11. Process 4752 [notepad++.exe] stopped at time ‎2010‎-‎03‎-‎24T20:48:25.274414000Z with exit code 0.
    12. ;
    13. ; А ^здесь мы закрываем notepad, находясь в нулевой сессии.
    14. ;
    Кстати, это только у нас модифицированы параметры, или же на w7 UI0Detect по умолчанию стоит в режиме ручного запуска (и, соответственно, ничего не детектит)?
     
  5. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    не, у меня тоже Manually стоит, но запускается когда того требуется.

    спасибо за линки, сегодня буду почитать.

    а насчёт канонического - это, КСОжалению, немножко не подходит - уж слишком определённой тематики проект я пишу .)
     
  6. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    м, на линке с codeproject я уже был, и даже предпринял попытки заставить это работать, но почему-то ничего полезного из этого по какой-то причине не вышло, насколько я помню.
     
  7. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    [на правах бампа]

    Ну как, научился межсессионно интерактивировать оконные станции?