Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Имя пользователя при запуске приложения сервисом / 24 сообщений из 24, страница 1 из 1
18.06.2018, 18:39
    #39662121
чччД__
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имя пользователя при запуске приложения сервисом
Приложение запускается сервисом.
Запрос GetUserName() к Windows возвращает строку "система", что верно. Это под моей Win7 Pro (rus).
Подозреваю, что при работе с другими ОС (и языковыми настройками) значение будет иным.

Вопрос: как достоверно определить, что программы работает именно под юзером "система"?
...
Рейтинг: 0 / 0
18.06.2018, 18:47
    #39662123
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имя пользователя при запуске приложения сервисом
чччД__Подозреваю, что при работе с другими ОС (и языковыми настройками) значение будет инымПравильно подозреваешь
чччД__Вопрос: как достоверно определить, что программы работает именно под юзером "система"?А тебе зачем? А если я создам пользователя ServiceRunner и буду все службы запускать от него - все пропало?

Какая задача решается?
...
Рейтинг: 0 / 0
18.06.2018, 18:54
    #39662125
чччД__
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имя пользователя при запуске приложения сервисом
_Vasilisk_...
чччД__Вопрос: как достоверно определить, что программы работает именно под юзером "система"?А тебе зачем? А если я создам пользователя ServiceRunner и буду все службы запускать от него - все пропало?

Какая задача решается?

2. Ну, логи хочу в файлик направлять, а не в окошко.
1. Да, все пропало, выходит. Нужно как-то грамотно вычислить, что графическая подсистема недоступна, чтобы (см.2)
0. Можно, конечно, при запуске приложения сообщать ему, что "из-под сервиса", что ли (ключ в командной строке. например)...
...
Рейтинг: 0 / 0
18.06.2018, 18:58
    #39662127
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имя пользователя при запуске приложения сервисом
чччД__Вопрос: как достоверно определить, что программы работает именно под юзером "система"?

Ну, если не начинать дебаты "а назачем", то, например, GetUserNameEx(NameUniqueId). Можно
пойти дальше до
https://stackoverflow.com/questions/251248/how-can-i-get-the-sid-of-the-current-windows-account
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
18.06.2018, 19:11
    #39662131
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имя пользователя при запуске приложения сервисом
18.06.2018 18:54, чччД__ пишет:
> 2. Ну, логи хочу в файлик направлять, а не в окошко.

вот до чего доводит отсутствие контрацепции при общении с "великим оптимизатором"...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
18.06.2018, 19:18
    #39662134
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имя пользователя при запуске приложения сервисом
Ну можешь проверять кто запустил (т.е. породивший
процесс, а не юзернейм). Хотя и это не 100%, наверное.

чччД> 2. Ну, логи хочу в файлик направлять, а не в окошко.

Всегда направляй в файл, а в GUI-варианте форма пусть
просто читает из соотв. файла.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
18.06.2018, 19:26
    #39662139
чччД__
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имя пользователя при запуске приложения сервисом
Гаджимурадов Рустам...
Всегда направляй в файл, а в GUI-варианте форма пусть
просто читает из соотв. файла.

...надо сперва узнать, какой вариант использовать - gui или нет.
...
Рейтинг: 0 / 0
18.06.2018, 19:28
    #39662140
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имя пользователя при запуске приложения сервисом
чччД__....надо сперва узнать, какой вариант использовать - gui или нет.

Можно попробовать сначала GetProcessWindowStation(), а потом
GetUserObjectInformation(UOI_FLAGS) и проверять WSF_VISIBLE.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
18.06.2018, 19:29
    #39662141
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имя пользователя при запуске приложения сервисом
чччД> ...надо сперва узнать, какой вариант использовать - gui или нет.

Не надо. Всегда в файл, а в GUI-варианте юзер откроет форму.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
18.06.2018, 20:55
    #39662166
Дегтярев Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имя пользователя при запуске приложения сервисом
Мимопроходящийвот до чего доводит отсутствие контрацепции при общении с "великим оптимизатором"...

бгг, про него же подумал
...
Рейтинг: 0 / 0
19.06.2018, 09:19
    #39662275
goldmi45
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имя пользователя при запуске приложения сервисом
чччД__, в win7 и выше сервис не может взаимодействовать с рабочим столом. Соответственно, не нужно определять под кем работает приложение. Нужно определить, запущено приложение как сервис или нет.
...
Рейтинг: 0 / 0
19.06.2018, 09:29
    #39662281
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имя пользователя при запуске приложения сервисом
goldmi45чччД__, в win7 и выше сервис не может взаимодействовать с рабочим столом. Соответственно, не нужно определять под кем работает приложение. Нужно определить, запущено приложение как сервис или нет. хм, не вникал глубоко
но, ради истины, например, одна из программ Руссиновича вполне позволяет это сделать:
Код: plaintext
PsExec64.exe -i -d -s regedit

хотя конечно это не гуд, сервисы не должны использовать гуи без крайне крайней необходимости
...
Рейтинг: 0 / 0
19.06.2018, 09:44
    #39662291
чччД__
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имя пользователя при запуске приложения сервисом
goldmi45, kealon(Ruslan),

- и откуда вы, такие умные?
...
Рейтинг: 0 / 0
19.06.2018, 11:38
    #39662347
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имя пользователя при запуске приложения сервисом
чччД__,

По идее можно посмотреть имя процесса-родителя. Если это services.exe - то мы в режиме сервиса. Сервисы в системе запускает имено он.
...
Рейтинг: 0 / 0
19.06.2018, 11:45
    #39662352
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имя пользователя при запуске приложения сервисом
чччД__Нужно как-то грамотно вычислить, что графическая подсистема недоступна, чтобы (см.2)Вот с этого и начинай.

Попробуй так

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
function IsGUIAvailable: Boolean;
var
  Buf: PWTS_CONNECTSTATE_CLASS;
  Len: Cardinal;
begin
  Win32Check(WTSQuerySessionInformation(
    WTS_CURRENT_SERVER_HANDLE,
    WTS_CURRENT_SESSION,
    WTSConnectState,
    Buf,
    Len
  ));
  try
    Result := Buf^ = WTSActive;
  finally
    WTSFreeMemory(Buf);
  end;
end;
...
Рейтинг: 0 / 0
19.06.2018, 13:12
    #39662410
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имя пользователя при запуске приложения сервисом
DarkMaster> По идее можно посмотреть имя процесса-родителя.
DarkMaster> Если это services.exe - то мы в режиме сервиса.

Я это ему выше и подсказал. Но он, редиска, поиздеваться любит.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.06.2018, 13:13
    #39662414
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имя пользователя при запуске приложения сервисом
_Vasilisk_,

Я для этой цели такую портянку когда-то написал. Мне помогло:

Код: 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.
function IsService( var bIsService: BOOL; var dwError: DWORD ): BOOL;
type
  LONG = LongInt;

  LUID = record
    LowPart:  DWORD;
    HighPart: LONG;
  end;

  TOKEN_TYPE = TTokenType;
  SECURITY_IMPERSONATION_LEVEL = ( SecurityAnonymous, SecurityIdentification, SecurityImpersonation, SecurityDelegation );

  TOKEN_STATISTICS = record
    TokenId:            LUID;
    AuthenticationId:   LUID;
    ExpirationTime:     LARGE_INTEGER;
    TokenType:          TOKEN_TYPE;
    ImpersonationLevel: SECURITY_IMPERSONATION_LEVEL;
    DynamicCharged:     DWORD;
    DynamicAvailable:   DWORD;
    GroupCount:         DWORD;
    PrivilegeCount:     DWORD;
    ModifiedId:         LUID;
  end;
const
  SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority = ( Value: ( 0, 0, 0, 0, 0, 5 ) );
  SECURITY_SERVICE_RID = 6;

  SYSTEM_LUID:          LUID = ( LowPart: $3E7; HighPart: $0 );
  ANONYMOUS_LOGON_LUID: LUID = ( LowPart: $3E6; HighPart: $0 );
  LOCALSERVICE_LUID:    LUID = ( LowPart: $3E5; HighPart: $0 );
  NETWORKSERVICE_LUID:  LUID = ( LowPart: $3E4; HighPart: $0 );

  function EqualLuid( const l1, l2: LUID ): Boolean;
  begin
    Result := ( l1.LowPart = l2.LowPart ) and ( l1.HighPart = l2.HighPart );
  end;

var
  hToken: THandle;
  dwSize: DWORD;
  ts: TOKEN_STATISTICS;
begin
  Result := False;
  if not OpenProcessToken( GetCurrentProcess, TOKEN_QUERY or TOKEN_QUERY_SOURCE, hToken ) then begin
    dwError := GetLastError;
    Exit;
  end;

  try
    dwSize := 0;
    if not GetTokenInformation( hToken, TokenStatistics, @ts, sizeof( ts ), dwSize )  then begin
      dwError := GetLastError;
      Exit;
    end;

    Result := True;
    bIsService := EqualLuid( ts.AuthenticationId, SYSTEM_LUID )
                  or
                  EqualLuid( ts.AuthenticationId, LOCALSERVICE_LUID )
                  or
                  EqualLuid( ts.AuthenticationId, NETWORKSERVICE_LUID );
  finally
    CloseHandle( hToken );
  end;
end;

...
Рейтинг: 0 / 0
19.06.2018, 13:18
    #39662422
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имя пользователя при запуске приложения сервисом
Проктостоматологи.

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

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

По моим ссылкам выше всё описано.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.06.2018, 13:19
    #39662425
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имя пользователя при запуске приложения сервисом
YuRock
Код: pascal
1.
2.
3.
4.
5.
    bIsService := EqualLuid( ts.AuthenticationId, SYSTEM_LUID )
                  or
                  EqualLuid( ts.AuthenticationId, LOCALSERVICE_LUID )
                  or
                  EqualLuid( ts.AuthenticationId, NETWORKSERVICE_LUID );

_Vasilisk_А если я создам пользователя ServiceRunner и буду все службы запускать от него - все пропало?
...
Рейтинг: 0 / 0
19.06.2018, 13:21
    #39662428
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имя пользователя при запуске приложения сервисом
Dimitry SibiryakovТо, что приложение запущено из сервиса, не означает невозможности вывести пользователю
сообщение - сервис мог подключиться к оконной станции пользователя.Именно. Поэтому я решаю проблему именно доступности GUI
...
Рейтинг: 0 / 0
19.06.2018, 13:22
    #39662429
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имя пользователя при запуске приложения сервисом
_Vasilisk_А если я создам пользователя ServiceRunner и буду все службы запускать от него - все пропало?
Не знаю :)
...
Рейтинг: 0 / 0
19.06.2018, 13:30
    #39662441
чччД__
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имя пользователя при запуске приложения сервисом
Гаджимурадов РустамчччД> ...надо сперва узнать, какой вариант использовать - gui или нет.

Не надо. Всегда в файл, а в GUI-варианте юзер откроет форму.

Во-первых, переделывать не хочется и все давно работает.
Во-вторых, сие лишь частный случай.

Например, сервис стартует мое приложение, которое генерит MS Excel файлы. Раньше ("в соответствии с ТЗ") созданные файлы "автоматически" открывались в приложении, ассоциированном с .xls/.xlsx.
Теперь, если их открыть, иксель/опенофис/... просто будет висеть в процессах, никто созданную красоту не увидит.

В-третьих, да, может и не из-под сервиса.
Т.е., все же чччД__...Нужно как-то грамотно вычислить, что графическая подсистема недоступна...
...
Рейтинг: 0 / 0
19.06.2018, 13:44
    #39662454
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имя пользователя при запуске приложения сервисом
Ну тогда вон Василиск тебе выше подсказал.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.06.2018, 13:58
    #39662467
чччД__
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имя пользователя при запуске приложения сервисом
Гаджимурадов РустамНу тогда вон Василиск тебе выше подсказал.

Да я все вижу, я обеда жду.
Потом с новыми силами начну пытаться.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Имя пользователя при запуске приложения сервисом / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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