'---------------------------------------------------------
'
'	File:
'
'			Monitor.VBS
'
'	Description:		
'
'			Script file to extend the standard WMI event query language
'
'	Author:
'
'			Steve Menzies
'
'	Date:
'
'			01/12/00
'
'	Version:
'
'			Draft 1.0
'
'---------------------------------------------------------

'---------------------------------------------------------
'
'	Function:
'
'		Globals
'
'	Description:
'
'		Initialize global variables
'
'	Input Arguments:
'
'		None
'
'	Output Arguments:
'
'		None
'
'	Return Value:
'	
'		None
'---------------------------------------------------------

Dim g_WshArguments
Set g_WshArguments = WScript.Arguments 

const Error_Success = 0
const Error_NoArgs = -1
const Error_InsufficientArgs = -2
const Error_InvalidArgs = -3
const Error_ImpossibleState = -4
const Error_UnexpectedEof = -5
const Error_SyntaxError = -6

'---------------------------------------------------------
'
'	Function:
'
'		ParseCommandLine
'
'	Description:
'
'		Parse command line arguments, to extract server, namespace, query definition and consumer to execute
'
'	Input Arguments:
'
'		None
'
'	Output Arguments:
'
'		None
'
'	Return Value:
'	
'		None
'---------------------------------------------------------

Function ParseCommandLine ( a_ArgumentArray , a_ArgumentArrayCount , ByRef a_Create , ByRef a_Server , ByRef a_Namespace , ByRef a_Query , ByRef a_Script , ByRef a_FilterName , ByRef a_ConsumerName ) 

	ParseCommandLine = Error_Success

	If a_ArgumentArrayCount <> 0 Then

		Dim t_ArgumentIndex 
		t_ArgumentIndex = 0 
		
		While t_ArgumentIndex < a_ArgumentArrayCount

			Dim t_Argument
			t_Argument = a_ArgumentArray ( t_ArgumentIndex ) 


			If t_Argument = "-D" Then

				t_ArgumentIndex = t_ArgumentIndex + 1

				a_Create = FALSE

				If t_Argument = "-S" Then

					t_ArgumentIndex = t_ArgumentIndex + 1
					a_Server = a_ArgumentArray ( t_ArgumentIndex ) 
	
				Else 
					If t_Argument = "-N" Then

						t_ArgumentIndex = t_ArgumentIndex + 1
						a_Namespace = a_ArgumentArray ( t_ArgumentIndex ) 

					Else

						If t_ArgumentIndex = a_ArgumentArrayCount - 1 - 1 Then

							a_FilterName = a_ArgumentArray ( t_ArgumentIndex ) 
							a_ConsumerName = a_ArgumentArray ( t_ArgumentIndex + 1 ) 

						Else

							ParseCommandLine = Error_InsufficientArgs

						End If

						Exit Function
					End If

				End If

				t_ArgumentIndex = t_ArgumentIndex + 1 

			Else 
				If t_Argument = "-C" Then

					t_ArgumentIndex = t_ArgumentIndex + 1

					a_Create = TRUE

					If t_Argument = "-S" Then

						t_ArgumentIndex = t_ArgumentIndex + 1
						a_Server = a_ArgumentArray ( t_ArgumentIndex ) 
		
					Else 
						If t_Argument = "-N" Then

							t_ArgumentIndex = t_ArgumentIndex + 1
							a_Namespace = a_ArgumentArray ( t_ArgumentIndex ) 

						Else

							If t_ArgumentIndex = a_ArgumentArrayCount - 1 - 3 Then
	
								a_Query = a_ArgumentArray ( t_ArgumentIndex ) 
								a_Script = a_ArgumentArray ( t_ArgumentIndex + 1 ) 
								a_FilterName = a_ArgumentArray ( t_ArgumentIndex + 2 ) 
								a_ConsumerName = a_ArgumentArray ( t_ArgumentIndex + 3 ) 

							Else

								ParseCommandLine = Error_InsufficientArgs
			
							End If
	
							Exit Function
						End If

					End If
	
					t_ArgumentIndex = t_ArgumentIndex + 1 
				Else

					ParseCommandLine = Error_InvalidArgs

					Exit Function

			
				End If
			End If

		Wend
	
	Else
		ParseCommandLine = Error_NoArgs

	End If

End Function

'---------------------------------------------------------
'
'	Function:
'
'		CreateFilter
'
'	Description:
'
'		
'
'	Input Arguments:
'
'		None
'
'	Output Arguments:
'
'		None
'
'	Return Value:
'	
'		None
'---------------------------------------------------------

Function CreateFilter ( a_Filter , a_Query , a_Name ) 

	a_Filter.QueryLanguage = "WQL"
	a_Filter.Query = a_Query 
	a_Filter.Name = a_Name 

	a_Filter.Put_

	CreateFilter = Err.Number

End Function


'---------------------------------------------------------
'
'	Function:
'
'		CreateConsumer
'
'	Description:
'
'		
'
'	Input Arguments:
'
'		None
'
'	Output Arguments:
'
'		None
'
'	Return Value:
'	
'		None
'---------------------------------------------------------

Function CreateConsumer ( a_Consumer , a_Script , a_Name ) 

	a_Consumer.Name = a_Name 

	If 0 Then 

		a_Consumer.CommandLineTemplate = a_Script
		a_Consumer.DesktopName = "WinSta0\default"
	Else

		a_Consumer.ScriptFilename = a_Script
		a_Consumer.ScriptingEngine = "VBScript"
	End If

	a_Consumer.Put_

	CreateConsumer = Err.Number

End Function

'---------------------------------------------------------
'
'	Function:
'
'		CreateBinding
'
'	Description:
'
'		
'
'	Input Arguments:
'
'		None
'
'	Output Arguments:
'
'		None
'
'	Return Value:
'	
'		None
'---------------------------------------------------------

Function CreateBinding ( a_Binding , a_Filter , a_Consumer ) 


	a_Binding.Filter = a_Filter.Path_.RelPath
	a_Binding.Consumer = a_Consumer.Path_.RelPath

	a_Binding.Put_

	CreateBinding = Err.Number

End Function

'---------------------------------------------------------
'
'	Function:
'
'		DeleteFilter
'
'	Description:
'
'		
'
'	Input Arguments:
'
'		None
'
'	Output Arguments:
'
'		None
'
'	Return Value:
'	
'		None
'---------------------------------------------------------

Function DeleteFilter ( a_Filter , a_Name ) 

	On Error Resume Next

	a_Filter.Name = a_Name 

	a_Filter.Delete_

	DeleteFilter = Err.Number

End Function


'---------------------------------------------------------
'
'	Function:
'
'		DeleteConsumer
'
'	Description:
'
'		
'
'	Input Arguments:
'
'		None
'
'	Output Arguments:
'
'		None
'
'	Return Value:
'	
'		None
'---------------------------------------------------------

Function DeleteConsumer ( a_Consumer , a_Name ) 

	On Error Resume Next

	a_Consumer.Name = a_Name 
	a_Consumer.Delete_

	DeleteConsumer = Err.Number

End Function

'---------------------------------------------------------
'
'	Function:
'
'		DeleteBinding
'
'	Description:
'
'		
'
'	Input Arguments:
'
'		None
'
'	Output Arguments:
'
'		None
'
'	Return Value:
'	
'		None
'---------------------------------------------------------

Function DeleteBinding ( a_Binding , a_Filter , a_Consumer ) 

	On Error Resume Next

	a_Binding.Filter = a_Filter.Path_.RelPath
	a_Binding.Consumer = a_Consumer.Path_.RelPath

	a_Binding.Delete_

	DeleteBinding = Err.Number

End Function

'---------------------------------------------------------
'
'	Function:
'
'		CreateFilterBindingAndConsumer
'
'	Description:
'
'		Parse command line arguments, to extract server, namespace, query definition and consumer to execute
'
'	Input Arguments:
'
'		None
'
'	Output Arguments:
'
'		None
'
'	Return Value:
'	
'		None
'---------------------------------------------------------

Function CreateFilterBindingAndConsumer ( a_Server , a_Namespace , a_Query , a_Script , a_FilterName , a_ConsumerName ) 

	Dim t_Locator
	Dim t_Service
	Dim t_Filter
	Dim t_Binding
	Dim t_Consumer 
	
	Set t_Locator = CreateObject("WbemScripting.SWbemLocator")
	if Err.Number <> 0 Then

		WScript.Echo "CreateObject" , Err.Description		

		CreateFilterBindingAndConsumer = Err.Number
		Exit Function
	End If

	Set t_Server = t_Locator.ConnectServer ( a_server, a_Namespace )
	if Err.Number <> 0 Then

		WScript.Echo "ConnectServer" , Err.Description		
	
		CreateFilterBindingAndConsumer = Err.Number
		Exit Function
	End If

	Set t_Filter = t_Server.Get ( "__EventFilter" ).SpawnInstance_
	If Err.Number <> 0 Then

		WScript.Echo "Get __EventFilter" , Err.Description		
		
		CreateFilterBindingAndConsumer = Err.Number
		Exit Function

	End If

	Set t_Binding = t_Server.Get ( "__FilterToConsumerBinding" ).SpawnInstance_
	If Err.Number <> 0 Then

		WScript.Echo "Get __FilterToConsumerBinding" , Err.Description		
		
		CreateFilterBindingAndConsumer = Err.Number
		Exit Function

	End If

	If 0 Then
		Set t_Consumer = t_Server.Get ( "CommandLineEventConsumer" ).SpawnInstance_
	Else
		Set t_Consumer = t_Server.Get ( "ActiveScriptEventConsumer" ).SpawnInstance_
	End If
	If Err.Number <> 0 Then

		WScript.Echo "Get CommandLineConsumer" , Err.Description		
		
		CreateFilterBindingAndConsumer = Err.Number
		Exit Function

	End If

	Dim t_Status

	t_Status = CreateFilter ( t_Filter , a_Query , a_FilterName ) 
	If Err.Number <> 0 Then

		WScript.Echo "CreateFilter" , Err.Description		

		CreateFilterBindingAndConsumer = Err.Number
		Exit Function
		
	End If

	t_Status = CreateConsumer ( t_Consumer , a_Script , a_ConsumerName ) 
	If Err.Number <> 0 Then

		WScript.Echo "CreateConsumer" , Err.Description		

		t_Status = t_Filter.Delete_

		CreateFilterBindingAndConsumer = Err.Number
		Exit Function
		
	End If

	t_Status = CreateBinding ( t_Binding , t_Filter , t_Consumer ) 
	If Err.Number <> 0 Then

		WScript.Echo "CreateBinding" , Err.Description		

		t_Status = t_Filter.Delete_ 
		t_Status = t_Consumer.Delete_ 

		CreateFilterBindingAndConsumer = Err.Number
		Exit Function
		
	End If
	
End Function

'---------------------------------------------------------
'
'	Function:
'
'		DeleteFilterBindingAndConsumer
'
'	Description:
'
'		Parse command line arguments, to extract server, namespace, query definition and consumer to execute
'
'	Input Arguments:
'
'		None
'
'	Output Arguments:
'
'		None
'
'	Return Value:
'	
'		None
'---------------------------------------------------------

Function DeleteFilterBindingAndConsumer ( a_Server , a_Namespace , a_FilterName , a_ConsumerName ) 

	Dim t_Locator
	Dim t_Service
	Dim t_Filter
	Dim t_Binding
	Dim t_Consumer 
	
	Set t_Locator = CreateObject("WbemScripting.SWbemLocator")
	if Err.Number <> 0 Then

		WScript.Echo "CreateObject" , Err.Description		

		DeleteFilterBindingAndConsumer = Err.Number
		Exit Function
	End If

	Set t_Server = t_Locator.ConnectServer ( a_server, a_Namespace )
	if Err.Number <> 0 Then

		WScript.Echo "ConnectServer" , Err.Description		
	
		DeleteFilterBindingAndConsumer = Err.Number
		Exit Function
	End If

	Set t_Filter = t_Server.Get ( "__EventFilter" ).SpawnInstance_
	If Err.Number <> 0 Then

		WScript.Echo "Get __EventFilter" , Err.Description		
		
		DeleteFilterBindingAndConsumer = Err.Number
		Exit Function

	End If

	Set t_Binding = t_Server.Get ( "__FilterToConsumerBinding" ).SpawnInstance_
	If Err.Number <> 0 Then

		WScript.Echo "Get __FilterToConsumerBinding" , Err.Description		
		
		DeleteFilterBindingAndConsumer = Err.Number
		Exit Function

	End If

	If 0 Then

		Set t_Consumer = t_Server.Get ( "CommandLineEventConsumer" ).SpawnInstance_
	Else

		Set t_Consumer = t_Server.Get ( "ActiveScriptEventConsumer" ).SpawnInstance_
	End If

	If Err.Number <> 0 Then

		WScript.Echo "Get CommandLineConsumer" , Err.Description		
		
		DeleteFilterBindingAndConsumer = Err.Number
		Exit Function

	End If

	Dim t_Status

	On Error Resume Next

	t_Status = DeleteFilter ( t_Filter , a_FilterName ) 
	If t_Status <> 0 Then

		WScript.Echo "DeleteFilter" , Err.Description		

		DeleteFilterBindingAndConsumer = t_Status
		
	End If

	t_Status = DeleteConsumer ( t_Consumer , a_ConsumerName ) 
	If t_Status <> 0 Then

		WScript.Echo "DeleteConsumer" , Err.Description		

		DeleteFilterBindingAndConsumer = t_Status
		
	End If

	t_Status = DeleteBinding ( t_Binding , t_Filter , t_Consumer ) 
	If t_Status <> 0 Then

		WScript.Echo "DeleteBinding" , Err.Description		

		DeleteFilterBindingAndConsumer = t_Status
		
	End If

End Function

'---------------------------------------------------------
'
'	Function:
'
'		Main Function
'
'	Description:
'
'		Entry point for visual basic script
'
'	Input Arguments:
'
'		None
'
'	Output Arguments:
'
'		None
'
'	Return Value:
'	
'		None
'---------------------------------------------------------

	dim t_Server 
	dim t_Namespace 
	dim t_Query
	dim t_Script
	Dim t_FilterName
	Dim t_ConsumerName
	Dim t_Create

	Dim t_ReturnValue
	t_ReturnValue = ParseCommandLine ( g_WshArguments , g_WshArguments.Count , t_Create , t_Server , t_Namespace , t_Query , t_Script , t_FilterName , t_ConsumerName )

	If t_ReturnValue = Error_Success Then

		if t_Create = TRUE Then

			t_ReturnValue = CreateFilterBindingAndConsumer ( t_Server , t_Namespace , t_Query , t_Script , t_FilterName , t_ConsumerName ) 

			If t_ReturnValue = Error_Success Then

			Else 
				Wscript.Echo "CreateFilterBindingAndconsumer " , Err.Number, Err.Description
			End If

		Else

			t_ReturnValue = DeleteFilterBindingAndConsumer ( t_Server , t_Namespace , t_FilterName , t_ConsumerName ) 

			If t_ReturnValue = Error_Success Then

			Else 
				Wscript.Echo "DeleteFilterBindingAndconsumer " , Err.Number, Err.Description
			End If

		End If
	Else 
		Wscript.Echo "ParseCommandLine " , Err.Number, Err.Description
	End If