psutil.WindowsService.username() returns 空白

psutil.WindowsService.username() returns blank

在我的 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()
''
>>>

怎么回事?

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 下检查任何 运行 的用户名,所有这些 return 都没有用户名。

使用列出的共享 PID 检查所有 运行 under/attached 到 svchost,所有服务都没有 return 用户名。你的代码没有问题。

单个进程与许多服务相关联,并且在您的帐户下 运行,但服务本身来自您的系统 运行。这就是为什么服务 return 没有用户名,而将这些服务附加到您的帐户的 svchost 本身却有。

这在@eryksun 的评论中也有解释:

""OneSyncSvc_*" 是 Windows 10 中的一种新服务类型 -- 共享进程中的每用户服务实例 运行(即 SERVICE_USER_SERVICE | SERVICE_WIN32_SHARE_PROCESS | SERVICE_USERSERVICE_INSTANCE) 作为用户会话中的用户,而不是作为 SYSTEM 或服务帐户在会话 0 中隔离的 运行。看起来 svchost 进程中的所有服务实例都以相同的 LUID 为后缀(本地唯一 ID)

“HKLM\System\CurrentControlSet\Services”中还定义了一个“OneSyncSvc”用户服务模板(即 SERVICE_USER_SERVICE | SERVICE_WIN32_SHARE_PROCESS)。您可以通过 sc qc OneSyncSvc "

在命令行上查询其配置