Active Directory - angemeldete Benutzer ermitteln

  • Hi,

    folgendes Problem ...

    ich würde gern mit AutoIT in einer Windows2003-Domäne abfragen welche Benutzer aktuell angemeldet sind und anschließend dann ermitteln
    an welchem Rechner dieser User angemeldet ist. Bei meinen Recherchen hab ich jetzt nicht wirklich was brauchbares gefunden.
    Generell stellt sich für mich aber auch die Frage ob aktuell angemeldete Benutzer überhaupt im AD abgespeichert werden und wenn ja hält der
    Domaincontroller alle diese Informationen oder muß ich eventuell alle vorhandenen Anmeldeserver abfragen ?
    Hat jemand ne Idee ???

    Gruß
    Markus

    Einmal editiert, zuletzt von bordermax (11. April 2013 um 23:23)

  • Von AD bekommst Du diese Info nicht, da AD die Info nicht hat.
    Wir haben das ins Login-Skript eingebaut, dass Datum und PC/Terminal Server in eine zentrale Datei geschrieben werden.

  • Wenn Du, wie wir, eine ganze Farm von TerminalServern hast, dann wird das etwas mühsam. Daher haben wir den Weg über das Login-Skript gewählt.

  • Ich nutze folgendes Script, welches die Workstations in der Domäne auflistet und den daran angemeldeten Benutzer anzeigt.
    Ist aber nicht das schnellste ;)

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global Const $SV_TYPE_WORKSTATION = 0x1
    Global Const $SV_TYPE_SERVER = 0x2
    Global Const $SV_TYPE_SQLSERVER = 0x4
    Global Const $SV_TYPE_DOMAIN_CTRL = 0x8
    Global Const $SV_TYPE_DOMAIN_BAKCTRL = 0x10
    Global Const $SV_TYPE_TIME_SOURCE = 0x20
    Global Const $SV_TYPE_AFP = 0x40
    Global Const $SV_TYPE_NOVELL = 0x80
    Global Const $SV_TYPE_DOMAIN_MEMBER = 0x100
    Global Const $SV_TYPE_PRINTQ_SERVER = 0x200
    Global Const $SV_TYPE_DIALIN_SERVER = 0x400
    Global Const $SV_TYPE_XENIX_SERVER = 0x800
    Global Const $SV_TYPE_NT = 0x1000
    Global Const $SV_TYPE_WFW = 0x2000
    Global Const $SV_TYPE_SERVER_MFPN = 0x4000
    Global Const $SV_TYPE_SERVER_NT = 0x8000
    Global Const $SV_TYPE_POTENTIAL_BROWSER = 0x10000
    Global Const $SV_TYPE_BACKUP_BROWSER = 0x20000
    Global Const $SV_TYPE_MASTER_BROWSER = 0x40000
    Global Const $SV_TYPE_DOMAIN_MASTER = 0x80000
    Global Const $SV_TYPE_WINDOWS = 0x400000
    Global Const $SV_TYPE_CLUSTER_NT = 0x1000000
    Global Const $SV_TYPE_TERMINALSERVER = 0x2000000
    Global Const $SV_TYPE_CLUSTER_VS_NT = 0x4000000
    Global Const $SV_TYPE_LOCAL_LIST_ONLY = 0x40000000
    Global Const $SV_TYPE_DOMAIN_ENUM = 0x80000000
    Global Const $SV_TYPE_ALL = 0xFFFFFFFF

    [/autoit] [autoit][/autoit] [autoit]

    $aCompList = _NetServerEnum($SV_TYPE_WORKSTATION)

    [/autoit] [autoit][/autoit] [autoit]

    ;_ArrayDisplay($aCompList)

    [/autoit] [autoit][/autoit] [autoit]

    Dim $aCompListUser [$aCompList[0]+1][2]
    $aCompListUser[0][0] = $aCompList[0]
    $wbemFlagReturnImmediately = 0x10
    $wbemFlagForwardOnly = 0x20
    For $i = 1 To $aCompList[0]
    $aCompListUser[$i][0] = $aCompList[$i]
    $colItems = ""
    $objWMIService = ObjGet("winmgmts:\\" & $aCompList[$i] & "\root\CIMV2")
    If IsObj($objWMIService) Then
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_ComputerSystem", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    If IsObj($colItems) then
    For $objItem in $colItems
    $aCompListUser[$i][1] = $objItem.UserName
    Next
    Endif
    EndIf
    Next
    $aCompList = ""
    _ArrayDisplay($aCompListUser)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func WMIDateStringToDate($dtmDate)
    Return (StringMid($dtmDate, 5, 2) & "/" & _
    StringMid($dtmDate, 7, 2) & "/" & StringLeft($dtmDate, 4) _
    & " " & StringMid($dtmDate, 9, 2) & ":" & StringMid($dtmDate, 11, 2) & ":" & StringMid($dtmDate,13, 2))
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _NetServerEnum ($iSrvType = -1, $sDomain = '')
    Local $uBufPtr = DllStructCreate("ptr;int;int"), $res[1]=[0], $i
    Local $uRecord = DllStructCreate("dword;ptr"), $iRecLen = DllStructGetSize($uRecord)
    Local $uString = DllStructCreate("char[16]")
    Local $uDomain = DllStructCreate("byte[32]"), $pDomain = 0
    If Not ($sDomain='' Or $sDomain='*') Then
    DllStructSetData($uDomain, 1, StringToBinary($sDomain,2))
    $pDomain = DllStructGetPtr($uDomain)
    EndIf
    Local $ret = DllCall ("netapi32.dll", "int", "NetServerEnum", _
    "ptr", 0, "int", 100, _
    "ptr", DllStructGetPtr($uBufPtr,1), "int", -1, _
    "ptr", DllStructGetPtr($uBufPtr,2), _
    "ptr", DllStructGetPtr($uBufPtr,3), _
    "int", $iSrvType, "ptr", $pDomain, "int", 0 )
    If $ret[0] Then Return SetError(1, $ret[0], '')
    Local $res[DllStructGetData($uBufPtr,3)+1]=[DllStructGetData($uBufPtr,3)]
    For $i=1 To DllStructGetData($uBufPtr,3)
    Local $uRecord = DllStructCreate("dword;ptr", DllStructGetData($uBufPtr,1)+($i-1)*$iRecLen)
    Local $sNBName = DllStructCreate("byte[32]", DllStructGetData($uRecord,2))
    DllStructSetData($uString,1,BinaryToString(DllStructGetData($sNBName,1),2))
    $res[$i] = DllStructGetData($uString,1)
    Next
    $ret = DllCall ("netapi32.dll", "int", "NetApiBufferFree", "ptr", DllStructGetData($uBufPtr,1))
    Return $res
    EndFunc

    [/autoit]

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Ich hab's jetzt mal so ähnlich wie "Micha he" versucht. Per WMI frage ich alle Rechner in der Domäne ab wer dort angemeldet ist.
    Ist natürlich zeitlich nicht akzeptabel. Werde mir jetzt wohl ne andere Lösung überlegen müssen. Das mit dem Login-Script wäre auch noch ne
    Idee... Danke für Eure Antworten.