<% Option Explicit '------------------------------------------------------------------------- ' checkrusV1.0.asp ' ' Beschreibung ' Prueft die Funktion des RUS und zeigt die Anzahl der Ausstehenden Objekte an ' ' Laufzeitfehler werde nicht abgefangen und beenden das Skript. ' ' Das Skript wird mit den Berechtigungen des angemeldeten Benutzers ' ausgeführt. Die entsprechenden Berechtigungen sind sicher zu stellen ' ' (c)2005 Net at Work Netzwerksysteme GmbH ' ' Version 1.0 (12. Juli 2005) ' Einstellungen des virtuellen Verzeichnisses/AppPool ' Basic Authentication muss aktiv sein, NTLM erlaubt kein PassThrough ' Anonym muss deaktiviert sein ' Optional: ASP-Seite mit Rechten versehen ' Exchange ORG muss angepasst werden ' Org muss angepasst werden '------------------------------------------------------------------------- Const strExchangeOrg = "msxfaq" ' Bitte tragen Sie hier den Namen der ORG ein ' Diese wird absichtlich nicht automatisch gesucht ! Dim objRootDSE ' Dim strConfigurationNC ' Dim oCommand ' Dim oConnection ' Dim oRecordSet ' Dim strRUSContainer ' Dim strQuery Dim count dim blnDebug blnDebug = false If Request.QueryString("dbg") <> "" Then blnDebug = True Response.AddHeader "Pragma", "no-cache" Response.AddHeader "Cache-control", "no-cache, must-revalidate" Response.Expires = -1 %>

CheckRUS V1.0

Stand: <% = now() %> <% call debug ("ASP-Script startet") %>
<% Set objRootDSE = GetObject("LDAP://RootDSE") strConfigurationNC = objRootDSE.Get("configurationNamingContext") call debug ("ConfigNC=" & strConfigurationNC) strRUSContainer = "CN=Recipient Update Services,CN=Address Lists Container,CN=" &_ strExchangeOrg & ",CN=Microsoft Exchange,CN=Services," & strConfigurationNC call debug ("RUSContainer=" & strRUSContainer) Set oConnection = CreateObject("ADODB.Connection") Set oCommand = CreateObject("ADODB.Command") Set oRecordSet = CreateObject("ADODB.RecordSet") ' Open the Connection oConnection.Provider = "ADsDSOObject" oConnection.Open "ADs Provider" ' Build the query to find all RUS-Entries strQuery = ";(objectCategory=msExchAddressListService);"& _ "name,distinguishedName;subtree" call debug ("LDAP-String"&strQuery) oCommand.ActiveConnection = oConnection oCommand.CommandText = strQuery Set oRecordSet = oCommand.Execute call debug ("RUS LDAP Query finished") count = 0 While (Not oRecordSet.EOF) call debug ("ListRUS: "& oRecordSet.Fields("name")) count = count +1 Call CheckRus(oRecordSet.Fields("distinguishedName"),count) oRecordSet.MoveNext Wend oRecordSet.Close 'Clean up oConnection.Close Set oRecordSet = Nothing Set oCommand = Nothing Set oConnection = Nothing call debug ("Skript beendet") Sub CheckRus(strRusDN,id) Dim objRUS, objtarget, dblHighestUSN Dim pending call debug ("SUB:Checkrus ===============================") call debug (" Prüfe RUS:" & strRusDN) Set objRUS = GetObject("LDAP://" & strRusDN) objRUS.GetInfo ' Objekt aktuell einlesen call debug ( " name :" & objRUS.Name) call debug (" ID :" & id) call debug (" lastmodified :" & objRUS.whenchanged) dblHighestUSN = Abs(objRUS.get("msExchServer1HighestUSN").HighPart * 2^32 + objRUS.get("msExchServer1HighestUSN").LowPart) call debug (" RUSHighestUSN:" & dblHighestUSN) call debug (" :" & objRUS.get("msExchServer1NetworkAddress")) Set objtarget = GetObject("LDAP://" & objRUS.get("msExchServer1NetworkAddress") &"/"& "RootDSE") 'Zum Ziel Verbinden call debug (" ADHighUSN :" & objtarget.get ("highestCommittedUsn")) call debug (" USNDiff :" & objtarget.get ("highestCommittedUsn")-dblHighestUSN) ' ermittle und zeige fehlende Objekte pending = listuntouchedobjects(dblHighestUSN, objtarget.get ("highestCommittedUsn"),objRUS.get("msExchDomainLink"),id) %> <% if Pending = 0 then %> <% else %> <% end if End Sub function listuntouchedobjects(lowusn, highusn, ldapscope,id) Dim oConnection, oCommand, oRecordSet,ousn, dblusn, oobj, count Set oConnection = CreateObject("ADODB.Connection") Set oCommand = CreateObject("ADODB.Command") Set oRecordSet = CreateObject("ADODB.RecordSet") ' Open the Connection oConnection.Provider = "ADsDSOObject" oConnection.Open "ADs Provider" ' Build query to find all pending RUS-Entries strQuery = ";(&(USNChanged>="&lowusn&")(USNChanged<="&highusn&")((objectclass=*)));"& _ "name,distinguishedName,whenchanged,usnchanged;subtree" call debug ("LDAP-String List"&strQuery) oCommand.ActiveConnection = oConnection oCommand.CommandText = strQuery oCommand.Properties("Sort On")= "USNChanged" Set oRecordSet = oCommand.Execute count = 0 While (Not oRecordSet.EOF) count = count + 1 dblusn = oRecordSet.Fields("usnchanged") Set ousn = dblusn ' Kleiner Umweg um den VBVariant mit Lowpart/Highpart nutzen zu können dblusn = Abs(ousn.HighPart * 2^32 + ousn.LowPart) call debug (" Pending: USN="&dblusn &","&oRecordSet.Fields("whenchanged")& "," & oRecordSet.Fields("name")) ' objXML.createChildNode "RUS[@id="&id &"]//Pending", "USN" ' objXML.updatefield "RUS[@id="&id &"]//Pending//USN", oRecordSet.Fields("distinguishedName") oRecordSet.MoveNext Wend 'objXML.updatefield "RUS[@id="&id &"]//Pending", count oRecordSet.Close 'Clean up oConnection.Close Set oRecordSet = Nothing Set oCommand = Nothing Set oConnection = Nothing listuntouchedobjects = count End function sub debug(Message) if blnDebug = true then response.Write Message end sub %>
Name: AD USN: RUS-USN: USN-Delta: whenchanged: Pending:
<% = objRUS.Name %> <% = objtarget.get ("highestCommittedUsn")%> <% = dblHighestUSN%> <% = objtarget.get ("highestCommittedUsn")-dblHighestUSN %> <% = objRUS.whenchanged%> <% = Pending%> <% = Pending%>