Example logical diskspace monitoring script for use with SCOM 2007
I wrote this script to demonstrate some of the new scripting techniques in SCOM, and to remedy a problem I noticed when monitoring logical disk counters.
The default rule included in SCOM will perform an AND query for "% Free Space", and "Free Megabytes". There is no easy method to monitor just one counter of these values.
Install this script as a timed rule in scom. Target it to something like windows servers or windows computers.
The script will generate up to 4 events in the Operations Manager log:
10111 - Warning - Warning Threshold for MB Free has been reached
10111 - Error - Error Threshold for MB Free has been reached
10112 - Warning - Warning Threshold for % Disk Free has been reached
10112 - Error - Error Threshold for % Disk Free has been reached
The script takes up to 5 parameters:
Example: Diskspace.vbs 2000 4000 5 10 1
1st param - Error condition for MB free. This will trigger the 10111 Error Event
2nd Param - Warning Condition for MB free. This will trigger the 10111 Warning Event
3rd Param - Error condition for % free. This will trigger the 10112 Error Event
4th Param - Warning condition for % free. This will trigger the 10112 Warning Event
5th Param - Enable Debug logging. This param is optional. Log defaults to C:\temp\diskspace.log (Note: The scripts checks for the presence of the 5th parameter to enable logging. Changing it to a "0" has no effect)
Here's an example of what the event log text looks like:
Diskspace.vbs : Drive C: has 1403.79MB(11.43%) out of 12284.08MB Free [Alert on: 2000MB Free]
You can use the $Data/EventDescription$ variable in your alert rule to get this information
Also see this link for more information on scripting for SCOM
===============
Const HARD_DISK = 3
Dim AlertSizeinMB
Dim AlertPercent
Dim SpaceinMB
Dim SizeinMB
Dim PercentFree
Dim StrComputer
Dim Logging
Dim oAPI,oArgs
Set oAPI = CreateObject("MOM.ScriptAPI")
Set oArgs = WScript.Arguments
if oArgs.Count < 4 Then
WriteLog ("Argument Error")
DumpInfo()
Call oApi.LogScriptEvent ("Diskspace.vbs",101,1, "Diskspace.vbs script was called with less than 4 arguments")
Wscript.Quit -1
End If
Logging = 0
if oArgs.Count = 5 then
Logging = 1
End If
'1st Arg Error Size in MB
'2nd Arg Warning Size in MB
'3rd Arg Error Size in %
'4th Arg Warning Size in %
'If the 5th Argument exists, turn on logging to C:\temp\diskspace.log
AlertSizeinMB_ERR = oArgs(0)
AlertSizeinMB_WARN = oArgs(1)
AlertPercent_ERR = oArgs(2)
AlertPercent_WARN = oArgs(3)
WriteLog ("Script Startup V3.02")
WriteLog ("AlertSize in MB = " & AlertSizeinMB_ERR & " Alert Percent = " & AlertPercent_ERR)
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colDisks = objWMIService.ExecQuery _
("Select * from Win32_LogicalDisk Where DriveType = " & HARD_DISK & "")
WriteLog ("WMI Query Complete on " & strComputer )
For Each objDisk in colDisks
SpaceinMB=round (objDisk.FreeSpace/1024/1024,2)
SizeinMB=round (objDisk.Size/1024/1024,2)
WriteLog("SizeinMB: " & SizeinMB & " SPaceinMB: " & SpaceinMB)
PercentFree=round(((objDisk.FreeSpace / objDisk.Size) * 100),2)
WriteLog("Percent Free: " & PercentFree)
if (SpaceinMB < round(AlertSizeinMB_ERR) ) then
WriteLog ("SpaceinMB: " & SpaceinMB & " < " & "AlertSizeinMB: " & AlertSizeinMB_ERR & " 10111")
WriteLog ("Drive " & objDisk.DeviceID & " has " & SpaceinMB & "MB" & "("& PercentFree & "%) out of " & SizeinMB & "MB Free [Error Alert on: " & AlertSizeinMB_ERR & "MB Free]")
Call oApi.LogScriptEvent ("Diskspace.vbs",10111,1, "Drive " & objDisk.DeviceID & " has " & SpaceinMB & "MB" & "("& PercentFree & "%) out of " & SizeinMB & "MB Free [Error Alert on: " & AlertSizeinMB_ERR & "MB Free]")
elseif (SpaceinMB < round(AlertSizeinMB_WARN) ) then
WriteLog ("SpaceinMB: " & SpaceinMB & " < " & "AlertSizeinMB: " & AlertSizeinMB_WARN & " 10111")
WriteLog ("Drive " & objDisk.DeviceID & " has " & SpaceinMB & "MB" & "("& PercentFree & "%) out of " & SizeinMB & "MB Free [Warning Alert on: " & AlertSizeinMB_WARN & "MB Free]")
Call oApi.LogScriptEvent ("Diskspace.vbs",10111,2, "Drive " & objDisk.DeviceID & " has " & SpaceinMB & "MB" & "("& PercentFree & "%) out of " & SizeinMB & "MB Free [Warning Alert on: " & AlertSizeinMB_WARN & "MB Free]")
End If
if (PercentFree < round(AlertPercent_ERR) ) then
WriteLog("PercentFree < AlertPercent_ERR 10112")
WriteLog ("Drive " & objDisk.DeviceID & " has " & SpaceinMB & "MB" & "("& PercentFree & "%) out of " & SizeinMB & "MB Free [Error Alert on: " & AlertPercent_ERR & "%]")
Call oApi.LogScriptEvent ("Diskspace.vbs",10112,1, "Drive " & objDisk.DeviceID & " has " & SpaceinMB & "MB" & "("& PercentFree & "%) out of " & SizeinMB & "MB Free [Error Alert on: " & AlertPercent_ERR & "%]")
elseif (PercentFree < round(AlertPercent_WARN) ) then
WriteLog("PercentFree < AlertPercent_WARN 10112")
WriteLog ("Drive " & objDisk.DeviceID & " has " & SpaceinMB & "MB" & "("& PercentFree & "%) out of " & SizeinMB & "MB Free [Warning Alert on: " & AlertPercent_WARN & "%]")
Call oApi.LogScriptEvent ("Diskspace.vbs",10112,2, "Drive " & objDisk.DeviceID & " has " & SpaceinMB & "MB" & "("& PercentFree & "%) out of " & SizeinMB & "MB Free [Warning Alert on: " & AlertPercent_WARN & "%]")
End If
Next
WriteLog ("Script Ended")
Function WriteLog (strLogText)
Dim objfs
Dim objf
Dim strTimeStamp
Dim FileName
if ( Logging = 1 ) then
Filename = "c:\temp\diskspace.log"
On Error Resume Next
Err.Clear
Set objfs = CreateObject("Scripting.FileSystemObject")
Set objf = objfs.OpentextFile(FileName, 8, False)
' If log file doesn't exist - create it
If Err.Number <> 0 Then
Set objf = objfs.CreatetextFile(FileName, False)
Err.Clear
End If
strTimeStamp = "[" & Date & " " & Time & "] "
objf.WriteLine(strTimeStamp & strLogText)
Set objfs = Nothing
Set objf = Nothing
End If
End Function
Function DumpInfo()
On Error Resume Next
WriteLog "--- Beginning DumpInfo()"
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem",,48)
For Each objItem in colItems
WriteLog "Computer Name: " & objItem.CSName & " " & objItem.Caption & "SP "& objItem.ServicePackMajorVersion & "." & objItem.ServicePackMinorVersion & " (" & objItem.Version & ")"
next
Set colItems = objWMIService.ExecQuery("Select * from Win32_Process",,48)
For Each objItem in colItems
WriteLog "== PID: " & objItem.ProcessId & " " & objItem.Name & " ++ Parent PID: " & objItem.ParentProcessId
if objItem.CommandLine <> "" then WriteLog "--- CommandLine: " & objItem.CommandLine
if objItem.ExecutablePath <> "" then if objItem.ExecutablePath <> objItem.CommandLine then Writelog "--- ExecutablePath: " & objItem.ExecutablePath
next
WriteLog "--- Exiting DumpInfo()"
End Function
Comments
Anonymous
January 01, 2003
PingBack from http://geeklectures.info/2008/01/08/example-logical-diskspace-monitoring-script-for-use-with-scom-2007/Anonymous
May 13, 2011
Is there a way to configure overrides or different thresholds for different drives on the same computer?Anonymous
October 29, 2013
Hi There Quick Question regarding Free Disk space for Windows XP SP3 machines on SCOM - 2012. We have 50-70 old Physical servers . All of then are Windows XP Professional SP3. Not sure what is the easiest way check disk space. Under Management Packs, I can only see Windows Server 2000, 2003, 2008 , R2 and 2012. What about XP Professional SP3 ? (Probably silly Question But I am stuck here for about a month now) Not sure how to configure Monitors, Rules , Management packs, Overrides, Tasks , Views... So confusing...!!! Please help me in configuring Free Disk Space alerts for Windows Professional SP3 machines Cheers Prasad