среда, 16 ноября 2011 г.

совсем отупел

А расскажите мне например про легкий и быстрый способ бросить курить пить и жить узнать, работает ли мой код внутри сервиса (который как известно запрещает по умолчанию общаться с пользовательским десктопом, но может и разрешить посредством флага SERVICE_INTERACTIVE_PROCESS) или внутри обычной пользовательской проги и я могу соотв-но показывать всякое ?

Есличо я в курсе за ф-цию WTSGetActiveConsoleSessionId - это совсем не про то что нужно. Начиная с висты в user32.dll есть также малодокументированная ф-ция _UserTestTokenForInteractive - оно уже больше на правду похоже, но мне и под xp/w2k3 нужно и еще для Terminal Server

6 комментариев:

  1. 0) GetModuleHandle(L"user32.dll")
    1) GetDC(0)
    если получилось значит либо виста/7(в т.ч 0 сессия) либо интерактивный сервис XP
    2) GetVersionEx
    3) GetProcessToken + GetTokenInformation + TokenSessionId. не пугаем юзверя если старше висты и 0 сессия
    пойдет?

    ОтветитьУдалить
  2. cмахивает на грязный хак
    проще тогда уже
    1) определяем своего папашу
    2) если не services.exe - нам можно
    3) иначе запрашиваем из scm флаги. если содержат SERVICE_INTERACTIVE_PROCESS - нам тоже можно
    4) иначе нельзя
    но и это тоже грязный хак
    А казалось бы такая простая задача...

    ОтветитьУдалить
  3. бгг это пока кто-то не назовется так же
    или пока на какой нибудь windows 15 services.exe не захочет создавать процесс сам, а будет его делать через какой нибудь хелпер
    алсо флаги у сервиса можно сменить без рестарта оного

    ОтветитьУдалить
  4. еcли наш папаша не настоящий services - scm нам не отдаст ничего вразумительного, так шо тут все хорошо
    Флаги да, можно сменить :-(

    ОтветитьУдалить
  5. http://www.codeguru.com/forum/showpost.php?p=1758071&postcount=4
    Оно или нет? По крайней мере на основе это функции реализован Environment.UserInteractive

    ОтветитьУдалить
  6. спасибо, внезапно похоже на правду
    надо еще под TS проверить

    ОтветитьУдалить