【问题标题】:List local running services on Windows 10 using Python?使用 Python 在 Windows 10 上列出本地运行的服务?
【发布时间】:2019-02-19 20:23:37
【问题描述】:

我需要做的就是创建一个程序,列出我的 Windows 机器上所有正在运行的服务。我尝试了多种方法,包括 psutil 均无济于事。从那以后,我试图通过执行“net stat”命令来简化它。它可以工作,但输出是乱码。有没有办法把它保存到一个漂亮整洁的文本文件中?另外,我想在每一行旁边附加“正在运行”这个词。当我尝试添加时,我收到以下错误:

文件“./Python37/test3.py”,第 3 行,在 打印(str(result.stdout + '运行')) TypeError: can't concat str to bytes

到目前为止,这是我的代码:

import subprocess
result = subprocess.run(['net', 'start'], stdout=subprocess.PIPE)
print(str(result.stdout + 'running'))

【问题讨论】:

    标签: python windows service


    【解决方案1】:

    像这样使用EnumServicesStatus API:

    import win32con
    import win32service
    
    def ListServices():
        resume = 0
        accessSCM = win32con.GENERIC_READ
        accessSrv = win32service.SC_MANAGER_ALL_ACCESS
    
        #Open Service Control Manager
        hscm = win32service.OpenSCManager(None, None, accessSCM)
    
        #Enumerate Service Control Manager DB
        typeFilter = win32service.SERVICE_WIN32
        stateFilter = win32service.SERVICE_STATE_ALL
    
        statuses = win32service.EnumServicesStatus(hscm, typeFilter, stateFilter)
    
        for (short_name, desc, status) in statuses:
            print(short_name, desc, status) 
    
    ListServices();
    
    • win32service和win32con是pywin32开源项目的一部分,你可以下载最新版本here .

    【讨论】:

    • 太棒了,非常感谢。我让它工作了。现在我只需要弄清楚如何将它传递给 txt 文件。
    【解决方案2】:

    psutil 4.2.0 开始,您可以使用psutil.win_service_iter()psutil.win_service_get(name) API 列出和查询windows services

    >>> import psutil
    >>>
    >>> list(psutil.win_service_iter())
    [<WindowsService(name='AeLookupSvc', display_name='Application Experience') at 38850096>,
     <WindowsService(name='ALG', display_name='Application Layer Gateway Service') at 38850128>,
     <WindowsService(name='APNMCP', display_name='Ask Update Service') at 38850160>,
     <WindowsService(name='AppIDSvc', display_name='Application Identity') at 38850192>,
     ...]
    >>>
    >>> s = psutil.win_service_get('alg')
    >>> s.as_dict()
    {'binpath': 'C:\\Windows\\System32\\alg.exe',
     'description': 'Provides support for 3rd party protocol plug-ins for Internet Connection Sharing',
     'display_name': 'Application Layer Gateway Service',
     'name': 'alg',
     'pid': None,
     'start_type': 'manual',
     'status': 'stopped',
     'username': 'NT AUTHORITY\\LocalService'}
    

    【讨论】:

    • 其实这比 win32 api 更快,甚至不是线程安全的。
    猜你喜欢
    • 2016-08-13
    • 1970-01-01
    • 2019-02-09
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    • 2019-03-27
    相关资源
    最近更新 更多