Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python psutil.WindowsService.username()返回空白_Python_Windows_Service_Psutil - Fatal编程技术网

Python psutil.WindowsService.username()返回空白

Python psutil.WindowsService.username()返回空白,python,windows,service,psutil,Python,Windows,Service,Psutil,在我的Win10机器中,有几个服务的显示名称以“_5e11c”结尾。Windows服务控制台表示所有这些服务都以本地系统登录。但是,对于其中任何一个,psutil.WindowsService.username()会给出一个空字符串,如果我使用psutil.process.username()查询进程,我会得到作为以下身份登录的用户: >>> import psutil >>> >>> s = psutil.win_service_get("

在我的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 >>> >>>s=psutil.win\u service\u get(“OneSyncSvc\u 5e11c”) >>> >>>p=psutil.Process(s.pid()) >>>p >>>p.用户名() “FOO\u PC\\BAR\u用户” >>>美国用户名() '' >>>
发生了什么?

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的所有内容,所有服务都不会返回用户名。你的代码没有问题

单个进程与许多服务绑定,并在您的帐户下运行,但服务本身是从您的系统运行的。这就是为什么这些服务不返回用户名,而将这些服务附加到您的帐户的svchost本身却返回用户名

@eryksun的评论中也解释了这一点:

“OneSyncSvc_*”是Windows 10中的一种新服务类型--在共享进程中运行的每个用户的服务实例(即服务(u用户)服务|服务(u WIN32)共享|进程|服务(u用户)服务|实例)作为用户会话中的用户,而不是作为系统或服务帐户在会话0中独立运行。svchost进程中的所有服务实例似乎都以相同的LUID(本地唯一ID)作为后缀


“HKLM\System\CurrentControlSet\Services”中还定义了一个“OneSyncSvc”用户服务模板(即服务(用户)服务|服务(WIN32)共享(进程))。您可以通过sc qc OneSyncSvc在命令行上查询其配置。

“OneSyncSvc(进程)是Windows 10中的一种新服务类型--在共享进程中运行的每用户服务实例(即,
SERVICE_USER_SERVICE | SERVICE_WIN32_SHARE_PROCESS | SERVICE_USERSERVICE_INSTANCE
)作为用户会话中的用户,而不是作为系统或服务帐户在会话0中单独运行。svchost进程中的所有服务实例似乎都以相同的LUID(本地唯一ID)作为后缀。还有一个“OneSyncSvc”“HKLM\System\CurrentControlSet\Services”中定义的用户服务模板(即
服务(用户)服务|服务(WIN32)共享(进程
)。您可以通过
sc qc OneSyncSvc
@eryksun在命令行上查询其配置,然后是否可以说这些服务在当前登录的用户帐户下运行?@R01k,当我选中时,svchost.exe进程中没有任何线程正在进行模拟,并且进程中没有打开的令牌句柄,因此,是的,服务是e以会话用户身份运行。如果您使用快速用户切换或RDP运行多个会话,则每个会话都将有其自己的这种新类型的每用户(或每会话)服务实例。这就是为什么它具有配置的用户名(或服务术语中的
ObjectName
)没有意义的原因。