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

Поиск:

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


Опытный
**


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

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



Проблема в следующем.
Есть чужая программа, которая, когда запущена, управляется через собственный ActiveX.

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

Из обычной программы все работает. Моя программа пытается создать управляющий ActiveX, если он не создается, значит чужая программа не запущена, если создается, то чужая программа запущена и ей можно управлять.

Но, проблема в том, что из под сервиса этот ActiveX недоступен, возвращается ошибка "Класс не зарегистрирован" независимо от того запущена или нет чужая программа.

Фабрика, которая создает ActiveX зарегистрирована в HKEY_LOCAL_MACHINE\..., и она, не доступна.

Сервис интерактивный. Мои собственные ActiveX, которые зарегистрированы то же в HKEY_LOCAL_MACHINE\... видит и работает с ними нормально.

Как мне получить доступ к ActiveX, который управляет чужой программой из под сервиса?

ЗЫЖ
Вот код, который работает из под обычной программы:
Код

function TiaSiteKioskApi.GetSiteKioskObject(var aSiteKiosk: ISiteKiosk3): Boolean;
var
  lr_SiteKioskFactory_ : ISiteKioskFactory;
  lr_ISiteKiosk_ : ISiteKiosk3;
  lr_IUnknown_ : IUnknown;
begin
  try
    CoInitialize(nil);
    GetSiteKioskObject := false;

    CoGetClassObject(CLASS_SiteKioskFactory, CLSCTX_LOCAL_SERVER, nil, IID_ISiteKioskFactory, lr_IUnknown_);
    // get interface of the SiteKioskClass-Factory
    if (lr_IUnknown_ = nil) then exit; // SiteKiosk is not running

    // convert the return value of type IUnknown to the needed interface
    lr_IUnknown_.QueryInterface(IID_ISiteKioskFactory, lr_SiteKioskFactory_);

    // get the interface of the running instance of SiteKiosk
    lr_SiteKioskFactory_.CreateSiteKiosk(IID_ISiteKiosk3, pointer(lr_ISiteKiosk_));
    if (lr_ISiteKiosk_ = nil) then exit;

    aSiteKiosk := lr_ISiteKiosk_;

    GetSiteKioskObject := true;
  finally
    CoUninitialize;
  end;
end;



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


Эксперт
***


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

Репутация: 8
Всего: 76



Felan, а сорцов этой ActiveX-ины естественно нету?


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Felan
Дата 13.2.2008, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Rennigth, Ясен пень :(

Есть только сорцы моих ActiveXов... ну так они работают...

Есть предположения, что это все из-за того, что она как-то хитро регистрируется, т.к. пока чужая прога не работает, ее реально нет... И есть подозрения, что все это происходит из-за того, что надо подключиться к правильной WindowsStation и Desktop... но вот со вчерашнего дня пытаюсь это дело сделать, ищу/читаю/пробую... Нифига не работает.

Добавлено через 1 минуту и 24 секунды
В чем может быть разница при регистрации ActiveX обычным способом через regSvr32, и при регистрации из запущенной программы...


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


Опытный
**


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

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




Почитав про виндос станции и рабочие столы, стал пробовать, как подключиться. Ничего не помогло. ActiveX стал доступен только когда сервис запускается под учеткой в которой залогонин я, и в которой запускается программа.

Появились такие вопросы:

1 Как настроить сервис на конкретную учетную запись под доменом?
Я делал так:

      vSchService := CreateService( vSchSCManager, ServiceName, ServiceDisplayName, SERVICE_ALL_ACCESS,
            SERVICE_WIN32_OWN_PROCESS, StartType, SERVICE_ERROR_NORMAL,
            vModulePath, nil, nil, nil, 'domen\user', 'password');


Если не указывать домен, то он даже не устанавливается ("Учетная запись не существует, или неверный пароль"), если домен указать, то он не запускается.

Но это в крайнем случае.

2 Какие условия должны выполняться для того, что бы сервис подключился к конкретной учетке и как это сделать автоматически? Т.е. что бы сервис сам ледил, если пользователь залогонился, то он входил с его учетной запиьсю?

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


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


Эксперт
***


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

Репутация: 8
Всего: 76



Felan, а не пробовал стартануть с парамертом lpServiceStartName NT AUTHORITY\LocalService 


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Felan
Дата 13.2.2008, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



То же самое. "Класс не зарегистрирован".


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


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



Цитата(Felan @  13.2.2008,  14:13 Найти цитируемый пост)
Если не указывать домен, то он даже не устанавливается ("Учетная запись не существует, или неверный пароль"), 
вместо домена точку ставь

Добавлено через 8 минут и 19 секунд
Цитата(Felan @  13.2.2008,  10:02 Найти цитируемый пост)
Сервис интерактивный
а где тут
Цитата(Felan @  13.2.2008,  14:13 Найти цитируемый пост)
vSchService := CreateService( vSchSCManager, ServiceName, ServiceDisplayName, SERVICE_ALL_ACCESS,
            SERVICE_WIN32_OWN_PROCESS, StartType, SERVICE_ERROR_NORMAL,
            vModulePath, nil, nil, nil, 'domen\user', 'password');
интерактивность?





--------------------
Обижено школьников: 8
PM MAIL   Вверх
Virtuals
Дата 13.2.2008, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(bems @  13.2.2008,  18:00 Найти цитируемый пост)
а где тутЦитата(Felan @  13.2.2008,  14:13 )vSchService := CreateService( vSchSCManager, ServiceName, ServiceDisplayName, SERVICE_ALL_ACCESS,            SERVICE_WIN32_OWN_PROCESS, StartType, SERVICE_ERROR_NORMAL,            vModulePath, nil, nil, nil, 'domen\user', 'password');интерактивность?


а зачем ему интерактивность если сервис в принудительном порядке садится на станция\ стол пользователя

Это сообщение отредактировал(а) Virtuals - 14.2.2008, 08:52
PM MAIL ICQ   Вверх
Felan
Дата 14.2.2008, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(bems @  13.2.2008,  20:00 Найти цитируемый пост)
а где тут
Цитата(Felan @  13.2.2008,  14:13 Найти цитируемый пост)
vSchService := CreateService( vSchSCManager, ServiceName, ServiceDisplayName, SERVICE_ALL_ACCESS,
            SERVICE_WIN32_OWN_PROCESS, StartType, SERVICE_ERROR_NORMAL,
            vModulePath, nil, nil, nil, 'domen\user', 'password');
интерактивность?

Здесь нет. Изначально была, но потом я пришел к тому, что
Цитата(Virtuals @  13.2.2008,  23:10 Найти цитируемый пост)
а зачем ему интерактивность если сервис в принудительном порядке садится на станция\ стол пользователя

и убрал интерактивность.


Цитата(Felan @  13.2.2008,  16:13 Найти цитируемый пост)
ActiveX стал доступен только когда сервис запускается под учеткой в которой залогонин я, и в которой запускается программа.

И при этом нужно подключиться к виндос станции и рабочему столу...

Я только не пойму, как правильно определить нужную станцию и стол...
Они же могут меняться для разных пользователей... при переключении пользователей...


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


Опытный
**


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

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



Цитата

Они же могут меняться для разных пользователей... при переключении пользователей...

так оно и будет!,
для станции пока не знаю, 
а для стола:
  descT:=GetThreadDesktop(ThreadId);
PM MAIL ICQ   Вверх
Felan
Дата 14.2.2008, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Так разве это не будет дескто который ассоциирован с потоком сервиса? Т.е. не обязательно пользовательским?


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


Опытный
**


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

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



чей ThreadId тот стол и получиш
тоесть находиш процесс пользователя,  получаеш ид потока и в путь
а вот со станцией заморочка...
я пока не знаю как получить ее

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

Это сообщение отредактировал(а) Virtuals - 14.2.2008, 19:16
PM MAIL ICQ   Вверх
Felan
Дата 15.2.2008, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну про станцию в MSDN нашел, что она всегда winsta0 будет. Только эта станция является интерактивной.
А вот как определить процесс пользователя?

Сейчас у меня вот так работает:
Код

function ConnectDesctop: Boolean;
begin
  Result := False;
  GetDesktopWindow();
  OldWinStation := GetProcessWindowStation;
  OldDesktop := GetThreadDesktop(GetCurrentThreadId);

  RpcImpersonateClient(nil);

  OldWinStationUser := OpenWindowStation('winsta0', false, MAXIMUM_ALLOWED);
  if (OldWinStationUser = 0) then
    begin
      RpcRevertToSelf;
      Exit;
    end;
  SetProcessWindowStation(OldWinStationUser);
//  OldDescUser := OpenDesktop('default', 0, FALSE, MAXIMUM_ALLOWED);
  OldDescUser := OpenInputDesktop(0, FALSE, MAXIMUM_ALLOWED);
  RpcRevertToSelf;
  if (OldDescUser = 0) then
  begin
    SetProcessWindowStation(OldWinStation);
    CloseWindowStation(OldWinStationUser);
    Exit;
  end;
  AllowAccessToObject(OldDescUser);
  SetThreadDesktop(OldDescUser);
  Result := True;
end;


Код нашел на форуме. Потом нашел оригинал в MSDN. Но все равно не совсем понимаю, как здесь получается ID потока пользователя.


Цитата(Virtuals @  14.2.2008,  21:01 Найти цитируемый пост)
ЗЫ кстати есть очень большое подозрение что актив икс не заработает все равно, вроде както связано с реестром пользователя!
разок тестил не прокатило, пошел другим путем, например можно свое приложение подсаживать в сессию пользователя (управляемое и контроллируемое сервисом)


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

Вот про сессии можешь рассказать? Как к ней подключиться? Похоже, что когда сервис логонится от имени пользователя он как раз и попадает в ту же сессию, т.к. в э том случае все работает... Хотелось бы сделать так, что бы это было автоматом, и что бы сервис не надо было настраивать... что бы он сам цеплялся куда надо...


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


Опытный
**


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

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



Цитата(Felan @  15.2.2008,  09:09 Найти цитируемый пост)
Код нашел на форуме. Потом нашел оригинал в MSDN. Но все равно не совсем понимаю, как здесь получается ID потока пользователя


OldDescUser := OpenInputDesktop(0, FALSE, MAXIMUM_ALLOWED);
поменять на
OldDescUser :=GetThreadDesktop(ThreadId);

где ThreadId это Ид потока в процессе терминального пользователя
получать скорее всего придется через
CreateToolhelp32Snapshot снимок процессов
Process32First, Process32Next перебор.
далее отловим ProcessID, и можно будет получать ThreadId

Цитата

что она всегда winsta0 будет


у сервиса станция произвольная!!!
у пользователей, сейчас гляну...
PM MAIL ICQ   Вверх
Virtuals
Дата 15.2.2008, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

блин знаний нехватает....
одно из двух
или мс используют какойто хитрый хук ушами
или

станция строится на основе сессии пользователя, тоесть дерево такое...
сессия-станция-стол.

отсюда...

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

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

все я сломал моск, пошел учить матчасть.
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.0830 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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