据我所知,没有办法直接从 T-SQL 中“查询”WMI 类。要运行 WMI 查询,您需要利用 WMI 基础结构,这通常由 .Net Framework 应用程序、脚本语言等完成。但是,您可以从 T-SQL 间接访问 WMI。
在我们开始之前,先说几句话xp_cmdshell
。我既不提倡也不反对扩展存储过程的启用和使用。该答案仅显示了特定用例的可能性。可以启用xp_cmdshell
吗?自己决定。
如果尚未启用,请启用xp_cmdshell
. 我们WMIC.exe
将按如下方式运行,并将输出作为原始“XML”捕获到临时表。之后,我们将获取“XML 数据”并将其转换为强类型的实际 XML 数据,并将其分解。我们在结果集中取回强类型数据,Win32_Process
类的每个字段对应一列。
参考: SQL Server 内部的 WMI 查询...排序
CREATE TABLE #WMIC (
ID INT IDENTITY PRIMARY KEY,
CmdOutput VARCHAR(1000)
)
INSERT INTO #WMIC (CmdOutput)
EXECUTE master..xp_cmdshell 'WMIC.exe MSBTS_serviceinstance get Name,ServiceName,ServiceStatus,SuspendTime /FORMAT:RAWXML'
DECLARE @Cmd VARCHAR(MAX) = ''
DECLARE @Xml XML
SELECT @Cmd = @Cmd + COALESCE(w.CmdOutput, '')
FROM #WMIC w
ORDER BY w.ID
SET @Xml = CAST(@Cmd AS XML)
SELECT
Name = BT_Service.value('(PROPERTY[@NAME="Name"]/VALUE)[1]', 'VARCHAR(512)'),
ServiceName = BT_Service.value('(PROPERTY[@NAME="ServiceName"]/VALUE)[1]', 'VARCHAR(512)'),
ServiceStatus = BT_Service.value('(PROPERTY[@NAME="ServiceStatus"]/VALUE)[1]', 'INT'),
SuspendTime = BT_Service.value('(PROPERTY[@NAME="SuspendTime"]/VALUE)[1]', 'DATETIME')
FROM @Xml.nodes('/COMMAND/RESULTS/CIM/INSTANCE') AS WmiTbl(BT_Service)
WHERE BT_Service.value('(PROPERTY[@NAME="ServiceStatus"]/VALUE)[1]', 'INT') = 4
DROP TABLE #WMIC
笔记:
- 我没有安装 BizTalk 的服务器,所以我无法测试/验证上面的代码。区分大小写可能存在一些问题……毕竟是 XML。
- 完成后不要忘记禁用
xp_cmdshell
!