%
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") %>
Name: |
AD USN: |
RUS-USN: |
USN-Delta: |
whenchanged: |
Pending: |
<%
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)
%>
<% = objRUS.Name %> |
<% = objtarget.get ("highestCommittedUsn")%> |
<% = dblHighestUSN%> |
<% = objtarget.get ("highestCommittedUsn")-dblHighestUSN %> |
<% = objRUS.whenchanged%> |
<% if Pending = 0 then %>
<% = Pending%>
|
<% else %>
<% = Pending%>
|
<% 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
%>