How to implement ...
- create a database for the project
- run the sql script to create the 3 tables in the new database
- populate tblSQLPhysicalServers manually with servernames to monitor
- edit .vbs script file to change the database connection parameters
- schedule the .vbs file to run using scheduled tasks in control panel (frequency as desired)
Table Schema Script -
-- table creation script CREATE TABLE [dbo].[tblSQLPhysicalServers] ( [servername] [nvarchar](50) ) GO CREATE TABLE [dbo].[tblDiskSpaceLog]( [id] [int] IDENTITY(1,1) NOT NULL, [notes] [varchar](1000) NULL, [date] [datetime] NULL DEFAULT (getdate()) ) GO CREATE TABLE [dbo].[tblDiskSpace] ( [Computer] [varchar](128), [Drive] [varchar](2), [DiskSize] [decimal](28, 5) NULL, [FreeSpace] [decimal](28, 5) NULL, [Percentage] [decimal](10, 5) NULL, [Date] [datetime] NULL ) GO
VBS Script -
'*********************************************** '* * '* Drive Monitor Script - save as a .vbs file * '* * '*********************************************** On Error Resume Next Const intBytesPerMegabyte = 1048576 Dim AdCn Dim AdRec Dim strMonitorSQL, strSQL, strSQL2, strdate Dim strServerName, strDataBase , strUsername, strPassword, strConnection strServerName = "RIO\SQL2005" strDataBase = "Monitor" strUsername = "rd" strPassword = "pass" strConnection = "Provider=SQLOLEDB.1;Data Source=" + strServerName + ";Initial Catalog=" + strDataBase + ";user id = '" + strUsername + "';password='" + strPassword + "' " Function fnPadLeadingZero(intInputNumber, intTotalDigits) If intTotalDigits > Len(intInputNumber) Then fnPadLeadingZero = String(intTotalDigits -Len(intInputNumber),"0") & intInputNumber Else fnPadLeadingZero = intInputNumber End If End Function Set AdCn = CreateObject("ADODB.Connection") Set AdRec1 = CreateObject("ADODB.Recordset") Set AdRec2 = CreateObject("ADODB.Recordset") AdCn.Open = strConnection strSQL = "Select ServerName from tblSQLPhysicalServers" AdRec1.Open strSQL, AdCn,1,1 strMonitorSQL="insert into tblDiskSpaceLog(Notes) values ('Disk Monitoring - Started')" AdRec2.Open strMonitorSQL, AdCn,1,1 'loop servers While Not Adrec1.EOF Computer = Adrec1("ServerName") 'connect to wmi for server Set objWMIService = GetObject("winmgmts://" & Computer) 'wscript.echo err.number 'check for wmi connection error If err.number <> 0 Then 'wmi connection error AdRec2.Open "insert into tblDiskSpaceLog(Notes) values ('Disk Monitoring - wmi error')", AdCn,1,1 strMonitorSQL="insert into tblDiskSpaceLog(Notes) values ('" + Computer + ": Error-- " + Err.description + "')" AdRec2.Open strMonitorSQL, AdCn,1,1 Else 'wmi connected ok Set colLogicalDisk = objWMIService.InstancesOf("Win32_LogicalDisk") If err.number <> 0 Then 'cant connect to w32_logicaldisk strMonitorSQL="insert into tblDiskSpaceLog(Notes) values ('" + Computer + ": Error-- " + Err.description+ "')" AdRec2.Open strMonitorSQL, AdCn,1,1 Else 'w32_logicaldisk connected... For Each objLogicalDisk In colLogicalDisk If objLogicalDisk.drivetype=3 Then strdate = YEAR(Date()) & "-" & fnPadLeadingZero(Month(Date()),2) & "-" & fnPadLeadingZero(DAY(Date()),2) & " " & time() If objLogicalDisk.FreeSpace = "" Then 'freespace property empty strSQL2 = "Insert into tblDiskSpace (Computer,Drive,DiskSize,date) values('"+Computer+"','" + objLogicalDisk.DeviceID + "'," + CInt(objLogicalDisk.size/intBytesPerMegabyte) + + ",'" + strdate + "')" AdRec2.Open strSQL2, AdCn,1,1 Else 'freespace property given. strSQL2 = "Insert into tblDiskSpace (Computer,Drive,DiskSize,FreeSpace,Percentage,date) values('"_ &Computer&"','" & objLogicalDisk.DeviceID &"',"& objLogicalDisk.size/intBytesPerMegabyte &_ "," & objLogicalDisk.freespace/intBytesPerMegabyte &_ "," &((objLogicalDisk.freespace/intBytesPerMegabyte)/(objLogicalDisk.size/intBytesPerMegabyte))*100_ &",'" & strdate &"')" AdRec2.Open strSQL2, AdCn,1,1 If err.number <> 0 Then wscript.echo err.description End If End If 'debug to see sql used for insert 'strMonitorSQL="insert into tblDiskSpaceLog(Notes) values ('" + replace(sql,"'","_")+ "')" 'AdRec2.Open strMonitorSQL, AdCn,1,1 End If Next End If End If err.Clear Adrec1.movenext Wend AdRec2.Open "insert into tblDiskSpaceLog(Notes) values ('Disk Monitoring - Completed')", AdCn,1,1
Periodically review the recorded data e.g. within daily checks.
Use sql to query the tblDiskSpace table, like this -
SELECT Computer, Drive, DiskSize, FreeSpace, Percentage, Date FROM tblDiskSpace WHERE Dateadd(dd, -1,getdate()) < date AND Percentage < 25 ORDER BY Date DESC
(this query become a scheduled job itself)
No comments:
Post a Comment