Thursday, February 22, 2007

Stopping and Restarting a Virtual SMTP server on Exchange 2000/2003 via Script

One thing you may need to do from time to time for a myriad of reasons is stop and start a particular instance of a Virtual SMTP server on Exchange. To do this via a script you can use the IIS provider which has a stop and start method you can use once you have connected to the object in question. A simple Example would be

Set SMTPsvc = GetObject("IIS://" & Servername & "/SMTPSVC/1")
SMTPsvc.Stop
SMTPsvc.Start

This should also work for Pop3 and IMAP4 virtual servers (as long as you use the correct path to the object). I've put a more complicated sample together that allows you to enter a servername as a commandline parameter and it will then query Active Directory to find all the SMTP Virtual Server instances on the particular server it will then connect to and query those instances on that server and restart any currently active instances. I've put a downloadable copy of the script here the script itself looks like.

snServerName = wscript.arguments(0)
set conn = createobject("ADODB.Connection")
set com = createobject("ADODB.Command")
Set iAdRootDSE = GetObject("LDAP://RootDSE")
strNameingContext = iAdRootDSE.Get("configurationNamingContext")
strDefNamingContext = iAdRootDSE.Get("defaultNamingContext")
Conn.Provider = "ADsDSOObject"
Conn.Open "ADs Provider"
Com.ActiveConnection = Conn
Com.ActiveConnection = Conn
Wscript.echo
Wscript.echo "SMTP Virtual Servers Status"
vsQuery = "<LDAP://" & strNameingContext &amp;amp;amp;amp; ">;(objectCategory=protocolCfgSMTPServer);name,distinguishedName;subtree"
Com.ActiveConnection = Conn
Com.CommandText = vsQuery
Set Rs = Com.Execute
While Not Rs.EOF
strstmsrv = "LDAP://" & rs.fields("distinguishedName")
set svsSmtpserver = getobject(strstmsrv)
crServerName =
mid(svsSmtpserver.distinguishedName,instr(svsSmtpserver.distinguishedName,"CN=Protocols,")+16,instr(svsSmtpserver.distinguishedName,",CN=Servers")-(instr(svsSmtpserver.distinguishedName,"CN=Protocols,")+16))
wscript.echo
wscript.echo "ServerName:" & crServerName
if lcase(snServerName) = lcase(crServerName) then call
getSTMPstatus(crServerName,svsSmtpserver.adminDisplayName)
rs.movenext
wend

sub getSTMPstatus(servername,vsname)
Set SMTPVSS = GetObject("IIS://" & Servername &amp;amp;amp;amp; "/SMTPSVC")
for each SMTPVS in SMTPVSS
if SMTPVS.KeyType = "IIsSmtpServer" then
if SMTPVS.ServerComment = vsname then
wscript.echo "SMTP Server : " & SMTPVS.ServerComment
select case SMTPVS.ServerState
case 1 Wscript.echo "Current State: Starting"
case 2 Wscript.echo "Current State: Started"
Wscript.echo "Will Restart"
SMTPVS.Stop
wscript.echo "Virtual server Stop"
SMTPVS.Start
wscript.echo "Virtual server Start"
case 3 Wscript.echo "Current State: Stopping"
case 4 Wscript.echo "Current State: Stopped"
case 5 Wscript.echo "Current State: Pausing"
case 6 Wscript.echo "Current State: Paused"
case 7 Wscript.echo "Current State: Continuing"
case else Wscript.echo "unknown"
end select
end if
end if
next

end sub

4 comments:

Anonymous said...

Hi,

I have created a User with Exchange 2007 mailbox. Using ADU&C I taken the properties of the same user and I take “Security” Tab. In “Security” Tab windows I can seen list of user’s and its Permissions.

I want to know how to modify/Add “Security” tab users and its permission using Exchange Management Shell. What is the corresponding Exchange Management Shell command to do it?

Thanks
Dinil

Glen said...

To set Active Directory permissions you can use Add-ADPermission http://technet.microsoft.com/en-us/library/bb124403.aspx

to set mailbox box permissions you can use Add-MailboxPermissions

Cheers
Glen

Jerry said...

Do you have a version of this script that can stop and restart a POP3 Virtual Serveron Exchange 2003?

Glen said...

You should be able to substitute SMTPSVC with POP3SVC and the rest should work.

Cheers
Glen