有没有办法将WMI数据导入T-SQL

时间:2012-10-04 19:45:03

标签: tsql wmi monitor wmi-query

以下是样本VBScript中使用的类似SQL的命令,用于通过WMI接口获取Biztalk挂起实例。

select * from MSBTS_serviceinstance where ServiceStatus=4 

MSBTS_serviceinstance不是表,它是WMI类,如下所定义: http://msdn.microsoft.com/en-us/library/aa560069%28v=BTS.70%29.aspx

它在VBScript中使用如下:

 sQuery  = "select * from MSBTS_serviceinstance where ServiceStatus=4 and ErrorId ='" & sErrorCode & "'"   
  Set intSet = GetObject("Winmgmts:!root\MicrosoftBizTalkServer").ExecQuery(sQuery)
  ' then you have to loop through the results 

有没有办法直接从T-SQL运行类似的命令。如果我可以获取该数据并将其存储在T-SQL的表中,那么我就不必编写C#或VBScript程序,我们的DBA也可以理解并帮助维护代码。这是为了监控和创建警报;到目前为止,主要由SQL Agent Jobs完成。 [在路上几周或几个月我们可能会使用猎户座太阳风进行更多监控,但我需要尽快创建快速警报。]

1 个答案:

答案 0 :(得分:1)

据我所知,没有办法直接从T-SQL“查询”WMI类。要运行WMI查询,您需要利用WMI基础结构,这通常是从.Net Framework应用程序,脚本语言等完成的。但是,您可以从T-SQL访问WMI 间接

在我们走远之前,先谈谈xp_cmdshell。我既不提倡也不谴责扩展存储过程的启用和使用。这个答案仅仅说明了特定用例的可能性。是否可以启用xp_cmdshellDecide for yourself

如果尚未启用enable xp_cmdshell。我们将按如下方式运行WMIC.exe,并将输出捕获为原始“XML”到临时表。之后,我们将获取“XML数据”并将其转换为强类型的实际XML数据,并将其粉碎。我们在结果集中返回强类型数据,Win32_Process类的每个字段都有一列。

参考:WMI Queries From Within SQL Server...Sort Of

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

注意:

  1. 我没有安装BizTalk的服务器,所以我无法测试/验证上面的代码。可能存在一些与区分大小写有关的问题......毕竟它是XML。
  2. 完成后别忘了禁用xp_cmdshell