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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запуск приложения из сервиса Win 7 and later 
V
    Опции темы
kirillkr
Дата 9.7.2013, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый день.
Прошу прощения возможно за глупый вопрос.
Есть рабочее приложение-сервис, который устанавливается в систему и запускает заданные приложения. Сервис стартует под системной учетной записью с отключенной галкой разрешено взаимодействие с рабочим столом. Все приложения прекрасно стартуют и выполняются. Когда я авторизуюсь под любой учеткой в системе (локально) или в нулевую сессию удаленно - я вижу окна приложений которые сервисом стартовались.
НО!!! Все это прекрасно работает в версиях максимум XP,2003. Начиная (наверно с Vista -нет возможности проверить, в Windows 7 точно) и Windows Server 2008 окна не отображаются.

Прочитал http://msdn.microsoft.com/en-us/library/wi...5(v=vs.85).aspx
Попробовал установить галку Разрешить взаимодействие с рабочим столом - не помогло. Запуск сервиса под учеткой с которой я логинюсь на компе - аналогично - не появляется.

На форуме нашел http://forum.vingrad.ru/index.php?showtopi...t&p=2223868 но честно говоря не понял что именно из этого может мне помочь и как прикрутить это к моему коду.

Код

  try
    if Started then exit;
    InitiallyStarted := false;
    AMinimized := true;
    with TApplicationConfig.Create(ID) do try
      aExecutable := Executable;
      aCommandLine := CommandLine;
      aInteractive := Interactive;
      aUsername := Username;
      aPassword := Password;
    finally free end;
    ZeroMemory(@StartupInfo, sizeof(TStartupInfo));
    StartupInfo.cb := sizeof(TStartupInfo);
    if AInteractive then begin
      dskname := 'Winsta0\default';
      StartupInfo.lpDesktop := PChar(dskname);
      if AMinimized then StartupInfo.wShowWindow := SW_SHOWMINNOACTIVE // – отображает минимизированным и неактивным
      else StartupInfo.wShowWindow := SW_SHOWNA; // отображает окно неактивным в текущем размере и позиции
      StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
    end;
    if aUsername = '' then begin
      if not CreateProcess(PChar(aExecutable), PChar(aCommandLine), nil, nil,
          false, CREATE_NEW_CONSOLE, nil, nil, StartupInfo, ProcessInfo) then
        raise Exception.Create('CreateProcess: '+LastErrorMessage);
      InitiallyStarted := true;
    end

PM WWW ICQ Skype GTalk Jabber MSN   Вверх
kami
Дата 10.7.2013, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Цитата(kirillkr @  9.7.2013,  15:57 Найти цитируемый пост)
Попробовал установить галку Разрешить взаимодействие с рабочим столом - не помогло.

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

Цитата(kirillkr @  9.7.2013,  15:57 Найти цитируемый пост)
На форуме нашел

Вообще, там надо было смотреть метод таймера, из которого запускается cmd.
Давненько это было, но (емнип) мне тогда не удалось победить запуск приложения с полными правами - всё запускаемое имело ограниченный... вроде_бы_токен_не_помню_точно, причем - как изменить права "стандартными" методами - я так и не нашел. Всё в MSDN говорило о том, что это невозможно, несмотря на всяческие ухищрения (выложенный код - далеко не последняя попытка сотворить подобное).
Когда-то натыкался на код в MSDN, который вроде как позволял сделать запуск с правами админа, но - портированный в Delphi код так же не сработал, в итоге - я забил на это, т.к. появились другие задачи.

Если кто-то победил эту задачу (запуск из сервиса в сессии, винста и десктопе пользователя с правами админа) - было бы крайне интересно посмотреть на решение.
PM MAIL WWW   Вверх
kirillkr
Дата 22.10.2013, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В продолжении темы. Как из-под сервиса проверить не залогинен ли пользователь? Если еще ни один не залогинен, то сделать авторизацию по логину/паролю и получить его токен для запуска приложений в его сессии.
PM WWW ICQ Skype GTalk Jabber MSN   Вверх
kami
Дата 22.10.2013, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Цитата(kirillkr @  22.10.2013,  12:29 Найти цитируемый пост)
Как из-под сервиса проверить не залогинен ли пользователь?

WTSEnumerateSessions вроде как. Если есть сессия с SessionID<>0, то юзер залогинен. Но может быть такое, что этот юзер выполнил "Пуск" - "Сменить пользователя" и висит на Winlogon-десктопе.

Цитата(kirillkr @  22.10.2013,  12:29 Найти цитируемый пост)
Если еще ни один не залогинен, то сделать авторизацию по логину/паролю

Хммм. А как? Емнип, получить доступ к Winlogon-десктопу даже посложнее, чем к десктопу пользователя. Т.е. свое окошко авторизации на нем тяжеловасто поднять.
PM MAIL WWW   Вверх
kirillkr
Дата 22.10.2013, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(kami @  22.10.2013,  14:10 Найти цитируемый пост)
Емнип, получить доступ к Winlogon-десктопу даже посложнее, чем к десктопу пользователя. Т.е. свое окошко авторизации на нем тяжеловасто поднять. 

Зачем? Я имею ввиду что-нибудь типа LogonAsUser(aUserName, aPassword, aDomain).
Приложение Autologon (http://technet.microsoft.com/ru-ru/sysinternals/bb963905) позволяет автоматически входить в Windows без ввода логина и пароля, но она использует скрытые в реестре возможности. А как-нибудь через функцию это можно сделать?
PM WWW ICQ Skype GTalk Jabber MSN   Вверх
kami
Дата 22.10.2013, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Цитата(kirillkr @  22.10.2013,  14:35 Найти цитируемый пост)
А как-нибудь через функцию это можно сделать?

LogonUser + LOGON32_LOGON_INTERACTIVE ?
PM MAIL WWW   Вверх
kirillkr
Дата 23.10.2013, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(kami @  22.10.2013,  15:05 Найти цитируемый пост)
LogonUser + LOGON32_LOGON_INTERACTIVE ? 

Большое спасибо. Благодаря этой функции и этой статье сервис снова работает и на последних OS http://www.cromis.net/blog/2010/01/how-to-...windows-vista7/
PM WWW ICQ Skype GTalk Jabber MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0824 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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