You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过Python获取SQL Server配置管理器中的SQL Server服务列表?

如何通过Python获取SQL Server配置管理器中的SQL Server服务列表?

我懂你现在的困扰——想用Python精准拿到SQL Server配置管理器里展示的那些服务列表,之前用Win32_Product拿到一堆无关的语言包、驱动,实在头疼对吧?其实有两个更靠谱的方案,能直接定位到你需要的SQL服务:

方案一:用WMI的Win32_Service类(推荐,覆盖所有SQL服务)

SQL Server的服务名称都有固定规律,比如默认实例的数据库服务是MSSQLSERVER,命名实例是MSSQL$实例名,还有代理服务SQLAgent$实例名、浏览器服务SQLBrowser这类相关服务。直接通过Win32_Service筛选这些关键词,就能精准拿到目标服务,完全不会混入无关内容:

import wmi

# 建立WMI连接
server_connection = wmi.WMI(server, user=username, password=password)

# 筛选所有SQL相关服务,匹配服务名称的关键词
sql_related_services = (
    server_connection.Win32_Service(Name__like="MSSQL%")
    + server_connection.Win32_Service(Name__like="SQLAgent%")
    + server_connection.Win32_Service(Name__like="SQLBrowser%")
    + server_connection.Win32_Service(Name__like="SQLWriter%")
)

# 遍历输出服务详情
for service in sql_related_services:
    print(f"服务名称: {service.Name}")
    print(f"显示名称: {service.DisplayName}")
    print(f"当前状态: {service.State}")
    print(f"启动类型: {service.StartMode}")
    print("------------------------")

这个方法比Win32_Product靠谱太多:Win32_Product是枚举已安装的产品包,而Win32_Service直接读取系统服务列表,不仅精准,还不会触发MSI的自我修复(Win32_Product有这个坑)。

方案二:用pyodbc查询SQL系统视图(仅限当前连接的实例)

如果你已经通过pyodbc连接到某个SQL实例,也可以查询系统动态管理视图sys.dm_server_services,不过这个只能拿到当前连接实例的相关服务,没法枚举机器上所有SQL实例的服务:

import pyodbc

# 建立SQL连接
conn_str = 'DRIVER={SQL Server};SERVER=你的实例名;UID=用户名;PWD=密码'
conn = pyodbc.connect(conn_str)
cursor = conn.cursor()

# 查询服务信息
cursor.execute("""
    SELECT 
        servicename AS 服务名称,
        service_account AS 服务账户,
        startup_type_desc AS 启动类型,
        status_desc AS 当前状态,
        process_id AS 进程ID
    FROM sys.dm_server_services
""")

# 输出结果
for row in cursor.fetchall():
    print(f"服务名称: {row.服务名称}")
    print(f"服务账户: {row.服务账户}")
    print(f"启动类型: {row.启动类型}")
    print(f"当前状态: {row.当前状态}")
    print(f"进程ID: {row.进程ID}")
    print("------------------------")

# 关闭连接
conn.close()

小结

  • 如果要获取机器上所有SQL Server相关服务(包括多实例),优先选WMI的Win32_Service方案;
  • 如果只需要当前连接的SQL实例的服务,用pyodbc查sys.dm_server_services更方便。

别再用Win32_Product啦,它本来就不是用来枚举服务的工具,难怪会拿到一堆无关内容~

备注:内容来源于stack exchange,提问作者helloWorldXpress

火山引擎 最新活动