Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Иконка в трее для службы / 25 сообщений из 29, страница 1 из 2
07.12.2018, 17:25
    #39744484
tarakan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иконка в трее для службы
Здравствуйте.
Задался вопросом как сделать иконку в трее для СЛУЖБЫ. Прошу отказаться от высказываний типа : «Это неблагодарное дело, службы не работают с рабочим столом». Есть код
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
 
begin
  if InstallingMyService then
    begin
      SaveLog('Будет запущено служба');
      Vcl.SvcMgr.Application.initialize;
      FmMainU.IsService := True;
      Vcl.SvcMgr.Application.CreateForm(TFmMain, FmMain);
      //Application.CreateForm(TFmMain, FmMain);
      Vcl.SvcMgr.Application.CreateForm(TService3, Service3);
      Vcl.SvcMgr.Application.run;
      //FmMain.AddIcon;
    end
  else
    begin
      SaveLog('Будет запущено приложение');
      Vcl.Forms.Application.ShowMainForm := True;
      Vcl.Forms.Application.Initialize;
      FmMainU.IsService := false;
      Vcl.Forms.Application.CreateForm(TFmMain, FmMain);
      Vcl.Forms.Application.CreateForm(TService3, Service3);
      Vcl.Forms.Application.Run;
    end;
end.


Общеизвестная проблема в том, что служба запускается от другого пользователя (В случае Windows 7 – это пользователь : «СИСТЕМА») и не знает на каком Desktop рисовать иконку.
Есть функция
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
//  Каллбэк вызываемый в случае запуска сервиса под W2K.
//  Его задача получить токен любого доступного процесса,
//  окна которого найдены в рамках заданного при перечислении десктопа.
// =============================================================================
function EnumDesktopWindowsCallback(
  WndHandle: THandle; Param: LPARAM): BOOL; stdcall;
var
  ProcessID: DWORD;
  ProcessHandle, UserToken: THandle;
begin
  Result := True;
  GetWindowThreadProcessId(WndHandle, ProcessID);
  ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessID);
  if ProcessHandle <> 0 then
  try
    if OpenProcessToken(ProcessHandle, TOKEN_ALL_ACCESS, UserToken) then
    begin
      PDWORD(Param)^ := UserToken;
      Result := False;
    end;
  finally
    CloseHandle(ProcessHandle);
  end;
end;


План такой : По запуску службы запустить функцию поиска активного десктопа и на нем нарисовать иконку.
Не могу в коде это все соединить в одно целое. Нужна помощь знатоков.
...
Рейтинг: 0 / 0
07.12.2018, 17:59
    #39744508
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иконка в трее для службы
tarakanПлан такой : По запуску службы запустить функцию поиска активного десктопа и на нем
нарисовать иконку.

Обломись: нет понятия "активного десктопа", они все одинаковые.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
07.12.2018, 18:09
    #39744510
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иконка в трее для службы
авторВ случае Windows 7 – это пользователь : «СИСТЕМА»
запустить можно и могут под любым пользователем, у которого есть права. насколько я знаю, то в win 7 сервисам доступен только скрытый десктоп, то есть до любого пользовательского десктопа доступа нет.
...
Рейтинг: 0 / 0
07.12.2018, 21:02
    #39744564
goldmi45
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иконка в трее для службы
tarakanЗадался вопросом как сделать иконку в трее для СЛУЖБЫ.
Не озвучено, для чего такое надо. Если для того, чтобы управлять службой, то проще сделать отдельное приложение, которое будет общаться со службой.
...
Рейтинг: 0 / 0
07.12.2018, 21:44
    #39744571
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иконка в трее для службы
tarakanПлан такой : По запуску службы запустить функцию поиска активного десктопа и на нем нарисовать иконку.
Рисуй на все десктопы.
...
Рейтинг: 0 / 0
07.12.2018, 22:41
    #39744578
Фэйтл Эра
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иконка в трее для службы
Мне как-то в одном приложении нужно было отследить, когда юзер выходит из системы и снова входит в систему. Ну вот, винда рассылает приложениям соответствующие сообщения. А приложение, в свою очередь, может известить об этом твой сервис. То есть, нужно автостартующее приложение, под каждым юзером.
С другой стороны, если городить такой гемор - пусть уж тогда приложение и рисует в трее...
...
Рейтинг: 0 / 0
07.12.2018, 23:06
    #39744589
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иконка в трее для службы
Фэйтл ЭраНу вот, винда рассылает приложениям соответствующие сообщения. А приложение, в свою
очередь, может известить об этом твой сервис.

ЕМНИП, винда и службам рассылает извещения о входе-выходе.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
07.12.2018, 23:18
    #39744593
Relic Hunter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иконка в трее для службы
tarakan,
...
Рейтинг: 0 / 0
07.12.2018, 23:22
    #39744594
Relic Hunter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иконка в трее для службы
Делали иконки в трее для служб и много раз. Процедура ничем не отличается от десктопного приложения. См. пост выше.

tarakan«Это неблагодарное дело, службы не работают с рабочим столом»
...
Рейтинг: 0 / 0
07.12.2018, 23:39
    #39744603
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иконка в трее для службы
Relic Hunter,

Это не работает, начиная с Wsndows Vista (или с 7й).
...
Рейтинг: 0 / 0
08.12.2018, 03:49
    #39744640
asutp2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иконка в трее для службы
alekcvpRelic Hunter,

Это не работает, начиная с Wsndows Vista (или с 7й).Все правильно, начиная с висты служба не может сама взаимодействовать с рабочим столом.

Решение - для размещения иконки в трее, а также для всяких диалоговых окон необходимо использовать дополнительное обычное десктопное приложение. Служба должна обмениваться с этим приложением, протокол обмена - на усмотрение. Можно через tcp/ip, можно через проецируемые файлы и т.д. Я использовал сетевой обмен через Indy, удобно тем, что десктопная программа может запускаться на любом компе, а не только там, где служба.
...
Рейтинг: 0 / 0
08.12.2018, 15:54
    #39744735
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иконка в трее для службы
Relic Hunter,

делали. до висты.
...
Рейтинг: 0 / 0
08.12.2018, 15:57
    #39744736
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иконка в трее для службы
asutp2,

У нас именно так. мы, правда, до локалхоста, наоборот, ограничивали. В Indy есть полезные компонент для подобных вещей: TIdCmdTCPServer, TIdCmdTCPClient.
...
Рейтинг: 0 / 0
08.12.2018, 20:30
    #39744781
MaratIsk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иконка в трее для службы
tarakan,
маяться ерундой, лишь бы не работать
...
Рейтинг: 0 / 0
09.12.2018, 13:18
    #39744903
tarakan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иконка в трее для службы
Спасибо всем, что откликнулись.
Dimitry SibiryakovОбломись: нет понятия "активного десктопа", они все одинаковые.

Ну не надо придираться к словам, смысл все поняли.
goldmi45 Не озвучено, для чего такое надо. Если для того, чтобы управлять службой, то проще сделать отдельное приложение, которое будет общаться со службой.
Да, для управления, просмотра состояния и еще пара моментов.
Такое решение у меня сейчас в приоритете, но…
а) не хотелось бы грузить машину несколькими процессами.
б) Предполагается что залогиненный (активный) пользователь будет работать с ограниченными правами до нельзя, даже скажу больше, компьютер будет работать в автономном режиме без пользователя. А приложение(служба) должна иметь полные права Администратора.

MaratIskмаяться ерундой, лишь бы не работать
Ну если Вы маятесь, то мы нет. А не то, что некоторые суперкодеры нагородят кучу приложений, служб и еще всякой хрени, потом это все глючит. И у таких кодеров только одна задача доказать заказчику, что он дебил и комп у него дохлый, а он суперкодер, который не «мается ерундой»
...
Рейтинг: 0 / 0
09.12.2018, 13:37
    #39744911
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иконка в трее для службы
tarakanкомпьютер будет работать в автономном режиме без пользователя

А на иконку в трее будет любоваться... кто?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
09.12.2018, 15:44
    #39744946
asutp2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иконка в трее для службы
tarakanПредполагается что залогиненный (активный) пользователь будет работать с ограниченными правами до нельзя, даже скажу больше, компьютер будет работать в автономном режиме без пользователя. А приложение(служба) должна иметь полные права Администратора.так это не проблема. У службы настраиваете свои права, у приложения свои - это же разные exe-шники.
...
Рейтинг: 0 / 0
09.12.2018, 15:50
    #39744947
Фэйтл Эра
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иконка в трее для службы
tarakanИ у таких кодеров только одна задача доказать заказчику, что он дебил и комп у него дохлый, а он суперкодер, который не «мается ерундой»
Заказчик, наверное, много платит, если ты который день ерундой страдаешь. Можно на эти деньги было комп проапгрейдить, но он же "дебил"...
...
Рейтинг: 0 / 0
09.12.2018, 15:51
    #39744948
tarakan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иконка в трее для службы
asutp2так это не проблема. У службы настраиваете свои права, у приложения свои - это же разные exe-шники.
Вопрос и сводиться к тому, чтобы один exe запускался с разными правами.
...
Рейтинг: 0 / 0
09.12.2018, 15:53
    #39744951
tarakan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иконка в трее для службы
Фэйтл ЭраtarakanИ у таких кодеров только одна задача доказать заказчику, что он дебил и комп у него дохлый, а он суперкодер, который не «мается ерундой»
Заказчик, наверное, много платит, если ты который день ерундой страдаешь. Можно на эти деньги было комп проапгрейдить, но он же "дебил"...
Если бы комп был один, то не проблема, а т.к. их 300, то...
...
Рейтинг: 0 / 0
09.12.2018, 18:13
    #39744984
asutp2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иконка в трее для службы
tarakanasutp2так это не проблема. У службы настраиваете свои права, у приложения свои - это же разные exe-шники.
Вопрос и сводиться к тому, чтобы один exe запускался с разными правами.поясни
...
Рейтинг: 0 / 0
09.12.2018, 18:16
    #39744987
tarakan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иконка в трее для службы
asutp2поясни
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
//  Непосредственно запуск уведомляющего приложения,
//  в контексте интерактивного десктопа
// =============================================================================
function ShowNotify(const Value: string): DWORD;
const
  WINDOW_STATION_NAME = 'Winsta0';
  APPLICATION_DESKTOP_NAME = 'Default';
var
  hLib: THandle;
  hCurrentWinStation, hInteractiveWorkstation: HWINSTA;
  hDefaultDesktop: HDESK;
  SI: TStartupInfo;
  PI: TProcessInformation;
  SessionId: DWORD;
  hInteractiveToken: THandle;
  WTSQueryUserToken: TWTSQueryUserToken;
begin
  Result := NO_ERROR;
  hInteractiveToken := INVALID_HANDLE_VALUE;
  if (Win32MajorVersion = 5) and (Win32MinorVersion = 0) then
  begin
    // В случае W2K
    hCurrentWinStation := GetProcessWindowStation;
    // Открываем рабочую станцию пользователя
    hInteractiveWorkstation := OpenWindowStation(
      PChar(WINDOW_STATION_NAME), False, MAXIMUM_ALLOWED);
    if hInteractiveWorkstation = 0 then Exit;
    try
      // Подключаем к ней наш процесс
      if not SetProcessWindowStation(hInteractiveWorkstation) then Exit;
      try
        // Открываем интерактивный десктоп
        hDefaultDesktop := OpenDesktop(PChar(APPLICATION_DESKTOP_NAME),
          0, False, MAXIMUM_ALLOWED);
        if hDefaultDesktop = 0 then Exit;
        try
          // Перечисляем окна десктопа с целью извлечь
          // токен залогиненного пользователя
          EnumDesktopWindows(hDefaultDesktop, @EnumDesktopWindowsCallback,
            Integer(@hInteractiveToken));
        finally
          CloseDesktop(hDefaultDesktop);
        end;
      finally
        SetProcessWindowStation(hCurrentWinStation);
      end;
    finally
      CloseWindowStation(hInteractiveWorkstation);
    end;
  end
  else
  begin
    // В случае Windows ХР и выше подгружаем библиотеку
    hLib := LoadLibrary('Wtsapi32.dll');
    if hLib > HINSTANCE_ERROR then
    begin
      // Получаем адрес функции WTSQueryUserToken
      @WTSQueryUserToken := GetProcAddress(hLib, 'WTSQueryUserToken');
      if Assigned(@WTSQueryUserToken) then
      begin
        // Получаем ID сессии в рамках которой
        // ведет работу залогиненый пользователь
        SessionID := WTSGetActiveConsoleSessionId;
        // Получаем токен пользователя
        WTSQueryUserToken(SessionID, hInteractiveToken);
      end;
    end;
  end;
  if hInteractiveToken = INVALID_HANDLE_VALUE then
  begin
    Result := GetLastError;
    Exit;
  end;
  // После того как токен получен - производим запуск самого себя
  // с параметром notify и параметрами, которые необходимо отобразить
  try
    ZeroMemory(@SI, SizeOf(TStartupInfo));
    SI.cb := SizeOf(TStartupInfo);
    SI.lpDesktop := PChar(WINDOW_STATION_NAME + '\' +
      APPLICATION_DESKTOP_NAME);
    if not CreateProcessAsUser(hInteractiveToken,
      PChar(ParamStr(0)),
      PChar('"' + ParamStr(0) + '" -notify ' + Value), nil, nil, False,
      NORMAL_PRIORITY_CLASS, nil, nil, SI, PI) then
      Result := GetLastError;
  finally
    CloseHandle(hInteractiveToken);
  end;
end;


Так понятно?
...
Рейтинг: 0 / 0
09.12.2018, 19:43
    #39744996
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иконка в трее для службы
tarakanТак понятно?

Это точно противоречит тому, что ты говорил раньше о "компьютерах за которыми никто не сидит".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
09.12.2018, 19:45
    #39744998
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иконка в трее для службы
tarakanПредполагается что залогиненный (активный) пользователь будет работать с ограниченными
правами до нельзя

Если ты знаешь как ограничить пользователю право использования TCP/IP подключения к
localhost - поделись, а то я не в курсе.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
09.12.2018, 20:11
    #39745005
tarakan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иконка в трее для службы
Dimitry Sibiryakov,
А при чем здесь tcp???
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Иконка в трее для службы / 25 сообщений из 29, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]