vbscript_服务器状态报告VBScript

vbscript

Recently I finished a vbscript that I thought I'd share.  It uses a text file with a list of server names to loop through and get various status reports, then writes them all into an Excel file.  Originally it was put together for our Altiris server environment, but it is easily adaptable to whatever purpose you'd have.  Really, only the last column in the report "Number of Clients" is Altiris specific, the rest is totally open ended.

最近,我完成了一个我想分享的vbscript。 它使用带有服务器名称列表的文本文件来循环浏览并获取各种状态报告,然后将它们全部写入Excel文件。 最初,它是为我们的Altiris服务器环境组合而成的,但是它可以轻松地适应您的任何目的。 确实,只有“客户数量”报告中的最后一列是Altiris专用的,其余都是完全开放式的。

Note:  The text file with the server names needs a line feed between the server names.

注意:带有服务器名称的文本文件需要在服务器名称之间换行。

Server1

服务器1

Server2

服务器2

Server3

服务器3

Not:  Server1, Server2, Server3

不:Server1,Server2,Server3

The things I have the script report are:

我的脚本报告包括:

Server Name

服务器名称

Location

位置

Operating System + Service Pack

操作系统+ Service Pack

SQL Version

SQL版本

Manufacturer

制造商

Model

模型

IP Address

IP地址

Logical Disk

逻辑磁盘

Number of Clients

客户数量

Note:  The Number of Clients is purely for Altiris.

注意:“客户数”仅适用于Altiris。

'I use the file extension XLSX because I have Office 2007, 
'for older versions change it to XLS
'Unless you specify a folder path (ie: C:\Serverdata\ServerStats.xlsx) 
'the file will default to your My Documents folder.
strExcelPath = "ServerStats.xlsx" 
'Access FSO to handle text
Set ObjFSO = CreateObject("Scripting.FileSystemObject") 
'This text file holds the list of servers to get status from.
Set objServerList = objFSO.OpenTextFile("ServerList.txt") 
'Create an Excel instance to write data too
'The script could be easily modified to write the data sets to 
'a SQL database, text file, csv or whatever.
Set objExcel = CreateObject("Excel.Application") 
'Excel commands to open a new workbook and add a worksheet to it
objExcel.Workbooks.Add
objExcel.ActiveWorkbook.Worksheets.Add 
'Sets the worksheet as the active sheet to use.  
'If using more than one sheet, 
'change the active sheet by changing the number in the ()
Set objSheet = objExcel.ActiveWorkbook.Worksheets(1) 
'This section writes the Header information to the worksheet 
'and sets the font for them to bold
objSheet.Range("A1:M1").Font.Bold = True
objSheet.Cells(1, 1).Value = "Server Name"
objSheet.Cells(1, 2).Value = "Location"
objSheet.Cells(1, 3).Value = "Operating System"
objSheet.Cells(1, 4).Value = "SQL Version"
objSheet.Cells(1, 5).Value = "Serial Number"
objSheet.Cells(1, 6).Value = "Manufacturer"
objSheet.Cells(1, 7).Value = "Model"
objSheet.Cells(1, 8).Value = "Memory"
objSheet.Cells(1, 9).Value = "# of Processors"
objSheet.Cells(1, 10).Value = "Processor Type"
objSheet.Cells(1, 11).Value = "IP Address"
objSheet.Cells(1, 12).Value = "Logical Disk"
objSheet.Cells(1, 13).Value = "Number of Clients" 
'This integer will be the row that data is written to in Excel.  
'If you didn't have a header row or more than one header row, 
'you would modify the number to whichever row to start writing to.
Row = 2 
'Starts the Loop of reading through the text file containing the server names.
Do While Not objServerList.AtEndOfStream
'In case one of the servers is offline, I added a Resume here.
	On Error Resume Next
'Sets the computer variable for the server name read out of the text file
strComputer = objServerList.ReadLine 
'Connects to remote computer and creates a WMI instance
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\"_
	& strComputer & "\root\cimv2")
    
'Log failed connections
If Err.Number <> 0 Then
	Set objLogOut = objFSO.CreateTextFile("ServerList.log",2, True)
objLogOut.Write("Connection failed on:  " & strComputer & " on " & Now & vbCrLf)
'Continue with script if no error encounters
	ElseIf Err.Number = 0 Then
	
'Writes the server name to the first column
objSheet.Cells(Row,1).Value = strComputer 
'Uses a Case function to parse through the strComputer and write the location specified
strSite = ""
Select Case strComputer
	Case "AltirisNS1" strSite = "Notification Server"
	Case "Package1" strSite = "Package Server USA"
	Case "Package2" strSite = "Package Server Asia"
	Case "Deployment1" strSite = "Deployment Server USA"
	Case "Deployment2" strSite = "Deployment Server Asia"
	Case Else strSite = "Unknown Site"
End Select	
objSheet.Cells(Row,2).Value = strSite 
	
'Gets OS   Service Pack
Set colOSes = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")
	For Each objOS in colOSes
objSheet.Cells(Row,3).Value = objOS.Caption & " SP "_
		& objOS.ServicePackMajorVersion & "." & objOS.ServicePackMinorVersion
	Next
		
'Get SQL Server Version
'If you are checking a server with an offloaded database,
'you will need to add it into the If statement so you pull data 
'from the correct SQL Server 
If strComputer = "AltirisNS1" Then
	strDBServerName = "AltirisSQL"
Else
	strDBServerName = strComputer
End If 
'Connects to the SQLDMO Object to pull the version data
Set objSQLServer = CreateObject("SQLDMO.SQLServer")
objSQLServer.LoginSecure = True
objSQLServer.Connect strDBServerName
strVersionInfo = objSQLServer.VersionString 
'The VersionString data that is returned is very long
'and not well suited to write into Excel.
'Here is what the VersionString looks like normally: 
'Microsoft SQL Server 2005 - 9.00.3054.00 (Intel X86) 
'	Mar 23 2007 16:28:52 
'	Copyright (c) 1988-2005 Microsoft Corporation
'	Standard Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
 
'In order to cut the string down to something more concise (Version & Edition)
'a Split/Trim loop is used to gather the relevant data.
'(Thank you to RobSampson at ExchangeExperts for his help with this part) 
For Each strLine In Split(strVersionInfo, VbLf)
If InStr(strLine, "SQL Server") > 0 Then
	strSQLVer = Trim(Left(strLine, InStr(strLine, " -") - 1))
ElseIf InStr(strLine, "on Windows") > 0 Then
	strSQLEd = Trim(Left(strLine, InStr(strLine, "on Windows") - 1))
End If
Next 
objSheet.Cells(Row,4).Value = strSQLVer & "-" & strSQLEd 
'Get Serial Number
Set oWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems1 = objWMIService.ExecQuery("SELECT * FROM Win32_BIOS",,48)
	For Each oItem In colItems1
objSheet.Cells(Row,5).Value = oItem.SerialNumber
	Next
		
'Gather several Computer System data sets.
'For this script, I grab Manufacturer, Model, 
'RAM (rounded down to # of gigs), and Processor count.
Set colSettings = objWMIService.ExecQuery("Select * from Win32_ComputerSystem")
	For Each objComputer in colSettings
objSheet.Cells(Row,6).Value = objComputer.Manufacturer
objSheet.Cells(Row,7).Value = objComputer.Model
objSheet.Cells(Row,8).Value = Round((objComputer.TotalPhysicalMemory/1000000000),4)
objSheet.Cells(Row,9).Value = objComputer.NumberOfProcessors
	Next
		
'Get Processor Information
Set colItems = objWMIService.ExecQuery("Select * from Win32_Processor",,48)
	For Each objItem in colItems
objSheet.Cells(Row,10).Value = objItem.Name
	Next
		
'Get the IP Address
Set colIPItems = objWMIService.ExecQuery_
		("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
	For Each objIPItem In colIPItems 
		strIPAddress = Join(objIPItem.IPAddress, ",")
objSheet.Cells(Row,11).Value = strIPAddress
	Next
		
'Get Logical Disk Size and Partition Information
'In order to deal with multiple disks and partitions,
'the list of HDD information is pulled into an array
'which is looped through to get the information from each HDD
'and then a Join function writes them all as a single string 
Dim arrDisks()
intArr = 1
Set colDisks = objWMIService.ExecQuery_
	("Select * from Win32_LogicalDisk Where DriveType = 3")
For Each objDisk in colDisks
ReDim Preserve arrDisks(intArr) 
arrDisks(intArr) = "DISK " & objDisk.DeviceID & " (" & objDisk.FileSystem & ") _
	" & Round((objDisk.Size/1000000000),4) & _
	" GB ("& Round((objDisk.FreeSpace/1000000000)*1.024,4) & " GB Free Space)" & " "
intArr = intArr   1
Next
'I used a " | " to seperate each disk
objSheet.Cells(Row,12).Value = Join(arrDisks," | ") 
'Get Number of Altiris Clients
'This is purely something for use with Altiris servers,
'but again, the function can be modified for other purposes 
'Creates an ADODB object to access SQL servers
Set CnnSQL=CreateObject("ADODB.Connection") 
'Again, just like with getting the version information,
'if you have an offloaded database, you need to use this
'If...Then...Else... loop to point to the correct server.
'For the query itself I just took the query to list clients
'and added a COUNT SQL function to the query. 
If strComputer = "AltirisNS1" Then
CnnSQL.Open "Provider=SQLOLEDB;DATA SOURCE=IRVSQL51;_
		INITIAL CATALOG=Altiris2;Integrated Security=SSPI"
	Set RS = CreateObject("ADODB.Recordset") 
	Set RS = CnnSQL.Execute_
		("SELECT COUNT (guid) FROM vComputerResource WHERE IsManaged=1")
Else
CnnSQL.Open "Provider=SQLOLEDB;DATA SOURCE=" & strComputer & _
		";INITIAL CATALOG=eXpress;Integrated Security=SSPI"
	Set RS = CreateObject("ADODB.Recordset") 
	Set RS = CnnSQL.Execute("SELECT COUNT(name) FROM computer")
End If
objSheet.Cells(Row,13).Value = RS(0)
RS.Close
Set RS = Nothing
Set CnnSQL = Nothing  
'This ends the Loop where the server name was read from the text file
'and adds a count to the Row integer so data will now write on the next row in Excel 
End if
Row = Row   1
Loop 
'This whole section is a series of Excel functions to make the report look better
'I parse through each column and Autofit the column width, 
'then at the end I set the active cell back to A1. 
Set objRange = objExcel.Range("A1")
objRange.Activate
Set objRange = objExcel.ActiveCell.EntireColumn
objRange.Autofit() 
Set objRange = objExcel.Range("B1")
objRange.Activate
Set objRange = objExcel.ActiveCell.EntireColumn
objRange.Autofit() 
Set objRange = objExcel.Range("C1")
objRange.Activate
Set objRange = objExcel.ActiveCell.EntireColumn
objRange.Autofit() 
Set objRange = objExcel.Range("D1")
objRange.Activate
Set objRange = objExcel.ActiveCell.EntireColumn
objRange.Autofit() 
Set objRange = objExcel.Range("E1")
objRange.Activate
Set objRange = objExcel.ActiveCell.EntireColumn
objRange.Autofit() 
Set objRange = objExcel.Range("F1")
objRange.Activate
Set objRange = objExcel.ActiveCell.EntireColumn
objRange.Autofit() 
Set objRange = objExcel.Range("G1")
objRange.Activate
Set objRange = objExcel.ActiveCell.EntireColumn
objRange.Autofit() 
Set objRange = objExcel.Range("H1")
objRange.Activate
Set objRange = objExcel.ActiveCell.EntireColumn
objRange.Autofit() 
Set objRange = objExcel.Range("I1")
objRange.Activate
Set objRange = objExcel.ActiveCell.EntireColumn
objRange.Autofit() 
Set objRange = objExcel.Range("J1")
objRange.Activate
Set objRange = objExcel.ActiveCell.EntireColumn
objRange.Autofit() 
Set objRange = objExcel.Range("K1")
objRange.Activate
Set objRange = objExcel.ActiveCell.EntireColumn
objRange.Autofit() 
Set objRange = objExcel.Range("L1")
objRange.Activate
Set objRange = objExcel.ActiveCell.EntireColumn
objRange.Autofit() 
Set objRange = objExcel.Range("M1")
objRange.Activate
Set objRange = objExcel.ActiveCell.EntireColumn
objRange.Autofit() 
Set objRange = objExcel.Range("A1")
objRange.Activate 
'Saves the Excel workbook and closes everything up
objExcel.ActiveWorkbook.SaveAs strExcelPath
objExcel.ActiveWorkbook.Close
objExcel.Application.Quit 
'Added in a Done echo because the script can take several minutes 
'depending on how many servers that are being queried.
WScript.Echo "Done"
ServerStatsScript.txt ServerStatsScript.txt ServerListExample.txt ServerListExample.txt

翻译自: https://www.experts-exchange.com/articles/808/Server-Status-Report-VBScript.html

vbscript

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值