Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с ActiveX из NT сервиса, Одни ActiveXы работают, другие нет. 
:(
    Опции темы
Felan
Дата 15.2.2008, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 2.8.2007
Где: Самара

Репутация: 2
Всего: 7



Цитата(Virtuals @  15.2.2008,  12:00 Найти цитируемый пост)
OldDescUser := OpenInputDesktop(0, FALSE, MAXIMUM_ALLOWED);
поменять на
OldDescUser :=GetThreadDesktop(ThreadId);

Это уже я так сделал. В оригинале было //  OldDescUser := OpenDesktop('default', 0, FALSE, MAXIMUM_ALLOWED);

Цитата(Virtuals @  15.2.2008,  12:00 Найти цитируемый пост)
где ThreadId это Ид потока в процессе терминального пользователя

Это понятно. Вот как его определить, в этом и вопрос. Не вкуриваю я великий смысл :( :( :(

Цитата(Virtuals @  15.2.2008,  12:00 Найти цитируемый пост)
у сервиса станция произвольная!!!
у пользователей, сейчас гляну... 

У сервиса да, а у пользователя всегда Winsta0.


Цитата(Virtuals @  15.2.2008,  12:16 Найти цитируемый пост)
у пользователей (интерактивных, тоесть если использовать быстрое переключение в вин_хр) станция\стол 
ВСЕГДА winsta0\default  smile  smile  smile  smile 

Это ты где вычитал? Я че-то про стол не нашел... или понял чего не так... Как я понял, что стол как раз може меняться, и будет это как раз тогда, когад используется "быстрое" переключение. У старого пользователя стрый рабочий стол остается, а у нового - новый.


Цитата(Virtuals @  15.2.2008,  12:16 Найти цитируемый пост)
станция строится на основе сессии пользователя, тоесть дерево такое...
сессия-станция-стол.

отсюда...

столы изолированны друг от друга в пределах станции

станции изолированны друг от друга в пределах сессии

все я сломал моск, пошел учить матчасть. 

Как так? где написано? Я думал станция - стол - сессия...



--------------------
// Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного.
PM MAIL WWW ICQ   Вверх
Virtuals
Дата 15.2.2008, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 476
Регистрация: 27.11.2006

Репутация: 4
Всего: 11



Цитата(Felan @  15.2.2008,  10:59 Найти цитируемый пост)
Это уже я так сделал. В оригинале было //  OldDescUser := OpenDesktop('default', 0, FALSE, MAXIMUM_ALLOWED);

про оригинал я вкурсе, мы на одинаковых форумах сидим smile 
Цитата(Felan @  15.2.2008,  10:59 Найти цитируемый пост)
Это понятно. Вот как его определить, в этом и вопрос. Не вкуриваю я великий смысл :( :( :(

id processa я описал как получить, осталось по ид процесса, выдернуть ид одного из потоков желательно с окнами...
Цитата(Felan @  15.2.2008,  10:59 Найти цитируемый пост)
Это ты где вычитал? Я че-то про стол не нашел... или понял чего не так... Как я понял, что стол как раз може меняться, и будет это как раз тогда, когад используется "быстрое" переключение. У старого пользователя стрый рабочий стол остается, а у нового - новый.

это не вычитал это сам проверил!!!
У старого пользователя стрый рабочий стол остается, а у нового - новый. - я тоже так думал, а вот на тебе и не так оказалось
Код

function GetUserObjectName(hUserObject: THandle): string;
var
  Count: DWORD;
begin
  // have the the API function determine the required string length
  GetUserObjectInformation(hUserObject, UOI_NAME, PChar(Result), 0, Count);
  SetLength(Result, Count + 1);

  if GetUserObjectInformation(hUserObject, UOI_NAME, PChar(Result), Count, Count) then
    StrResetLength(Result)
  else
    Result := '';
end;

...
  PrehWndS:= GetProcessWindowStation;
  Predesc:=GetThreadDesktop(GetCurrentThreadId);
form1.Caption:=  GetUserObjectName(PrehWndS)+'\'+GetUserObjectName(Predesc);


 smile 

Цитата(Felan @  15.2.2008,  10:59 Найти цитируемый пост)
Как так? где написано? Я думал станция - стол - сессия...

тоже методом напряжения моска, а как же тогда пользовательское приложение бродит со стола к столу+ может создавать новый стол...
(в этом месте могу ошибатся, моск уже не варит.)

ну и гулялка по столам


Это сообщение отредактировал(а) Virtuals - 15.2.2008, 12:21

Присоединённый файл ( Кол-во скачиваний: 13 )
Присоединённый файл  Create_Switch_Desktop.zip 8,81 Kb
PM MAIL ICQ   Вверх
Felan
Дата 15.2.2008, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 2.8.2007
Где: Самара

Репутация: 2
Всего: 7



Цитата(Virtuals @  15.2.2008,  14:17 Найти цитируемый пост)
id processa я описал как получить, осталось по ид процесса, выдернуть ид одного из потоков желательно с окнами...

А нафиг он нужен, если и так у пользователя всегда winsta0\default? Можно сразу к нему цепляться и все.


Цитата(Virtuals @  15.2.2008,  14:17 Найти цитируемый пост)
это не вычитал это сам проверил!!!
У старого пользователя стрый рабочий стол остается, а у нового - новый. - я тоже так думал, а вот на тебе и не так оказалось

Ну здорово, значит не надо за ними следить? В каком случае тогда происходит смена рабочего стола?


Цитата(Virtuals @  15.2.2008,  14:17 Найти цитируемый пост)
тоже методом напряжения моска, а как же тогда пользовательское приложение бродит со стола к столу+ может создавать новый стол...
(в этом месте могу ошибатся, моск уже не варит.)

Ну собственно так, что что они не являются вложенными объектами. Сессия это сессия, станция это станция, стол это стол.

Программку посмотрел... только вот глаза она мне не раскрыла :(. Описание всех этих функций я в MSDN видел. 

Пойми меня правильно, я не ставлю под сомнения твои слова и выводы, просто я надеялся, что у тебя есть какие-нибудь статейки где описана теория взаимодействия всего этого дела... А что в MSDN как-то все обрывочно... Вобщем пока что у меня после MSDN одна каша и никакого стройного понимания :(. 


--------------------
// Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного.
PM MAIL WWW ICQ   Вверх
Virtuals
Дата 15.2.2008, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 476
Регистрация: 27.11.2006

Репутация: 4
Всего: 11



Цитата

Ну собственно так, что что они не являются вложенными объектами. Сессия это сессия, станция это станция, стол это стол.

OpenInputDesktop
Remarks
The calling process must have an associated window station, either assigned by the system at process creation time or set by the SetProcessWindowStation function.
и еще из помощи...
Функция SetProcessWindowStation назначает станцию окна на процесс запроса. Это позволяет процесс к объектам(целям) доступа в станции окна типа рабочих столов, буфера вырезанного изображения, и глобальных атомов. Все последующие действия на станции окна используют права доступа, предоставленные hWinSta
.
а вот как мс реализовали смену пользователя без переключения столов, остается загадкой

(стол нам нужен позарез, так как сообщения гуляют только в пределах стола!)

но мне кажется что, самое реальное (да и самое простое) это подгружать в сессию пользователя приложение управляемое и контролируемои из сервиса

(нужен реестр порльзователя, скорее всего для ActiveX)
Цитата

В каком случае тогда происходит смена рабочего стола?

может в терминальных клиентах? (возможности проверить нет)
PM MAIL ICQ   Вверх
Felan
Дата 15.2.2008, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 2.8.2007
Где: Самара

Репутация: 2
Всего: 7



Цитата(Virtuals @  15.2.2008,  16:55 Найти цитируемый пост)
The calling process must have an associated window station, either assigned by the system at process creation time or set by the SetProcessWindowStation function.
и еще из помощи...

Ну правильно. У пользователя станция всегда winsta0. После того как ассоциируешь процесс сервиса с ней, эта функция вернет активный пользовательский десктоп.

Цитата(Virtuals @  15.2.2008,  16:55 Найти цитируемый пост)
Функция SetProcessWindowStation назначает станцию окна на процесс запроса. Это позволяет процесс к объектам(целям) доступа в станции окна типа рабочих столов, буфера вырезанного изображения, и глобальных атомов. Все последующие действия на станции окна используют права доступа, предоставленные hWinSta

Если честно, то нифига не понял... в оригинале можешь привести что ты хотел сказать? smile

Я что хочу сказать, что нет иерархии между станцией и сессией. Т.е. как я это понял после копания в MSDN.
Станция - это набор объектов отвечающих за безопастность, хранилище глобальных объектов (атому, токены и т.п... рабочие столы). 
Рабочий стол это глобальный объект для станции через который происходит взаимодействие с пользователем.
Пользователь работает в сессии, которая начинается при авторизации/аутентификации и заканчивается при логофе.

Т.о. сессия работает в пределах станции и может взаимодействовать с одним или несколькими рабочими столами.
Это, кстати, подтверждается твоей прогой!. КОгда делаешь новый стол, то на нем все дублируется (в добавление к уже созданным приложениям) и все это функционирует под одним пользователем!

Мда... Вот интересно, об этом почеловечески где-нибудь пишут?..

Цитата(Virtuals @  15.2.2008,  16:55 Найти цитируемый пост)
но мне кажется что, самое реальное (да и самое простое) это подгружать в сессию пользователя приложение управляемое и контролируемои из сервиса

Ну это еще одни слой... который будет полностью дублировать работу сервиса... Зачем тогда он нужен? Тогда вообще проще без сервиса. Просто в автозагрузку засунул прогу и все. :(

Цитата(Virtuals @  15.2.2008,  16:55 Найти цитируемый пост)
(нужен реестр порльзователя, скорее всего для ActiveX)

Вот это без сомнения... но как его подключить?


Цитата(Virtuals @  15.2.2008,  16:55 Найти цитируемый пост)
может в терминальных клиентах?

Возможно. Но там не интерактивные рабочие столы. Интерактивный только тот, на котором UI запущен для текущего локального пользователя.


--------------------
// Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного.
PM MAIL WWW ICQ   Вверх
Virtuals
Дата 15.2.2008, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 476
Регистрация: 27.11.2006

Репутация: 4
Всего: 11



Цитата(Felan @  15.2.2008,  15:19 Найти цитируемый пост)
 в оригинале можешь привести что ты хотел сказать?

 smile ctrl+f1 на функции. стол это дочерний обьект станции и отталкивается от прав станции

Цитата(Felan @  15.2.2008,  15:19 Найти цитируемый пост)
 КОгда делаешь новый стол, то на нем все дублируется (в добавление к уже созданным приложениям) и все это функционирует под одним пользователем!

 smile  не совсем так, точнее совсем не так
специально прога подгружает сама себя и смд+ слежение как смд закроется то возврат а сама прога для удобства скачков далее (представь что будет если создать стол, переключится на него и не дать на нем никаких инструментов smile поверь мне обратно только питание вырубать, 3кнопки не помогут таскменеджер будет на основном столе)
просто это в моей реализации... в реале можно указать безопасность, посмотри описание на CreateDesktop

Цитата(Felan @  15.2.2008,  15:19 Найти цитируемый пост)
Ну это еще одни слой... который будет полностью дублировать работу сервиса... Зачем тогда он нужен? Тогда вообще проще без сервиса. Просто в автозагрузку засунул прогу и все. :(

ну не знай не знай режим когда у пользователя висит приложение, активно контролируемое сервисом очень интересное решение, весь код в сервисе а приложение только транслирует команды от сессии пользователя + сервис постоянно контролирует свое приложение на предмет блокировок разных
(я имею ввиду не авторан дочернего приложения а рунас из сервиса) хотя это не самое элегантное решение

Цитата(Felan @  15.2.2008,  15:19 Найти цитируемый пост)
Вот это без сомнения... но как его подключить?
(про реестр пользователя)
вот он вроде как раз и грузится для сессии хотя не уверен но можно посмотреть...

ЗЫ кстати есть несколько инструментов для исследований в этом плане стучи в асю

Это сообщение отредактировал(а) Virtuals - 15.2.2008, 17:13
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0520 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.