Scripting Exchange Server

For ‘ad hoc’ scripting of Exchange Server, you just cannot beat Dmitry Streblechenko’s Outlook Redemption.

It is basically a set of COM objects (in a DLL) which wrap many of the Outlook / Exchange objects, saving you from having to put some C++ code together to get around the horrible ‘Another application is trying to access Outlook’ security messages (and requiring user interaction).

I had a quick ‘squiz’ at Dimitry’s site and saw the ‘SafXXXXItem’ objects. I didn’t think these would meet my needs so almost wrote my own wrapper for the 2 or 3 particular objects / calls I needed, when I spotted his Redemption Data Objects (RDO), giving full access to the GAL, Public Folders, Mailboxes etc. In the end it did everything I needed and I got my script running in no time (see functions below).

Function AddUserToFolder(byref oFolder, byval oUserID, byval oUserName, byref objSession)

        ’*********************************************         ’ oFolder                    Public Folder object         ’ oUserID                    EntryID of the user (from the GAL)         ’ oUserName                Name of the user (from the GAL)         ’ objSession                Session object         ’********************************************* Dim sTempUsername sTempUsername = “” Set objACL = CreateObject(“MSExchange.aclobject”) objACL.CDOItem = oFolder Set objFolderACEs = objACL.ACEs

' delete the user if they exist already
For each objFolderACE in objFolderACes
	sTempUsername = GetACLEntryName(objSession, objFolderACE.ID)
	if sTempUsername = oUserName then
		Log "Deleting User : " & sTempUsername
		objFolderACEs.Delete objFolderACE.ID
	end if
next

' add user if they did not exist
Log "Adding user : " & oUserName
Set objNewACE = CreateObject("MSExchange.ACE")
objNewACE.ID = oUserID
objNewACE.Rights = "&H7FB"
objFolderACEs.Add objNewACE
objACL.Update

if err then
	AddUserToFolder = false
else
	AddUserToFolder = true
end if

Set objACL = nothing
Set objNewACE = nothing
Set objFolderACEs = nothing

End Function

Function GetACLEntryName(byref objSession, byval oACLEntryID)

        ’*********************************************         ’ objSession                Session object         ’ oACLEntryID              EntryID from the folders’ ACL         ’********************************************* Dim sResult sResult = “” Select Case oACLEntryId Case UDefault sResult = “Default” & vbTAB & “Default” Case UAnonymous sResult = “Anonymous” & vbTAB & “Anonymous” Case Else sResult = objSession.GetAddressEntryFromID(oACLEntryID).Name

End Select
GetACLEntryName = sResult

End Function