在我的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()
''
>>>
发生了什么事?
答案 0 :(得分:3)
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)作为用户会话中的用户而不是在Session中运行隔离0作为SYSTEM或服务帐户。看来svchost进程中的所有服务实例都带有相同的LUID(本地唯一ID)后缀
“HKLM \ System \ CurrentControlSet \ Services”中还定义了“OneSyncSvc”用户服务模板(即SERVICE_USER_SERVICE | SERVICE_WIN32_SHARE_PROCESS)。您可以通过sc qc OneSyncSvc“
在命令行上查询其配置