Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
?
Solved

Looking for script to audit windows automatic services.

Posted on 2008-10-28
8
Medium Priority
?
599 Views
Last Modified: 2012-05-05
Looking for script to audit windows automatic services, start the service if stopped and output the server and service that was in stopped status to a text file or html file.
0
Comment
Question by:8AVega
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
  • 3
8 Comments
 
LVL 19

Expert Comment

by:weellio
ID: 22827561
taking a guess you want this to reside on one system then connect to remote systems and query them, then return the results?
how often would you run this?
how would you obtain the server names?


why not turn on the service recovery option so that it automatically restarts the service, then look at the event logs on your systems for any service issue?

old script, but still very handy for looking at eventlogs
http://cwashington.netreach.net/depo/view.asp?Index=1109&ScriptType=vbscript

' -------------------------------------------------------' 
Option Explicit
Dim objWMIService, objItem, objService, strServiceList
Dim colListOfServices, strComputer, strService
 
'On Error Resume Next
 
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
		& "{impersonationLevel=impersonate}!\\" _
		& strComputer & "\root\cimv2")
Set colListOfServices = objWMIService.ExecQuery _
		("Select * from Win32_Service ")
 
For Each objService in colListOfServices
	if objService.Startmode = "Auto" then
		if objService.state = "Stopped" then
			objService.StartService()
			strServiceList = strServiceList & _
			"**********" & objService.name & "**********" & vbcrlf
		end if
	End if
'		strServiceList = strServiceList & _
'			objService.name & "       " & _
'			objService.state & "       " & _
'			objService.Startmode & vbCrlf 
Next
 
WScript.Echo strServiceList
 
'useful  info
'objService.StopService()
'objService.StartService()
'objService.state
'objService.name
'objService.Startmode

Open in new window

0
 
LVL 65

Expert Comment

by:RobSampson
ID: 22827568
Hi, try this.

Regards,

Rob.
Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20
 
arrComputers = Array("D09790RING")
 
strLogFile = "AutoServicesStopped.txt"
 
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objLog = objFSO.CreateTextFile(strLogFile, True)
 
objLog.WriteLine "Script started " & Now & VbCrLf & "================================"
 
For Each strComputer In arrComputers
	objLog.WriteLine "Connecting to " & strComputer & VbCrLf & "================================"
	Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
	Set colItems = objWMIService.ExecQuery("SELECT DisplayName FROM Win32_Service WHERE StartMode='Auto' And State<>'Running'", "WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly)
	
	For Each objItem In colItems
		intReturn = objItem.StartService()
		If intReturn = 0 Then
			objLog.WriteLine objItem.DisplayName & " has been started."
		Else
			objLog.WriteLine objItem.DisplayName & " failed to start. Return code: " & intReturn
		End If
	Next
Next
 
MsgBox "Done"

Open in new window

0
 

Author Comment

by:8AVega
ID: 22858550
Rob, your script has most of what I'm looking for. Their is only one very important option missing. I have to check services for over 350 servers manually. Is it possible to add the servers to a text file or csv file and have the script run againt each server in the .txt or .csv file.  The output txt file will continue to provide the servers that required the service to start.
0
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

 
LVL 65

Expert Comment

by:RobSampson
ID: 22859280
Sure, try this out.  I already had it coded to use an array, so now we can just fill the array with the computer names from a text file.

Regards,

Rob.
Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20
 
strLogFile = "AutoServicesStopped.txt"
strComputersFile = "Computers.txt"
 
Set objFSO = CreateObject("Scripting.FileSystemObject")
Const intForReading = 1
Set objFile = objFSO.OpenTextFile(strComputersFile, intForReading, False)
arrComputers = Split(objFile.ReadAll, VbCrLf)
 
Set objLog = objFSO.CreateTextFile(strLogFile, True)
 
objLog.WriteLine "Script started " & Now & VbCrLf & "================================"
 
For Each strComputer In arrComputers
	If strComputer <> "" Then
		If Ping(strComputer) = True Then
			objLog.WriteLine VbCrLf & "Connecting to " & strComputer & VbCrLf & "================================"
			On Error Resume Next
			Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
			If Err.Number = 0 Then
				On Error GoTo 0
				Set colItems = objWMIService.ExecQuery("SELECT DisplayName FROM Win32_Service WHERE StartMode='Auto' And State<>'Running'", "WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly)
				
				For Each objItem In colItems
					intReturn = objItem.StartService()
					If intReturn = 0 Then
						objLog.WriteLine objItem.DisplayName & " has been started."
					Else
						objLog.WriteLine objItem.DisplayName & " failed to start. Return code: " & intReturn
					End If
				Next
			Else
				objLog.WriteLine VbCrLf & strComputer & " failed to accept WMI connection."
			End If
		Else
			objLog.WriteLine VbCrLf & strComputer & " failed to respond to ping."
		End If
	End If
Next
 
MsgBox "Done"
 
Function Ping(strComputer)
	Dim objShell, boolCode
	Set objShell = CreateObject("WScript.Shell")
	boolCode = objShell.Run("Ping -n 1 -w 300 " & strComputer, 0, True)
	If boolCode = 0 Then
		Ping = True
	Else
		Ping = False
	End If
End Function

Open in new window

0
 
LVL 65

Accepted Solution

by:
RobSampson earned 1000 total points
ID: 22859282
Whoops, forgot to clear the error....
Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20
 
strLogFile = "AutoServicesStopped.txt"
strComputersFile = "Computers.txt"
 
Set objFSO = CreateObject("Scripting.FileSystemObject")
Const intForReading = 1
Set objFile = objFSO.OpenTextFile(strComputersFile, intForReading, False)
arrComputers = Split(objFile.ReadAll, VbCrLf)
 
Set objLog = objFSO.CreateTextFile(strLogFile, True)
 
objLog.WriteLine "Script started " & Now & VbCrLf & "================================"
 
For Each strComputer In arrComputers
	If strComputer <> "" Then
		If Ping(strComputer) = True Then
			objLog.WriteLine VbCrLf & "Connecting to " & strComputer & VbCrLf & "================================"
			On Error Resume Next
			Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
			If Err.Number = 0 Then
				On Error GoTo 0
				Set colItems = objWMIService.ExecQuery("SELECT DisplayName FROM Win32_Service WHERE StartMode='Auto' And State<>'Running'", "WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly)
				
				For Each objItem In colItems
					intReturn = objItem.StartService()
					If intReturn = 0 Then
						objLog.WriteLine objItem.DisplayName & " has been started."
					Else
						objLog.WriteLine objItem.DisplayName & " failed to start. Return code: " & intReturn
					End If
				Next
			Else
				Err.Clear
				On Error GoTo 0
				objLog.WriteLine VbCrLf & strComputer & " failed to accept WMI connection."
			End If
		Else
			objLog.WriteLine VbCrLf & strComputer & " failed to respond to ping."
		End If
	End If
Next
 
MsgBox "Done"
 
Function Ping(strComputer)
	Dim objShell, boolCode
	Set objShell = CreateObject("WScript.Shell")
	boolCode = objShell.Run("Ping -n 1 -w 300 " & strComputer, 0, True)
	If boolCode = 0 Then
		Ping = True
	Else
		Ping = False
	End If
End Function

Open in new window

0
 

Author Comment

by:8AVega
ID: 22874517
I'll test tomorrow and get back with you. Thank You....
0
 

Author Closing Comment

by:8AVega
ID: 31510652
Good morning Rob,

Just want to apoligize on my delay to accept your solution for "Looking for script to audit windows automatic services." I just want to thank you for your time and hard work. I have recovered from a difficult time today and accepted your solution as soon as I could.
Thanks again, you have talent.
0
 

Author Comment

by:8AVega
ID: 23191646
Robert Sampson, I was wondering if you could walk the services script for me so I can understand the flow. Thx....
The solution you provided starts auto services on servers listed on a text file.
THX

Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20
 
strLogFile = "AutoServicesStopped.txt"
strComputersFile = "Computers.txt"
 
Set objFSO = CreateObject("Scripting.FileSystemObject")
Const intForReading = 1
Set objFile = objFSO.OpenTextFile(strComputersFile, intForReading, False)
arrComputers = Split(objFile.ReadAll, VbCrLf)
 
Set objLog = objFSO.CreateTextFile(strLogFile, True)
 
objLog.WriteLine "Script started " & Now & VbCrLf & "================================"
 
For Each strComputer In arrComputers
	If strComputer <> "" Then
		If Ping(strComputer) = True Then
			objLog.WriteLine VbCrLf & "Connecting to " & strComputer & VbCrLf & "================================"
			On Error Resume Next
			Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
			If Err.Number = 0 Then
				On Error GoTo 0
				Set colItems = objWMIService.ExecQuery("SELECT DisplayName FROM Win32_Service WHERE StartMode='Auto' And State<>'Running'", "WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly)
				
				For Each objItem In colItems
					intReturn = objItem.StartService()
					If intReturn = 0 Then
						objLog.WriteLine objItem.DisplayName & " has been started."
					Else
						objLog.WriteLine objItem.DisplayName & " failed to start. Return code: " & intReturn
					End If
				Next
			Else
				Err.Clear
				On Error GoTo 0
				objLog.WriteLine VbCrLf & strComputer & " failed to accept WMI connection."
			End If
		Else
			objLog.WriteLine VbCrLf & strComputer & " failed to respond to ping."
		End If
	End If
Next
 
MsgBox "Done"
 
Function Ping(strComputer)
	Dim objShell, boolCode
	Set objShell = CreateObject("WScript.Shell")
	boolCode = objShell.Run("Ping -n 1 -w 300 " & strComputer, 0, True)
	If boolCode = 0 Then
		Ping = True
	Else
		Ping = False
	End If
End Function

Open in new window

0

Featured Post

Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

When it comes to writing scripts for a Client/Server computing environment it is essential to consider some way of enabling the authentication functionality within a script. This sort of consideration mainly comes into the picture when we are dealin…
Not long ago I saw a question in the VB Script forum that I thought would not take much time. You can read that question (Question ID  (http://www.experts-exchange.com/Programming/Languages/Visual_Basic/VB_Script/Q_28455246.html)28455246) Here (http…
Visualize your data even better in Access queries. Given a date and a value, this lesson shows how to compare that value with the previous value, calculate the difference, and display a circle if the value is the same, an up triangle if it increased…
Sometimes it takes a new vantage point, apart from our everyday security practices, to truly see our Active Directory (AD) vulnerabilities. We get used to implementing the same techniques and checking the same areas for a breach. This pattern can re…

722 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question