Текущий архив: 2004.06.13;
Скачать: CL | DM;
ВнизСервисы и Windows XP Найти похожие ветки
← →
Андрей2 (2004-04-24 19:23) [0]А как узнать имя активного пользователя из программы, запущенной от имени пользователя SYSTEM (от имени службы)? Функция GetUserName выдаёт значение SYSTEM.
← →
Игорь Шевченко © (2004-04-24 19:25) [1]
> А как узнать имя активного пользователя
Нет такого понятия.
← →
Андрей2 (2004-04-24 19:39) [2]В операционной системе Windows XP появилась такая возможность как Быстрая смена пользователей. В любой момент времени в систему может войти любое (теоритически) количество пользователей. Но вот как из моего Сервиса, написанного на Delphi (6) узнать имя АКТИВНОГО пользователя? (он-то ВСЕГДА один)
← →
Cobalt © (2004-04-24 20:15) [3]Андрей2 (24.04.04 19:39) [2]
Вы, товарисч, видимо, ни разу не пользовались удалённым подключением.
Я как-то на работе на одном компе вошёл локально, и ещё с другого компа удалённо. И в обоих сеансах работали проги, копировали файлы. и я это видел вживую на двух мониках. И это было на Win2K.
Как отличить - какой сенанс активный?
Копайте в сторону WinStation (кажется), вам - на MSDN. Там будет ссылочка под названием "Overview". Вот по ней и читайте, авось найдёте то, что вам нужно.
← →
Андрей2 (2004-04-24 20:51) [4]Вы меня, наверное неправильно поняли. Мне однажды пришлось воспользоваться утилитой Windows XP под именем "Подключение к удалённому рабочему столу". Было соединено 2 компьютера. Вошёл я под одним именем и хотел чтобы с другого, соединённого компьютера, можно было войти вторично в систему с другого компьютера и видеть рабочий стол другого пользователя на экране соединённого компьютера. И что вы думаете? Появилось сообщение: "Пользователь с именем "Пользователь 2" хочет соединиться с данным компьютером. Разрешить или запретить?" (типо такого). Я выбрал "Разрешить". И Windows XP выкинул меня в экран приветствия, а удалённый компьютер получил удалённый рабочий стол. Я опять зашёл в систему с локального компьютера и тогда удалённый компьютер сказал примерно так: "Связь с удалённым рабочим столом прервана". Я сделал вывод о том что Рабочий стол в данный момент времени может принадлежать одному и только одному из пользователей, а значит и активный пользователь, работающий на данном компьютере тоже может быть только один. И всё-таки, как получить имя активного пользователя, рабочий стол которого в данный момент на экране? (сам Handle этого рабочего стола я всё-таки смог определить, а имя этого пользователя...)
← →
Игорь Шевченко © (2004-04-24 20:54) [5]
> узнать имя АКТИВНОГО пользователя?
Если имеется в виду пользователь, подключенный к локальной оконной станции, то может быть поможет
WTSGetActiveConsoleSessionId + WTSQueryUserToken ?
← →
Андрей2 (2004-04-25 08:42) [6]Может быть и подойдёт. Но вот только как этими функциями (процедурами) пользоваться? (как их вызывать и что им в качестве параметров передавать)
← →
Polevi © (2004-04-25 09:39) [7]ты хелп бы посмотрел сперва для приличия что ли
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/termserv/termserv/wtsgetactiveconsolesessionid.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/termserv/termserv/wtsqueryusertoken.asp
← →
Андрей2 (2004-04-26 13:56) [8]А ва, для приличия, повежливее были бы! Ну посмотрел я MSDN, но почему-то функция WTSGetActiveConsoleSessionId в любых случаях возвращает 0. Я её вызывал и из kernel32.dll (отладчик Delphi говорит, что она имеется там), и из WTSApi.dll (хотя этой функции там нет) - никакой разницы! Что прикажете делать?
← →
Андрей2 (2004-04-26 13:58) [9]А Вы, Polevi, для приличия, повежливее были бы! Ну посмотрел я MSDN, но почему-то функция WTSGetActiveConsoleSessionId в любых случаях возвращает 0. Я её вызывал и из kernel32.dll (отладчик Delphi говорит, что она имеется там), и из WTSApi.dll (хотя этой функции там нет) - никакой разницы! Что прикажете делать?
← →
Polevi © (2004-04-26 14:18) [10]> Что прикажете делать?
застрелиться
← →
Андрей2 (2004-04-26 14:24) [11]Я пока ещё жить хочу! Вы, пожалуйста по теме что-нибудь посоветуйте!
← →
VMcL © (2004-04-26 14:34) [12]>>Андрей2 (26.04.04 14:24) [11]
Голова и глаза тебе, чтобы наушники и шапку носить?
WTSGetActiveConsoleSessionId
Return Values
The session identifier of the session attached to the console. If there is no session attached to the console, (for example, if the console session is in the process of being attached or detached), this function returns 0xFFFFFFFF.
← →
Андрей2 (2004-04-26 18:45) [13]Вы, VMcL, я так понимаю текст Return Values из MSDN сюда перекатали. И я там был, мёд-пиво пил... но ничего не помогало. Я вот думаю может-быть есть какая-либо альтернатива функции WTSGetActiveConsoleSessionId? А может (может-быть) есть функция, которая напрямую выдаст имя пользователя активной ОКОННОЙ сессии? (хотя вряд-ли такая есть). Но биться все равно будем! Какие у Вас, члены форума, есть ещё предложения (только не типо таких как застрелиться, а ПО ДЕЛУ)?
← →
Андрей2 (2004-04-26 20:31) [14]Что-то Вы замолчали. Или уснули. Или у Вас кончились предложения? Помогите мне пожалуйста!
← →
sniknik © (2004-04-26 23:25) [15]зачем? чтобы ты и ту добрую душу обложил? направление тебе дали, двигайся! хотя бы для того чтобы понять что тебе не это нужно а чтото другое.
← →
Anatoly Podgoretsky © (2004-04-27 09:23) [16]Выпий пива, забудь проблемы.
← →
Игорь Шевченко © (2004-04-27 10:19) [17]Читаем MSDN, топик "Microsoft Windows XP Fast User Switching: Design Guide for Building Business Applications"
"System Services Interaction
From a programmatic standpoint, several cases need to be addressed:
The server process receives a direct request from a client process.
In this case, the message is probably transmitted via LPC or RPC. In either case, there are APIs to get the client token. Use WTSQueryUserToken. Once the client token is obtained, the server can call advapi32!CreateProcessAsUser. This brings up the process on the correct window station, assuming that the client user token has a session tag, which it should.
The server process receives some form of notification and needs to display the User Interface (UI) in the current user"s context.
The server must get the current user"s token. The service then must duplicate the token into the server process (client process relative to TS) for the given session identifier, which the server process can give to TS. In this case, the server process must be running as SYSTEM.
The server process receives some form of notification and needs to display the UI, but it doesn"t have to be in the current user"s context.
In this case, the server process can duplicate its primary process token and change the session identifier to the current session identifier. The current session identifier can be obtained by using WTSGetActiveConsoleSessionID. "
← →
Андрей2 (2004-04-27 15:51) [18]Чего-то я MSDN не понимаю. Либо задачка слишком сложная передо мной встала, либо я тупой... А Вы кроме MSDN-а почему-то предложить ничего не можете... Я уже задумался над тем, что вызов функции WTS не так оформляю. Тогда хоть в этом мне помогите - напишите как правильно вызывать! (только прежде чем писать ответ на своём опыте убедитесь - выполните этот вызов сами, и в случае успеха ВЫКЛАДЫВАЙТЕ!)
← →
Игорь Шевченко © (2004-04-27 16:12) [19]
> Тогда хоть в этом мне помогите - напишите как правильно
> вызывать! (только прежде чем писать ответ на своём опыте
> убедитесь - выполните этот вызов сами, и в случае успеха
> ВЫКЛАДЫВАЙТЕ!)
Уважаемый, а с какой радости я должен решать Вашу проблему ? У нас договор о технической поддержке ?
← →
VMcL © (2004-04-27 16:48) [20]>>Андрей2 (27.04.04 15:51) [18]
Тебе сюда: http://tinyurl.com/2rhyz
← →
Burd (2004-05-06 20:50) [21]Игорю Шевченко:
А Вам ведь правильное замечание сделали: не знаете - зачем писать? Я над этой проблемой бьюсь третий день, а красивых решений еще не видел. Я пробовал работать с терминальными функциями, (правда не с этой, такими как WTSEnumerateSessions, WTSQuerySessionInformation и получал ошибку - запускающая програма не есть приложением Windows или MS-DOS - сервис (другими словами служба) все таки. И что прикажете делать. Умничать я тоже умею - не дурак, а сделать не могу.
← →
Игорь Шевченко © (2004-05-06 21:31) [22]Burd (06.05.04 20:50)
А я, собственно говоря, помочь пытался - вот, в MSDN топик нашел, даже не поленился, процитировал. Может, эта информация может чем-то помочь? Вроде как в MSDN специально написан этот путь, для того, чтобы сервис мог узнать учетную запись активного пользователя...
Что-то не так ?
Страницы: 1 вся ветка
Текущий архив: 2004.06.13;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.027 c