Enumerating Exchange Object Properties with ADSI/ADO
Enumerating Exchange Object Properties with ADSI/ADO
This content is no longer actively maintained. It is provided as is, for anyone who may still be using these technologies, with no warranties or claims of accuracy with regard to the most recent product version or service release.
Visual Basic
' ' Enumerating Exchange Object Properties with ADSI/ADO ' This sample will help you identify the LDAP properties that are ' displayed by the Users and Computers snap-in when you view the ' User objects Exchange General and Exchange Advanced tabs. ' This sample requires a reference to the following libraries: ' Visual Basic Project References ' - Microsoft ActiveX Data Objects 2.5 Library (msado15.dll) ' - Active DS Type Library (activeds.tlb) Sub Main() Dim oRootDSE As IADs Dim oDomain As IADs Dim obj As IADs Dim objUser As IADsUser Dim dacl As IADsAccessControlList Dim ace As IADsAccessControlEntry Dim oConnection As New ADODB.Connection Dim oCommand As New ADODB.Command Dim RS As ADODB.Recordset Dim RS2 As ADODB.Recordset Dim strQuery As String, strAlias As String, mystring As String Dim varDomainNC As Variant, Desc As Variant, varReports As Variant Dim PropArray As Variant, Prop As Variant, DescList As Variant Dim Everyone As Boolean Dim i As Integer Const RIGHT_DS_DELETE = &H10000 Const RIGHT_DS_READ = &H20000 Const RIGHT_DS_CHANGE = &H40000 Const RIGHT_DS_TAKE_OWNERSHIP = &H80000 Const RIGHT_DS_MAILBOX_OWNER = &H1 Const RIGHT_DS_SEND_AS = &H2 Const RIGHT_DS_PRIMARY_OWNER = &H4 On Error Resume Next ' TODO: Change to the alias of the mailbox you are looking for. strAlias = "User1" ' Get the configuration naming context. Set oRootDSE = GetObject("LDAP://RootDSE") varDomainNC = oRootDSE.Get("defaultNamingContext") ' Open the connection. oConnection.Provider = "ADsDSOObject" oConnection.Open "ADs Provider" ' Build the query to find the user based on the alias. strQuery = "<LDAP://" & varDomainNC & ">;(mailNickName=" & strAlias & ");adspath;subtree" oCommand.ActiveConnection = oConnection oCommand.CommandText = strQuery Set RS = oCommand.Execute If RS.RecordCount = 0 Then Debug.Print strAlias, " is not a valid e-mail alias" Else ' Iterate through the results. While Not RS.EOF ' Retrieve the properties and display them in the debug window. Set objUser = GetObject(RS.Fields("adspath")) Debug.Print "*************************************************" Debug.Print "Information From the Exchange General Tab:" Debug.Print "*************************************************" Debug.Print "Mailbox Store:", objUser.homeMDB Debug.Print "Alias:", objUser.mailNickname Debug.Print "Delivery Restrictions:" Debug.Print " Outgoing Message Size Limit:" If objUser.submissionContlength > 0 Then Debug.Print " No Limit: Is Not Selected" Debug.Print " Maximum Size KB: Is Selected" Debug.Print " Maximum Size KB: ", objUser.submissionContlength Else Debug.Print " No Limit: Is selected" Debug.Print " Maximum Size KB: Is not Selected" End If Debug.Print " Incoming Message Size:" If objUser.delivContLength > 0 Then Debug.Print " No Limit: Is Not Selected" Debug.Print " Maximum Size: Is Selected" Debug.Print " Maximum Size:", objUser.delivContLength Else Debug.Print " No Limit: Is Selected" Debug.Print " Maximum Size: Is Not Selected" End If Debug.Print " Message Restriction:" Debug.Print " Accept Messages from:" Everyone = True ' Initialize the array of properties to pass to GetInfoEx. PropArray = Array("authOrig", "unauthOrig", "dlMemSubmitPerms", "dlMemRejectPerms") ' Make the array a single variant for passing to GetInfoEx. Prop = PropArray objUser.GetInfoEx Prop, 0 Err.Clear DescList = objUser.Get("dlMemSubmitPerms") If Err.Number <> -2147463155 Then Debug.Print " From Everyone: IS Not Selected" Debug.Print " Only From:" For Each Desc In DescList ' Print the descriptions. Debug.Print " ", (Desc) Next Everyone = False End If DescList = Null Err.Clear DescList = objUser.Get("authOrig") If Err.Number <> -2147463155 Then For Each Desc In DescList ' Print the descriptions. Debug.Print " ", (Desc) Next Everyone = False End If DescList = Null Err.Clear DescList = objUser.Get("dlMemRejectPerms") If Err.Number <> -2147463155 Then Debug.Print " From Everyone Except:" For Each Desc In DescList ' Print the descriptions. Debug.Print " ", (Desc) Next Everyone = False End If DescList = Null DescList = objUser.Get("unauthOrig") If Err.Number <> -2147463155 Then For Each Desc In DescList ' Print the descriptions. Debug.Print " ", (Desc) Next Everyone = False End If If Everyone = True Then Debug.Print " From Everyone: Is Selected" End If Debug.Print "Delivery Options:" Debug.Print " Delegates:" Debug.Print " Grant Permission to:" DescList = Null Err.Clear DescList = objUser.Get("publicDelegates") If Err.Number <> -2147463155 Then For Each Desc In DescList ' Print the descriptions. Debug.Print " ", (Desc) Next Else Debug.Print " Not Set" End If Debug.Print " Forwarding Address:", objUser.altRecipient If objUser.deliverAndRedirect = True Then Debug.Print " Deliver message to both forwarding address and mailbox: Checked" Else Debug.Print " Deliver message to both forwarding address and mailbox: Not Checked" End If Debug.Print " Recipient Limits:" Err.Clear DescList = objUser.Get("msExchRecipLimit") If Err.Number <> -2147463155 Then For Each Desc In DescList Debug.Print " Maximum users:", objUser.msExchRecipLimit Next Else Debug.Print " Not Set" End If Debug.Print "Storage Limits:" Debug.Print " Use mailbox store defaults:", objUser.mdbusedefaults Debug.Print " When mailbox exceeds the indicated amount:" Debug.Print " Issue warning at:", objUser.mdbstoragequota Debug.Print " Prohibit send at:", objUser.mdbOverquotalimit Debug.Print " Prohibit send and receive at:", objUser.mdbOverhardquotalimit Debug.Print " Maximum Size:", objUser.MaxStorage Debug.Print " Deleted items retention:" If objUser.deletedItemflags > 0 Then Debug.Print " Use mailbox store defaults: is Not Checked" Else Debug.Print " Use mailbox store defaults: is Checked" End If Debug.Print " Keep deleted items for days:", objUser.garbageCollPeriod / 86400 If objUser.deletedItemflags = 3 Then Debug.Print " Don't permanently delete until the store has been backed up: is Checked" Else Debug.Print " Don't permanently delete until the store has been backed up: is Not Checked" End If Debug.Print "*************************************************" Debug.Print "Information From the Exchange Advanced Tab:" Debug.Print "*************************************************" Debug.Print "Simple Display Name:", objUser.displayNamePrintable Debug.Print "Hide from Exchange Address list", objUser.msExchHidefromAddressLists varReports = objUser.securityProtocol If varReports(3) <> 0 Then Debug.Print "Downgrade high priority mail bound for X400: Is Checked" Else Debug.Print "Downgrade high priority mail bound for X400: Is Not Checked" End If Debug.Print "Custom Attributes:" Debug.Print " extensionAttribute1:", objUser.extensionAttribute1 Debug.Print " extensionAttribute2:", objUser.extensionAttribute2 Debug.Print " extensionAttribute3:", objUser.extensionAttribute3 Debug.Print " extensionAttribute4:", objUser.extensionAttribute4 Debug.Print " extensionAttribute5:", objUser.extensionAttribute5 Debug.Print " extensionAttribute6:", objUser.extensionAttribute6 Debug.Print " extensionAttribute7:", objUser.extensionAttribute7 Debug.Print " extensionAttribute8:", objUser.extensionAttribute8 Debug.Print " extensionAttribute9:", objUser.extensionAttribute9 Debug.Print " extensionAttribute10:", objUser.extensionAttribute10 Debug.Print " extensionAttribute11:", objUser.extensionAttribute11 Debug.Print " extensionAttribute12:", objUser.extensionAttribute12 Debug.Print " extensionAttribute13:", objUser.extensionAttribute13 Debug.Print " extensionAttribute14:", objUser.extensionAttribute14 Debug.Print " extensionAttribute15:", objUser.extensionAttribute15 Debug.Print "Protocol Setting:" DescList = Null Err.Clear DescList = objUser.Get("protocolsettings") If Err.Number <> -2147463155 Then For Each Desc In DescList i = InStr(1, Desc, "§", vbTextCompare) If Left(Desc, i - 1) = "HTTP" Then Desc = Right(Desc, Len(Desc) - i) If Left(Desc, 1) = "1" Then Debug.Print " HTTP: is enabled for mailbox" Else Debug.Print " HTTP: is not enabled for mailbox" End If Desc = Right(Desc, Len(Desc) - 2) If Left(Desc, 1) = "1" Then Debug.Print " HTTP: Use protocol defaults" Else Debug.Print " HTTP: Do not use protocol defaults" End If ElseIf Left(Desc, i - 1) = "IMAP4" Then Desc = Right(Desc, Len(Desc) - i) If Left(Desc, 1) = "1" Then Debug.Print " IMAP4: is enabled for mailbox" Else Debug.Print " IMAP4: is not enabled for mailbox" End If Desc = Right(Desc, Len(Desc) - 2) If Left(Desc, 1) = "1" Then Debug.Print " IMAP4: Use server defaults" Else Debug.Print " IMAP4: Do not use server defaults" End If Debug.Print " IMAP4 MIME Encoding:" Desc = Right(Desc, Len(Desc) - 2) If Left(Desc, 1) = "0" Then Debug.Print " Message should be MIME-encoded with both text and HTML body parts" ElseIf Left(Desc, 1) = "1" Then Debug.Print " Message should be MIME-encoded with text only body parts" ElseIf Left(Desc, 1) = "4" Then Debug.Print " Message should be MIME-encoded with HTML only body parts" End If Desc = Right(Desc, Len(Desc) - 2) i = InStr(1, Desc, "§", vbTextCompare) Debug.Print " Default Character set:", Left(Desc, i - 1) ' The last four values are not documented. ' Setting these programmatically is not supported. ElseIf Left(Desc, i - 1) = "POP3" Then Desc = Right(Desc, Len(Desc) - i) If Left(Desc, 1) = "1" Then Debug.Print " POP3: is enabled for mailbox" Else Debug.Print " POP3: is not enabled for mailbox" End If Desc = Right(Desc, Len(Desc) - 2) If Left(Desc, 1) = "1" Then Debug.Print " POP3: Use server defaults" Else Debug.Print " POP3: Do not use protocol defaults" End If Debug.Print " POP3 MIME Encoding:" Desc = Right(Desc, Len(Desc) - 2) If Left(Desc, 1) = "0" Then Debug.Print " Message should be MIME-encoded with both text and HTML body parts" ElseIf Left(Desc, 1) = "1" Then Debug.Print " Message should be MIME-encoded with text only body parts" ElseIf Left(Desc, 1) = "2" Then Debug.Print " POP3 UUencoding: Is Enabled " Debug.Print " POP3 UUencoding: Use Binhex for Macintosh is enabled" ElseIf Left(Desc, 1) = "3" Then Debug.Print " POP3 UUencoding: Is Enabled " ElseIf Left(Desc, 1) = "4" Then Debug.Print " Message should be MIME-encoded with HTML only body parts" End If Desc = Right(Desc, Len(Desc) - 2) i = InStr(1, Desc, "§", vbTextCompare) Debug.Print " Default Character set:", Left(Desc, i - 1) i = InStr(1, Desc, "§", vbTextCompare) Desc = Right(Desc, Len(Desc) - i) If Left(Desc, 1) = "0" Then Debug.Print " Use Rich Text is not enabled" Else Debug.Print " Use Rich Text is enabled" End If End If Next End If mystring = "§" i = Asc(mystring) Debug.Print "ILS Settings" i = InStr(1, objUser.autoReplyMessage, "/", vbTextCompare) Debug.Print " ILS Server:", Left(objUser.autoReplyMessage, i - 1) Debug.Print " ILS Account:", Right(objUser.autoReplyMessage, Len(objUser.autoReplyMessage) - i) DescList = Null Err.Clear Debug.Print "Mailbox Rights" ' msExchMailboxSecurityDescriptor is a copy of what is in the MDB. ' It cannot be modified programmatically. objUser.GetInfoEx "msExchMailboxSecurityDescriptor", 0 Dim objsd As IADsSecurityDescriptor Set objsd = objUser.Get("msExchMailboxSecurityDescriptor") ' ----Enumerate an ACE in DACL---- Set dacl = objsd.DiscretionaryAcl For Each ace In dacl ' ----TRUSTEE---- mystring = ace.Trustee ' ----ACE TYPE----- If (ace.AceType = ADS_ACETYPE_ACCESS_ALLOWED) Then mystring = " " & mystring & " is allowed:" ElseIf (ace.Type = ADS_ACETYPE_ACCESS_DENIED) Then mystring = " " & mystring & " is denied:" End If ' ----ACE MASK---- If (ace.AccessMask And RIGHT_DS_SEND_AS) Then mystring = mystring & " -send mail as" End If If (ace.AccessMask And RIGHT_DS_CHANGE) Then mystring = mystring & " -modify user attributes" End If If (ace.AccessMask And RIGHT_DS_DELETE) Then mystring = mystring & " -delete mailbox store" End If If (ace.AccessMask And RIGHT_DS_READ) Then mystring = mystring & " -read permissions" End If If (ace.AccessMask And RIGHT_DS_TAKE_OWNERSHIP) Then mystring = mystring & " -take ownership of this object" End If If (ace.AccessMask And RIGHT_DS_MAILBOX_OWNER) Then mystring = mystring & " -is mailbox owner of this object" End If If (ace.AccessMask And RIGHT_DS_PRIMARY_OWNER) Then mystring = mystring & " -is mailbox Primary owner of this object" End If Debug.Print mystring Next RS.MoveNext Wend Set obj = Nothing Set objUser = Nothing Set dacl = Nothing Set ace = Nothing End If Set oRootDSE = Nothing Set oDomain = Nothing Set oConnection = Nothing Set oCommand = Nothing Set RS = Nothing Set RS2 = Nothing End Sub
Send us your feedback about the Microsoft Exchange Server 2003 SDK.
Build: June 2007 (2007.618.1)
© 2003-2006 Microsoft Corporation. All rights reserved. Terms of use.