A generic WMI perfmon CLR procedure
Posted by
Jason on Saturday, May 17, 2008 to
SQL Server 2008,
SQL Server 2005,
WMI,
CLR
318 Views |
1 Comments |
I am working on my demo's for TechED and I wrote this proc and I thought I would share. Well, updated an old proc I previously posted. It allows you to pass a computer name, a WQL query and a perfmon counter. It must only return a single value although it could easily be modified to return a record set.
You have to do the following in SQL before you deploy:
exec sp_configure 'clr enabled', 1
reconfigure with override
--Enable Trustworthy computing
--This allows us to create unsupported assemblies
GRANT unsafe ASSEMBLY TO [WIN2K3R2EE\Administrator]
ALTER AUTHORIZATION on database::demodb to [WIN2K3R2EE\Administrator]
--This assembly allows us to use WMI in CLR functions and procs.
CREATE ASSEMBLY [System.Management]
FROM 'C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Management.dll'
WITH PERMISSION_SET = UNSAFE
Copy and add this code to a VB database project stored proc in VS2005\2008.
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Data.SqlTypes
Imports System.Management
Imports Microsoft.SqlServer.Server
Partial Public Class StoredProcedures
_
Public Shared Sub pnetWMI(ByVal sComputer As String, ByVal sWQL As String _
, ByVal sCounter As String)
Try
Dim searcher As New ManagementObjectSearcher( _
"\\" & sComputer & "\root\CIMV2", _
sWQL)
For Each queryObj As ManagementObject In searcher.Get()
Dim record As New SqlDataRecord( _
New SqlMetaData(sCounter, SqlDbType.VarChar, 100))
SqlContext.Pipe.SendResultsStart(record)
record.SetString(0, queryObj(sCounter))
SqlContext.Pipe.SendResultsRow(record)
Next
SqlContext.Pipe.SendResultsEnd()
Catch ex As Exception
Dim sp As SqlPipe = SqlContext.Pipe()
sp.Send(ex.Message)
End Try
End Sub
End Class
In visual studio project properties, add a database connection to your db, add a reference to system.management, set to unsafe and deploy.
Here are a few sample executions but of course and any perfmon counter should work:
exec pnetWMI 'localhost', 'select AvgDiskQueueLength from Win32_PerfFormattedData_PerfDisk_PhysicalDisk where name = ''_Total''', 'AvgDiskQueueLength'
exec pnetWMI 'localhost', 'select PercentProcessorTime from Win32_PerfFormattedData_PerfOS_Processor where name = ''_Total''', 'PercentProcessorTime'
email it! |
|
|
|
|
|
Click here to post a comment