Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.07.16;
Скачать: [xml.tar.bz2];

Вниз

Fast User Switching и интерактивный сервис.   Найти похожие ветки 

 
Eraser ©   (2006-04-06 12:58) [0]

Добрый день!
Проблема по-моему уже "заезжанная", но всё таки мне решение так и не удалось найти (

Есть интерактивный сервис (просьба не пинать - так надо), он корректно определяет смену рабочего стола, т.е. когда пользователь переключается в logon screen или залогинивается, всё прекрасно работает до того момента, когда, помимо уже залогинивавшегося пользователя, загружается ещё один, т.е. применяется Fast User Switching. Севис подвисает (

Подозреваю, что это связано с тем, что Fast User Switching использует сервер терминалов и для каждого следующего пользователя создаётся отдельная терминальная сессия у которой своя window station.

Так собственно основной вопрос: как сделать так, чтобы сервис нормально функционировал при включённом FUS?

И побочный вопрос: как можно добраться до window station другой терминальной сессии или же переключить сервис на другую терминальную сессию...? возможно я что-то где-то напутал в объяснении, если это так - поправте.


 
Чапаев ©   (2006-04-06 13:14) [1]


> Проблема по-моему уже "заезжанная", но всё таки мне решение
> так и не удалось найти

Если тебе от этого станет легче, скажу, что мне не удалось тоже... :-D


> Севис подвисает

Если он что-то выводит на десктоп, то выводит на десктоп первого залогиненного пользователя. Если это что-то требует реакции пользователя, то, естественно, это и будет похоже на зависание сервиса.


 
Игорь Шевченко ©   (2006-04-06 13:17) [2]

"If a service running on a multiuser system must interact with a user, the service should create a separate GUI application running within the context of the interactive user. The easiest way to run an application in each session is to add it to the following key: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run. This GUI application should be designed to communicate with the service through some method of IPC, for example, named pipes, as described in the previous section. By using named pipes, the server can distinguish between multiple user processes by giving each pipe a unique name based on the session ID."

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/interactive_services.asp

См. также:

http://winfaq.msterminalservices.org/faqs2.cfm?id=397&category=2&sortby=date

См. также:

http://www.google.ru/search?hl=ru&ie=windows-1251&q=Interactive+service+fast+user+switching&lr=


 
Eraser ©   (2006-04-06 13:27) [3]


> Чапаев ©   (06.04.06 13:14) [1]


> Если тебе от этого станет легче

скорее наоборот :-)

> Игорь Шевченко ©   (06.04.06 13:17) [2]

да читал я это всё и не раз :(
Особенно понравилась фраза

This creates the same dilemma in which there is no way to know whether the current interactive user is connected to session 0. Therefore, a service that is designed for Windows XP should not be configured as an interactive service.

всё больше, последнее время, начинаю понимать ненавистником M$ :)

Проблема в том, что мне необходим доступ к Logon экрану, поэтому вариант с GUI приложение в контексте интерактивного пользователя отпадет... иначе не было бы даже смысла оформлять программу в виде сервиса.


 
Игорь Шевченко ©   (2006-04-06 13:39) [4]


> Проблема в том, что мне необходим доступ к Logon экрану


gina ?


 
Eraser ©   (2006-04-06 13:42) [5]


> Игорь Шевченко ©   (06.04.06 13:39) [4]

не совсем, т.к. в сам процесс залогивания вмешиваться не надо, нужен только доступ к HDC logon экрана...


 
Eraser ©   (2006-04-06 13:43) [6]


> Eraser ©   (06.04.06 13:42) [5]


> нужен только доступ к HDC logon экрана...

а кроме как из интерактивного сервиса - другово способа не знаю :(


 
Игорь Шевченко ©   (2006-04-06 14:06) [7]


> в сам процесс залогивания вмешиваться не надо, нужен только
> доступ к HDC logon экрана...


Не могу понять, зачем, но разве из неинтерактивного сервиса нельзя открыть Desktop WinLogon, временно подключившись к WinSta0 ? Вроде прав должно хватать, если WinLogon не запрещает. А открыв Desktop можно получить его DesktopWindow


 
Eraser ©   (2006-04-06 14:10) [8]


> Игорь Шевченко ©   (06.04.06 14:06) [7]

спасибо за наводку... буду эксперементировать в этом направлении.

Неинтерактивный сервис не принадлежит ни какой терминальной сессии, я правильно понял?


 
Чапаев ©   (2006-04-06 14:21) [9]


> разве из неинтерактивного сервиса нельзя открыть Desktop
> WinLogon

Можно, и рисовать средствами API можно.


> separate GUI application running within the context of the
> interactive user. The easiest way to run an application
> in each session is to add it to the following key: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

Вот это не нравится... Процесс будет запущен с правами текущего пользователя и пользователь его может завершить. А вот завершать его нельзя (в моём случае).


 
Игорь Шевченко ©   (2006-04-06 14:29) [10]


> Неинтерактивный сервис не принадлежит ни какой терминальной
> сессии, я правильно понял?


Любой процесс может получить свою сессию вызовом GetProcessSessionID. Терминальная сессия, она есть всегда, даже для неинтерактивных сервисов. Только (по моему мнению), для сервисов ее ID будет равен нулю.


 
Чапаев ©   (2006-04-06 14:31) [11]


> GetProcessSessionID

Хелп Delphi2006 такого не знает, MSDN, насколько я помню, тоже...


 
Eraser ©   (2006-04-06 14:33) [12]


> Чапаев ©   (06.04.06 14:31) [11]

наверное имелось ввиду ProcessIdToSessionId :)


 
Eraser ©   (2006-04-06 14:35) [13]


> Игорь Шевченко ©   (06.04.06 14:29) [10]


>  Терминальная сессия, она есть всегда, даже для неинтерактивных
> сервисов. Только (по моему мнению), для сервисов ее ID будет
> равен нулю.

как и для интерактивного сервиса вроде...

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


 
Чапаев ©   (2006-04-06 14:39) [14]


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

Лично у меня все попытки открыть рабочий стол потока, не принадлежащего данному процессу, заканчивались access denied. :`(

ЗЫ. Человече, у тебя ДР, а ты какими-то сессиями да рабочими столами морочишься... :o)


 
Eraser ©   (2006-04-06 14:44) [15]


> Чапаев ©   (06.04.06 14:39) [14]


> ЗЫ. Человече, у тебя ДР, а ты какими-то сессиями да рабочими
> столами морочишься... :o)

ДР c нерабочими столами вечером :-) а щас - сиссии и столы (рабочие) )))


 
Eraser ©   (2006-04-06 14:48) [16]


> Чапаев ©   (06.04.06 14:39) [14]


> Лично у меня все попытки открыть рабочий стол потока, не
> принадлежащего данному процессу, заканчивались access denied.
>  :`(

а если OpenInputDesktop тоже?


 
Чапаев ©   (2006-04-06 14:54) [17]


> а если OpenInputDesktop тоже?

Выдавало тот самый десктоп первого залогиненного пользователя, на который я и так мог выводить, что заблагорассудится. 8-/

CreateDesktop()+SwitchDesktop() создают новый рабочий стол и переключаются на него, но этот рабочий стол тоже виден только первому из залогиненных пользователей. (Зато на нём отображается только то, что сам на нём нарисуешь. Даже Ctrl-Alt-Del не срабатывает. :-) )


 
Eraser ©   (2006-04-06 14:59) [18]


> Чапаев ©   (06.04.06 14:54) [17]

да уж...ну прийдётся скорее всего оставлять как есть :(


 
Игорь Шевченко ©   (2006-04-06 15:26) [19]

Прошу прощения. Это через NtQueryInformationProcess делается. Я с ядерной функцией спутал.


 
kami ©   (2006-04-06 23:24) [20]

А нельзя ли сделать так:
В HandlerEx( или winlogon notification package или WTSRegisterSessionNotification)  получаем ID сессии, затем вычисляем в WTSEnumerateSessions по ID имя WinStation и подключаемся к ней (потом, соответственно, один из потоков - к десктопу). ?

P.S. Это точно не будет работать, если терминальные сессии не задействованы - тогда при переключении пользователей WTSEnumerateSessions выдает "Console" и OpenWindowsStation возвращает "неверное имя". С FUS не пробовал...

P.P.S Не пинать, если сказал глупость - просто мысли вслух :)


 
Eraser ©   (2006-04-07 13:34) [21]


> kami ©   (06.04.06 23:24) [20]


> В HandlerEx( или winlogon notification package или WTSRegisterSessionNotification)
>  получаем ID сессии, затем вычисляем в WTSEnumerateSessions
> по ID имя WinStation и подключаемся к ней (потом, соответственно,
>  один из потоков - к десктопу). ?

в том то и дело, что не получится такой фокус... нету доступа ( , а имя нужно winstation - WinSta0.



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.07.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.012 c
2-1151424388
Dr. Genius
2006-06-27 20:06
2006.07.16
Как получить хэндл окна, вызываемого функцией ShellExecute?


15-1150443942
Prohodil Mimo
2006-06-16 11:45
2006.07.16
Есть ли программы, тестирующие диск на чтение?


2-1151302164
Gloomer
2006-06-26 10:09
2006.07.16
Список компонент


2-1151338247
Chort
2006-06-26 20:10
2006.07.16
сохранение настроек


2-1151354245
SergNic
2006-06-27 00:37
2006.07.16
о возможностях Delphi 2006 Prof





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский