smtpreg.vbs Event Management Script
smtpreg.vbs Event Management Script
The following script demonstrates using the Server Extension Objects (SEO) to manage event bindings for the SMTP service.
'THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT
'WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
'INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES
'OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
'PURPOSE
'------------------------------------------------------------------------------
'FILE DESCRIPTION: Script for managing SMTP Protocol and Transport Event Sink bindings.
'
'File Name: smtpreg.vbs
'
'
' Copyright (c) Microsoft Corporation 1993-1999. All rights reserved.
'------------------------------------------------------------------------------
Option Explicit
' The SMTP Source Type
Const GUID_SMTPSourceType = "{fb65c4dc-e468-11d1-aa67-00c04fa345f6}"
' The base Source GUID for SMTP Service Event Sources
Const GUID_SmtpSvcSourceBase = "{1b3c0666-e470-11d1-aa67-00c04fa345f6}"
' the Event type GUIDs (COM Categories) for SMTP Service Events
' Protocol Events
Const catidSmtpOnInboundCommand = "{F6628C8D-0D5E-11d2-AA68-00C04FA35B82}"
Const catidSmtpOnServerResponse = "{F6628C8E-0D5E-11d2-AA68-00C04FA35B82}"
Const catidSmtpOnSessionStart = "{F6628C8F-0D5E-11d2-AA68-00C04FA35B82}"
Const catidSmtpOnMessageStart = "{F6628C90-0D5E-11d2-AA68-00C04FA35B82}"
Const catidSmtpOnPerRecipient = "{F6628C91-0D5E-11d2-AA68-00C04FA35B82}"
Const catidSmtpOnBeforeData = "{F6628C92-0D5E-11d2-AA68-00C04FA35B82}"
Const catidSmtpOnSessionEnd = "{F6628C93-0D5E-11d2-AA68-00C04FA35B82}"
' Transport Events
Const catidSmtpStoreDriver = "{59175850-e533-11d1-aa67-00c04fa345f6}"
Const catidSmtpOnArrival = "{FF3CAA23-00B9-11d2-9DFB-00C04FA322BA}"
Const catidSmtpOnTransportSubmission = "{FF3CAA23-00B9-11d2-9DFB-00C04FA322BA}"
Const catidSmtpOnPreCategorize = "{A3ACFB0D-83FF-11d2-9E14-00C04FA322BA}"
Const catidSmtpOnCategorize = "{960252A3-0A3A-11d2-9E00-00C04FA322BA}"
Const catidSmtpOnPostCategorize = "{76719654-05A6-11D2-9DFD-00C04FA322BA}"
Const catidSmtpOnTransportRouter = "{283430C9-1850-11d2-9E03-00C04FA322BA}"
Const catidSmtpMsgTrackLog = "{c6df52aa-7db0-11d2-94f4-00c04f79f1d6}"
Const catidSmtpDnsResolver = "{bd0b4366-8e03-11d2-94f6-00c04f79f1d6}"
Const catidSmtpMaxMsgSize = "{ebf159de-a67e-11d2-94f7-00c04f79f1d6}"
' Create the GLOBAL SEO Objects used to manage the bindings.
' The SEO oEventManager object.
' This object is used to manage the event bindings database.
Dim oEventManager
Set oEventManager = CreateObject("Event.Manager")
' The SEO COM Category Manager
' This object is used to add Implements Category keys for registered sinks.
Dim oComCatMan
Set oComCatMan = CreateObject("Event.ComCat")
' SEO Utilities
' This object is used to generate the necessary Source GUID for a particular
' SMTP Service Virtual Service.
Dim oSEOUtil
Set oSEOUtil = CreateObject("Event.Util")
' ** DisplayUsage **
' display usage information for this script
'
public sub DisplayUsage
WScript.echo "usage: cscript smtpreg.vbs <Command> <Arguments>"
WScript.echo " Commands:"
WScript.echo " /add <Instance> <Event> <DisplayName | Binding GUID> <SinkClass> <Rule>"
WScript.echo " /remove <Instance> <Event> <DisplayName | Binding GUID>"
WScript.echo " /setprop <Instance> <Event> <DisplayName | Binding GUID> <PropertyBag> <PropertyName> "
WScript.echo " <PropertyValue>"
WScript.echo " /delprop <Instance> <Event> <DisplayName | Binding GUID> <PropertyBag> <PropertyName>"
WScript.echo " /enable <Instance> <Event> <DisplayName | Binding GUID>"
WScript.echo " /disable <Instance> <Event> <DisplayName | Binding GUID>"
WScript.echo " /enum"
WScript.echo " Arguments:"
WScript.echo " <Instance> The SMTP virtual service instance"
WScript.echo " <Event> The event name. Can be one of the following:"
WScript.echo
WScript.echo " Transport Events:"
WScript.echo " StoreDriver"
WScript.echo " OnArrival (OnTransportSubmission)"
WScript.echo " OnTransportSubmission"
WScript.echo " OnPreCategorize"
WScript.echo " OnCategorize"
WScript.echo " OnPostCategorize"
WScript.Echo " OnTransportRouter"
WScript.echo " MsgTrackLog"
WScript.echo " DnsResolver "
WScript.echo " MaxMsgSize"
WScript.echo " Protocol Events:"
WScript.echo " OnInboundCommand"
WScript.echo " OnServerResponse"
WScript.echo " OnSessionStart"
WScript.echo " OnMessageStart"
WScript.echo " OnPerRecipient"
WScript.echo " OnBeforeData"
WScript.echo " OnSessionEnd"
WScript.echo
WScript.echo " <DisplayName> The display name of the event to edit"
WScript.echo " <SinkClass> The sink Programmatic identifier"
WScript.echo " <Rule> The protocol rule to use for the event (ehlo=*,mail from=*, etc)"
WScript.echo " <Binding GUID> The event binding GUID in registry string format: {GUID}"
WScript.echo " <PropertyBag> The ""Source"" or ""Sink"" property bag"
WScript.echo " <PropertyName> The name of the property to edit"
WScript.echo " <PropertyValue> The value to assign to the property"
end sub
'
' register a new sink with event manager
'
' iInstance - The SMTP virtual service instance for which to register the binding.
' szEventName - Must be "OnArrival"
' szDisplayName - The display name for this new sink
' szProgID - The ProgId of the event sink COM Class.
' szRule - The protocol firing rule for the event sink.
' szBindingGUID - Optional. The Binding GUID to use for the binding.
'
public sub RegisterSink(iInstance, szEventName, szDisplayName, szBindingGUID, szProgID, szRule, szPrioVal)
Dim oBindings
Dim oBinding
Dim PrioVal
Dim catidEventType
Set oBindings = GetBindings(iInstance, szEventName)
catidEventType = GetEventTypeCatID(szEventName)
' Attempt to add the "ImplementsCategory" key for Sink using ProgID
' If the sink is not registered on this machine, this will fail.
' If this category is not registered, this method will fail.
On Error Resume Next
Dim fRegCompleteOrErr
fRegCompleteOrErr = False
Do Until fRegCompleteOrErr
oComCatMan.RegisterClassImplementsCategory szProgID, catidEventType
If Err.Number <> 0 Then
Dim oldErrorNum
Dim oldErrDesc
oldErrorNum = Err.Number
oldErrDesc = Err.Description
' verify the COM category exists:
Err.Clear
Dim szCOMCatDesc
szCOMCatDesc = ""
szCOMCatDesc = oComCatMan.GetCategoryDescription(catidEventType,0)
if Err.Number <> 0 Then
WScript.Echo "COM Category (EventType) is not registered..."
' Attempt to run SMTPSEOSetup
Call ResetSMTPCatIDs()
Else
Wscript.Echo "** Registration Failed **"
Wscript.Echo " Err.Number (HRESULT) = 0x" & Hex(oldErrorNum)
WScript.Echo " Err.Description = " & oldErrDesc
WScript.Echo " ProgID = " & szProgID
WSCript.Echo " COM Category = " & catidEventType
WSCript.Echo " Corresponding Event = " & szEventName
WScript.Echo "** Have you registered your sink COM class on this machine?"
WScript.Quit
End If
Else
fRegCompleteOrErr = True
End If
Loop
' Sink is registered...resume registration
' Generate a GUID for the binding if the caller did not specify one
If szBindingGUID = "" Then
szBindingGUID = oSEOUtil.GetNewGUID
End If
Set oBinding = oBindings.Add(szBindingGUID)
' set the binding properties
oBinding.DisplayName = szDisplayName
oBinding.SinkClass = szProgID
' register a rule with the binding
oBinding.SourceProperties.Add "Rule", szRule
' register a priority with the binding
' Assign the default priority if not specified
If szPrioVal = "" Then
szPrioVal = 24575 ' the default
WScript.Echo "Assigning priority (" & szPrioVal & " in 32767)"
End If
oBinding.SourceProperties.Add "Priority", CInt(szPrioVal)
' save the binding
oBinding.Save
If Err.Number <> 0 Then
WScript.Echo "Failed to save the binding " & GUID_Binding
WScript.Echo Err.Number
WScript.Echo Err.Description
WScript.Quit
End If
WScript.Echo "** SUCCESS **"
WScript.Echo "Registered Binding:"
Wscript.ECho " Event Name :" & oComCatMan.GetCategoryDescription(catidEventType,0)
WScript.Echo " Display Name:" & szDisplayName
WScript.Echo " Binding GUID:" & szBindingGUID
WScript.Echo " ProgID :" & szProgID
WScript.Echo " Rule :" & szRule
WScript.Echo " Priority :" & szPrioVal & " (0 - 32767, default: 24575)"
WScript.Echo " ComCatID :" & catidEventType
end sub
' ** GetEventTypeCatID **
' in: szEventName
' returns: COM Category ID for the Event (as a string)
Function GetEventTypeCatID(szEventName)
select case LCase(szEventName)
case "storedriver"
GetEventTypeCatID = catidSmtpStoreDriver
case "onarrival"
GetEventTypeCatID = catidSmtpOnArrival
case "ontransportsubmission"
GetEventTypeCatID = catidSmtpOnTransportSubmission
case "onprecategorize"
GetEventTypeCatID = catidSmtpOnPreCategorize
case "oncategorize"
GetEventTypeCatID = catidSmtpOnCategorize
case "onpostcategorize"
GetEventTypeCatID = catidSmtpOnPostCategorize
case "ontransportrouter"
GetEventTypeCatID = catidSmtpOnTransportRouter
case "msgtracklog"
GetEventTypeCatID = catidSmtpMsgTrackLog
case "dnsresolver"
GetEventTypeCatID = catidSmtpDnsResolver
case "maxmsgsize"
GetEventTypeCatID = catidSmtpMaxMsgSize
case "oninboundcommand"
GetEventTypeCatID = catidSmtpOnInBoundCommand
case "onserverresponse"
GetEventTypeCatID = catidSmtpOnServerResponse
case "onsessionstart"
GetEventTypeCatID = catidSmtpOnSessionStart
case "onmessagestart"
GetEventTypeCatID = catidSmtpOnMessageStart
case "onperrecipient"
GetEventTypeCatID = catidSmtpOnPerRecipient
case "onbeforedata"
GetEventTypeCatID = catidSmtpOnBeforeData
case "onsessionend"
GetEventTypeCatID = catidSmtpOnSessionEnd
case else
WScript.Echo "Unrecognized Event Name: " & szEventName
' This is fatal...quit!
WScript.Quit(-1)
end select
End Function
'
' ** UnregisterSink **
' Unregister a previously registered sink
'
' iInstance - the SMTP Virtual Service Instance
' szEventName - The Event name
' szDisplayName - The display name of the event to remove
' szBindingGUID - Optional. The Binding GUID to use.
public sub UnregisterSink(iInstance, szEventName, szDisplayName, szBindingGUID)
Dim oBindings
dim catidEventType
Set oBindings = GetBindings(iInstance,szEventName)
catidEventType = GetEventTypeCatID(szEventName)
' If the Binding GUID was given, use it to remove the binding
' otherwise, get it using the display name
If szBindingGUID = "" Then
szBindingGUID = GetBindingGUIDFromDisplayName(szDisplayName,oBindings)
End If
oBindings.Remove szBindingGUID
WScript.Echo "** SUCCESS **"
WScript.Echo "Removed Binding:"
Wscript.ECho " Event Name :" & oComCatMan.GetCategoryDescription(catidEventType,0)
WScript.Echo " Display Name:" & szDisplayName
WScript.Echo " Binding GUID:" & szBindingGUID
WScript.Echo " ComCatID :" & catidEventType
end sub
' ****************
' * EditProperty *
' ****************
' add or remove a property from the source or sink propertybag for an event binding
'
' iInstance - The SMTP instance to edit
' szEvent - The event name (OnArrival, OnMessageSubmission, etc)
' szDisplayName - The display name of the event
' szBindingGUID - Optional. The GUID for the binding. Display name is used if not supplied
' szPropertyBag - The property bag to edit ("source" or "sink")
' szOperation - "add" or "remove"
' szPropertyName - The name to edit in the property bag
' szPropertyValue - The value to assign to the name (ignored for remove)
'
public sub EditProperty(iInstance, szEventName, szDisplayName, szBindingGUID, szPropertyBag, szOperation, szPropertyName, szPropertyValue)
Dim oBinding
Dim oPropertyBag
Set oBinding = GetBinding(iInstance, szEventName, szDisplayName, szBindingGUID)
select case LCase(szPropertyBag)
case "source"
set oPropertyBag = oBinding.SourceProperties
case "sink"
set oPropertyBag = oBinding.SinkProperties
case else
WScript.echo "invalid propertybag: " & szPropertyBag
exit sub
end select
' figure out what operation we want to perform
select case LCase(szOperation)
case "remove"
' they want to remove szPropertyName from the
' property bag
oPropertyBag.Remove szPropertyName
WScript.echo "removed property " & szPropertyName
case "add"
' add szPropertyName to the property bag and
' set its value to szValue. if this value
' already exists then this will change the value
' it to szValue.
oPropertyBag.Add szPropertyName, szPropertyValue
WScript.echo "set property " & szPropertyName & " to " & szPropertyValue
case else
WScript.echo "invalid operation: " & szOperation
exit sub
end select
' save the binding
oBinding.Save
end sub
' ******************
' * SetSinkEnabled *
' ******************
' Enable/disable a registered sink
'
' iInstance - The instance to work against
' szEvent - The event name
' szDisplayName - The display name for this sink
' szBindingGUID - The Binding GUID (optional)
'
public sub SetSinkEnabled(iInstance, szEvent, szDisplayName, szBindingGUID, szEnable)
Dim oBinding
Set oBinding = GetBinding(iInstance, szEvent, szDisplayName, szBindingGUID)
Select Case(szEnable)
case "True"
oBinding.Enabled = True
oBinding.Save
wscript.echo "Success: Sink Binding Enabled"
case "False"
oBinding.Enabled = False
oBinding.Save
wscript.echo "Success: Sink Binding Disabled"
case else
Wscript.Echo "Error in SetSinkEnabled Routine: Invalid option."
Wscript.Quit
End Select
end sub
' ***********************
' * GetBindings Function *
' ***********************
' Returns a reference to the SEO binding object for a particular binding
'
' iInstance - The SMTP Virtual Service Instance (> 0)
' szEventName - The Name of the Event (OnArrival, etc)
Function GetBindings(iInstance, szEventName)
Dim oSourceType
Dim catidEventType
Dim oSource
Dim GUID_SMTPInstanceSource
catidEventType = GetEventTypeCatID(CStr(szEventName))
' Make sure iInstance is not less than 1.
If iInstance < 1 Then
WScript.Echo "Invalid SMTP service instance: " & CStr(iInstance)
WScript.Quit
End If
' Generate Source GUID using SMTP source base GUID and the instance number.
' Do this using the SEO Util object's GetIndexedGUID method.
GUID_SMTPInstanceSource = oSEOUtil.GetIndexedGUID(GUID_SmtpSvcSourceBase,iInstance)
' Get the binding manager for this source
Set oSourceType = oEventManager.SourceTypes(GUID_SMTPSourceType)
Set oSource = oSourceType.Sources(GUID_SMTPInstanceSource)
If typename(oSource) = "Nothing" Then
WScript.Echo "SMTP Virtual Service # " & iInstance & " Source not present...exiting."
WScript.Quit(-1)
End If
Set GetBindings = oSource.GetBindingManager.Bindings(catidEventType)
End Function
' ***********************
' * GetBinding Function *
' ***********************
' Returns a reference to the SEO binding object for a particular binding
'
' iInstance - The SMTP Virtual Service Instance (> 0)
' szEventName - The Name of the Event (OnArrival, etc)
' szDisplayName - The Display Name for the binding. Used to retrieve binding GUID
' if is it not supplied
' szBindingGUID - The GUID for the binding. If not "", this GUID is used.
'
Function GetBinding(iInstance, szEventName, szDisplayName,szBindingGUID)
Dim oSourceType
Dim catidEventType
Dim oSource
Dim oBindings
Dim oBinding
Dim GUID_SMTPInstanceSource
catidEventType = GetEventTypeCatID(CStr(szEventName))
' Make sure iInstance is not less than 1.
If iInstance < 1 Then
WScript.Echo "Invalid SMTP service instance: " & CStr(iInstance)
WScript.Quit
End If
' Generate Source GUID using SMTP source base GUID and the instance number.
' Do this using the SEO Util object's GetIndexedGUID method.
GUID_SMTPInstanceSource = oSEOUtil.GetIndexedGUID(GUID_SmtpSvcSourceBase,iInstance)
' Get the binding manager for this source
Set oSourceType = oEventManager.SourceTypes(GUID_SMTPSourceType)
Set oSource = oSourceType.Sources(GUID_SMTPInstanceSource)
If typename(oSource) = "Nothing" Then
WScript.Echo "SMTP Virtual Service # " & iInstance & " Source not present...exiting."
WScript.Quit(-1)
End If
Set oBindings = oSource.GetBindingManager.Bindings(catidEventType)
If szBindingGUID = "" Then
szBindingGUID = GetBindingGUIDFromDisplayName(SzDisplayName, oBindings)
End If
Set oBinding = oBindings(szBindingGUID)
If TypeName(oBinding) = "Nothing" Then
WScript.Echo "** ERROR **"
WScript.Echo "No binding present for GUID " & szBindingGUID
WScript.Quit
Else
Set GetBinding = oBinding
End If
End Function
'
' this helper function takes an IEventSource object and a event category
' and dumps all of the bindings for this category under the source
'
' Source - the IEventSource object to display the bindings for
' GUIDComCat - the event category to display the bindings for
'
public sub DisplayBindingHelper(oSource, oEventType)
Dim Binding
Dim PropName
Dim Props
' walk each of the registered bindings for this component category
dim strSpaces
strSpaces = " "
for each Binding in oSource.GetBindingManager.Bindings(oEventType.id)
wscript.echo " ---------"
wscript.echo " | Binding |"
Wscript.Echo " ---------"
WScript.Echo strSpaces & " Event: " & oEventType.DisplayName
WScript.echo strSpaces & " ID: " & Binding.ID
WScript.echo strSpaces & " Name: " & Binding.DisplayName
WScript.echo strSpaces & " SinkClass: " & Binding.SinkClass
WScript.echo strSpaces & " Enabled: " & Binding.Enabled
Set Props = Binding.SourceProperties
If Props.Count > 0 Then
WScript.echo strSpaces & "SourceProperties: {"
for each PropName in Props
WScript.echo strSpaces & " " & propname & " = " & Binding.SourceProperties(propname)
next
WScript.echo strSpaces & " }"
End If
Set Props = Binding.SinkProperties
If Props.Count > 0 Then
WScript.echo strSpaces & "SinkProperties {"
for each Propname in Props
WScript.echo strSpaces & " " & PropName & " = " & Props(PropName)
next
WScript.echo strSpaces & " }"
End If
next
end sub
'
' dumps all of the information in the binding database related to SMTP
'
public sub DisplaySinks
Dim SourceType
Dim Source
Dim eventtype
On Error Resume Next
For Each SourceType in oEventManager.SourceTypes
wscript.echo " -------------"
Wscript.Echo "| Source Type |"
Wscript.Echo " -------------"
Wscript.echo " Name: " & SourceType.DisplayName
WScript.Echo " ID: " & SourceType.ID
for each eventtype in sourcetype.eventtypes
wscript.echo " ------------"
wscript.echo " | Event Type |"
Wscript.Echo " ------------"
WScript.Echo " Name: " & eventtype.DisplayName
WSCript.Echo " ID: " & eventtype.ID
next
for each Source in SourceType.Sources
' display the source properties
wscript.echo " --------"
wscript.echo " | Source |"
Wscript.Echo " --------"
WScript.echo " Name: " & Source.DisplayName
WScript.echo " ID: " & Source.ID
for each eventtype in sourcetype.eventtypes
call DisplayBindingHelper(Source, eventtype)
next
next
Next
end sub
' ************************
' * SetDisplayNameOrGUID *
' ************************
' Examines the arguments to determine whether a GUID
' or a display name was passed. All GUIDs must be passed in the form
' "{871736C0-FD85-11D0-869A-00C04FD65616}"
' and display names must not start with a left-bracket "{"
'
Sub SetDisplayNameOrGUID(ByRef szArg, ByRef szDisplayName, ByRef szBindingGUID)
' check for left bracked used for a GUID
If (InStr(1,szArg, "{", 1) = 1) Then
WScript.Echo "Binding GUID specified: " & szArg
szBindingGUID = szArg
szDisplayName = ""
Else
WScript.Echo "Binding Display Name Specified: " & szArg
szBindingGUID = ""
szDisplayName = szArg
End If
End Sub
' *********************************
' * GetBindingGUIDFromDisplayName *
' *********************************
' Attempts to return the binding GUID for a binding
' based upon the binding display name
'
' szDisplayName - [in] The display name for the binding
' oBindings - [in] The SEO EventBindings Object
'
' Returns
' If successful, returns the binding GUID for the binding.
' The first matched display name is used. That is, if multiple bindings
' have the same display name, the first found is used.
Function GetBindingGUIDFromDisplayName(SzDisplayName, oBindings)
Dim oBinding
for each oBinding in oBindings
if oBinding.DisplayName = szDisplayName then
GetBindingGUIDFromDisplayName = oBinding.ID
exit function
End If
next
WScript.Echo "Failed to find binding with display name:" & szDisplayName
WScript.Quit
End Function
' *******************
' * ResetSMTPCatIDs *
' *******************
' - Registers the various COM categories for SMTP transport and protocol
' events.
' - Adds each as an event type to the SMTP Service Source Type
'
'
Sub ResetSMTPCatIDs()
WScript.Echo "Running ResetSMTPCatIDs...one moment"
On Error Resume Next
Err.Clear
Dim oSourceType
Set oSourceType = oEventManager.SourceTypes(GUID_SMTPSourceType)
If TypeName(oSourceType) = "Nothing" Then
WScript.Echo "** ERROR **"
Wscript.Echo "No SMTP Source Type registered."
WScript.Echo "Is the SMTP Service installed on this machine?"
WScript.Quit
End If
oComCatMan.RegisterCategory catidSmtpStoreDriver, "SMTP StoreDriver", 0
oSourceType.EventTypes.Add catidSmtpStoreDriver
oComCatMan.RegisterCategory catidSmtpOnTransportSubmission, "SMTP OnTransportSubmission/OnArrival", 0
oSourceType.EventTypes.Add catidSmtpOnTransportSubmission
oComCatMan.RegisterCategory catidSmtpOnPreCategorize, "SMTP OnPreCategorize",0
oSourceType.EventTypes.Add catidSmtpOnPreCategorize
oComCatMan.RegisterCategory catidSmtpOnCategorize, "SMTP OnCategorize",0
oSourceType.EventTypes.Add catidSmtpOnCategorize
oComCatMan.RegisterCategory catidSmtpOnPostCategorize, "SMTP OnPostCategorize",0
oSourceType.EventTypes.Add catidSmtpOnPostCategorize
oComCatMan.RegisterCategory catidSmtpOnTransportRouter, "SMTP OnTransportRouter",0
oSourceType.EventTypes.Add catidSmtpOnTransportRouter
oComCatMan.RegisterCategory catidSmtpMsgTrackLog, "SMTP MsgTrackLog", 0
oSourceType.EventTypes.Add catidSmtpMsgTrackLog
oComCatMan.RegisterCategory catidSmtpDnsResolver, "SMTP DnsResolver", 0
oSourceType.EventTypes.Add catidSmtpDnsResolver
oComCatMan.RegisterCategory catidSmtpMaxMsgSize, "SMTP MaxMsgSize", 0
oSourceType.EventTypes.Add catidSmtpMaxMsgSize
oComCatMan.RegisterCategory catidSmtpOnInBoundCommand, "SMTP OnInBoundCommand", 0
oSourceType.EventTypes.Add catidSmtpOnInBoundCommand
oComCatMan.RegisterCategory catidSmtpOnServerResponse, "SMTP OnServerResponse", 0
oSourceType.EventTypes.Add catidSmtpOnServerResponse
oComCatMan.RegisterCategory catidSmtpOnSessionStart, "SMTP OnSessionStart", 0
oSourceType.EventTypes.Add catidSmtpOnSessionStart
oComCatMan.RegisterCategory catidSmtpOnMessageStart, "SMTP OnMessageStart", 0
oSourceType.EventTypes.Add catidSmtpOnMessageStart
oComCatMan.RegisterCategory catidSmtpOnPerRecipient, "SMTP OnPerRecipient", 0
oSourceType.EventTypes.Add catidSmtpOnPerRecipient
oComCatMan.RegisterCategory catidSmtpOnBeforeData, "SMTP OnBeforeData", 0
oSourceType.EventTypes.Add catidSmtpOnBeforeData
oComCatMan.RegisterCategory catidSmtpOnSessionEnd, "SMTP OnSessionEnd", 0
oSourceType.EventTypes.Add catidSmtpOnSessionEnd
If Err.Number <> 0 Then
WScript.Echo "** ERROR ** "
Wscript.Echo "Error registering COM categories"
WScript.Echo Err.Number
WScript.Echo Err.Description
Wscript.Echo "Make sure the SMTP Service is installed on the machine"
WScript.Quit
End If
' Remove the duplicate, redundant SMTP SourceType
Const GUID_ExtraSMTPSourceType = "{4f803d90-fd85-11d0-869a-00c04fd65616}"
EVentManager.SourceTypes.Remove(GUID_ExtraSMTPSourceType)
End Sub
' **********************
' * Main Routine Start *
' **********************
Dim iInstance
Dim szEvent
Dim szDisplayName
Dim szSinkClass
Dim szRule
Dim szPrio
Dim szBindingGUID
Dim szPropertyBag
Dim szPropertyName
Dim szPropertyValue
dim bCheck
Dim ArgCount
'
' this is the main body of our script. it reads the command line parameters
' specified and then calls the appropriate function to perform the operation
'
if WScript.Arguments.Count = 0 then
call DisplayUsage
else
ArgCount = WScript.Arguments.Count
Select Case LCase(WScript.Arguments(0))
Case "/?"
DisplayUsage
Case "/add"
if not ArgCount = 6 and not ArgCount = 7 then
call DisplayUsage
else
iInstance = WScript.Arguments(1)
szEvent = WScript.Arguments(2)
Call SetDisplayNameOrGUID(WScript.Arguments(3), szDisplayName, szBindingGUID)
szSinkClass = WScript.Arguments(4)
szRule = WScript.Arguments(5)
If ArgCount = 7 Then
szPrio = WScript.Arguments(6)
Else
szPrio = ""
End If
call RegisterSink(iInstance, szEvent, szDisplayName, szBindingGUID, szSinkClass, szRule, szPrio)
end if
Case "/remove"
if not ArgCount = 4 then
call DisplayUsage
else
iInstance = WScript.Arguments(1)
szEvent = WScript.Arguments(2)
Call SetDisplayNameOrGUID(WScript.Arguments(3), szDisplayName, szBindingGUID)
call UnregisterSink(iInstance, szEvent, szDisplayName, szBindingGUID)
end if
Case "/setprop"
if not ArgCount = 7 then
call DisplayUsage
else
iInstance = WScript.Arguments(1)
szEvent = WScript.Arguments(2)
Call SetDisplayNameOrGUID(WScript.Arguments(3), szDisplayName, szBindingGUID)
szPropertyBag = WScript.Arguments(4)
szPropertyName = WScript.Arguments(5)
szPropertyValue = WScript.Arguments(6)
call EditProperty(iInstance, szEvent, szDisplayName, szBindingGUID, szPropertyBag, "add", szPropertyName, szPropertyValue)
end if
Case "/delprop"
if not ArgCount = 6 then
call DisplayUsage
else
iInstance = WScript.Arguments(1)
szEvent = WScript.Arguments(2)
Call SetDisplayNameOrGUID(WScript.Arguments(3), szDisplayName, szBindingGUID)
szPropertyBag = WScript.Arguments(4)
szPropertyName = WScript.Arguments(5)
call EditProperty(iInstance, szEvent, szDisplayName, szBindingGUID, szPropertyBag, "remove", szPropertyName, "")
end if
Case "/enable"
if not ArgCount = 4 then
call DisplayUsage
else
iInstance = WScript.Arguments(1)
szEvent = WScript.Arguments(2)
Call SetDisplayNameOrGUID(WScript.Arguments(3), szDisplayName, szBindingGUID)
call SetSinkEnabled(iInstance, szEvent, szDisplayName, szBindingGUID, "True")
end if
Case "/disable"
if not ArgCount = 4 then
call DisplayUsage
else
iInstance = WScript.Arguments(1)
szEvent = WScript.Arguments(2)
Call SetDisplayNameOrGUID(WScript.Arguments(3), szDisplayName, szBindingGUID)
call SetSinkEnabled(iInstance, szEvent, szDisplayName, szBindingGUID, "False")
end if
Case "/enum"
if not ArgCount = 1 then
call DisplayUsage
else
call DisplaySinks
end if
Case "/resetcatids"
call ResetSMTPCatIDs
Case Else
call DisplayUsage
End Select
end if