psutil.WindowsService.username() возвращает пустое значение

В моей машине с Win10 есть несколько служб, отображаемое имя которых заканчивается на "_5e11c". Консоль служб Windows сообщает, что все они входят в систему как локальная система. Тем не менее, для любого из них psutil.WindowsService.username() дает пустую строку, и если я запрашиваю процесс с помощью psutil.Process.username(), я получаю пользователя, на которого я вошел как:

>>> import psutil
>>>
>>> s = psutil.win_service_get("OneSyncSvc_5e11c")
>>> s
<WindowsService(name='OneSyncSvc_5e11c', display_name='Sync Host_5e11c') at 2203559523440>
>>> p = psutil.Process(s.pid())
>>> p
<psutil.Process(pid=8348, name='svchost.exe') at 2203559523160>
>>> p.username()
'FOO_PC\\BAR_USER'
>>> s.username()
''
>>>

В чем дело?

1 ответ

Решение

Способ работы psutil.WindowsService и psutil.Process немного отличается, но одна полезная функция, которую они совместно используют - as_dict()

Используя это, информация, которую я получил, была более многословна:

{'username': '', 'start_type': 'automatic', 'display_name': 'Sync 
Host_11e740b', 'name': 'OneSyncSvc_11e740b', 'binpath': 'C:\\WINDOWS\\sy
stem32\\svchost.exe -k UnistackSvcGroup', 'pid': 6492, 'status': 'running', 
'description': 'This service synchronizes mail, contacts, calendar and
various other user data. Mail and other applications dependent on 
this functionality will not work properly when this service is
not running.'}

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

список других сервисов, которые работают под той же группой

Если вы проверяете имя пользователя для чего-либо, работающего под UnistackSvcGroup, все они возвращаются без имени пользователя.

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

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

Это также объясняется в комментариях @eryksun:

"OneSyncSvc_*" - это новый тип службы в Windows 10 - экземпляр службы для каждого пользователя, работающий в общем процессе (т. Е. SERVICE_USER_SERVICE | SERVICE_WIN32_SHARE_PROCESS | SERVICE_USERSERVICE_INSTANCE) как пользователь в сеансе пользователя вместо того, чтобы работать изолированно в сеансе 0 в качестве системы. или учетной записи службы. Кажется, что все экземпляры службы в процессе svchost имеют суффикс с одинаковым LUID (локально уникальный идентификатор)

Существует также шаблон пользовательского сервиса "OneSyncSvc" (т.е. SERVICE_USER_SERVICE | SERVICE_WIN32_SHARE_PROCESS), определенный в "HKLM\System\CurrentControlSet\Services". Вы можете запросить его конфигурацию в командной строке через sc qc OneSyncSvc "

Другие вопросы по тегам