如何通过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




