Den aktuellen Standort eines Benutzers zu ermitteln, definiert durch die Active Directory Sites, funktioniert folgender VBS Code:
On Error Resume Next
Set wshShell = WScript.CreateObject( "WScript.Shell" )
strUserDomain = wshShell.ExpandEnvironmentStrings( "%USERDOMAIN%" )
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("SELECT ClientSiteName FROM Win32_NTDomain WHERE DomainName = '"& strUserDomain &"'",,48)
For Each objItem in colItems
' Hier wird der erkannte Sitename der Anmeldedomäne ausgegeben.
strSiteName = objItem.ClientSiteName
next
select case strSiteName
case "Berlin"
' Tu irgendwas
case "München"
' Tu irgendwas anderes
end select
Getestet unter Windows XP, Windows 2003, Vista und Windows 7.
Ein Problem bei einer Windows 2000 Domäne, d.h. einer Domäne die sich nicht im einheitlichen Modus befinden, ist das nicht alle Eigenschaften von Objekten innerhalb der Domäne zwischen den Domänencontrollern repliziert werden.
Dies Betrifft unter anderem auch die letzte Anmeldezeit eines Benutzerkontos.
Dieser Wert ist allerdings ziemlich nützlich um z.B. Benutzerleichen zu identifizieren.
Mir ist kein Windows Boardmittel bekannt mit dem man diese Werte aus einer Domäne über alle Domänencontroller hinweg auslesen kann, deswegen habe ich mir ein kleines Tool geschrieben.
Programmaufruf
LastLogon Lookup.exe > Datei.cvs
Ausgabe
distinguishedName;sAMAccountName;LogonCount;LastLogon;DomainController
…
Das ganze wird dann über alle DCs für alle Benutzer ausgelesen.
Der Benutzeraccount unter dem das Progamm läuft muss mindestens entsprechende Werte aus dem AD lesen können (wär auch komisch sonst), eine Schreibberechtigung ist natürlich nicht notwendig. Das Ergebnis ist einfach mit Access/Excel/Stift und Zettel o.Ä. auszuwerten.
Geschrieben in VB.NET, wenn lieb gefragt wird schick ich bestimmt auch den Quellcode zu
Download: LastLogon Lookup.zip