User und Secutity Groups aus einem AD auslesen?

  • Hallo,

    gibt es eine Möglichkeit mit AutoIT User und SecutiryGroups aus einem MS Active Directory auszulesen? ich hab schon was für LDAP gefunden, aber ich glaube nicht das ich damit auch auf einem MS System arbeiten kann, oder?

    Ziel ist ein Drop Down menü (o.Ä.), wo erst alle Secutity Groups aufgelistet sind, und nacher alle Nutzer der Domäne.

    Gruß

    Xantos

    • Offizieller Beitrag

    Hallo,

    ich habe vor einiger Zeit mal ein Testscript geschrieben, vllt. kannst Du damit ja was anfangen!


    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #Include <GuiListView.au3>
    #Include <GuiStatusBar.au3>
    #include <Date.au3>

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

    Const $wbemFlagReturnImmediately = 0x10
    Const $wbemFlagForwardOnly = 0x20

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

    Local $objWINNTService, $objWMIService
    Local $arSBPartsSize[2] = [200, -1]
    Local $arSBPartsText[2] = ["Benutzer: 0 Gruppen: 0", ""]

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

    Opt("GUIOnEventMode", 1)

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

    #Region ### START Koda GUI section ### Form=d:\entwicklung\autoit3\myexamples\tools\nt userinfo\frmuserinfo.kxf
    $FrmUserInfo = GUICreate("", 1001, 720, -1, -1, BitOR($WS_SYSMENU, $WS_CAPTION, $WS_POPUP, $WS_POPUPWINDOW, $WS_BORDER, $WS_CLIPSIBLINGS))
    GUISetOnEvent($GUI_EVENT_CLOSE, "FrmUserInfoClose")
    GUISetOnEvent($GUI_EVENT_MINIMIZE, "FrmUserInfoMinimize")
    GUISetOnEvent($GUI_EVENT_MAXIMIZE, "FrmUserInfoMaximize")
    GUISetOnEvent($GUI_EVENT_RESTORE, "FrmUserInfoRestore")
    $LblServer = GUICtrlCreateLabel("Server:", 32, 38, 38, 17)
    GUICtrlSetOnEvent(-1, "LblServerClick")
    $IBServer = GUICtrlCreateInput(StringReplace(@LogonServer, "\", ""), 84, 36, 145, 21, BitOR($ES_UPPERCASE, $ES_AUTOHSCROLL))
    GUICtrlSetOnEvent(-1, "IBServerChange")
    $ButRead = GUICtrlCreateButton("&Lesen", 240, 34, 75, 26, 0)
    GUICtrlSetOnEvent(-1, "ButReadClick")
    $LVUsers = GUICtrlCreateListView("Benutzername|Vollständiger Name|Beschreibung|Letzte Anmeldung|Pw.-alter (t)|Mitglied von", 24, 96, 940, 300, -1, BitOR($WS_EX_CLIENTEDGE, $LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT))
    GUICtrlSendMsg($LVUsers, 0x101E, 0, 150)
    GUICtrlSendMsg($LVUsers, 0x101E, 1, 150)
    GUICtrlSendMsg($LVUsers, 0x101E, 2, 200)
    GUICtrlSendMsg($LVUsers, 0x101E, 3, 100)
    GUICtrlSendMsg($LVUsers, 0x101E, 4, 80)
    GUICtrlSendMsg($LVUsers, 0x101E, 5, 250)
    GUICtrlSetOnEvent(-1, "LVUsersClick")
    GUICtrlSetState(-1, $GUI_DISABLE)
    $LVGroups = GUICtrlCreateListView("Gruppe|Beschreibung|Mitglieder", 24, 432, 940, 200, -1, BitOR($WS_EX_CLIENTEDGE, $LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT))
    GUICtrlSendMsg($LVGroups, 0x101E, 0, 150)
    GUICtrlSendMsg($LVGroups, 0x101E, 1, 200)
    GUICtrlSendMsg($LVGroups, 0x101E, 2, 590)
    GUICtrlSetOnEvent(-1, "LVGroupsClick")
    GUICtrlSetState(-1, $GUI_DISABLE)

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

    $SBInfo = _GUICtrlStatusBar_Create($FrmUserInfo, $arSBPartsSize, $arSBPartsText)

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

    $objWINNTService = ObjGet("WinNT://" & GUICtrlRead($IBServer))
    $objWMIService = ObjGet("winmgmts:\\" & GUICtrlRead($IBServer) & "\root\CIMV2")

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

    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    _GUICtrlListView_JustifyColumn($LVUsers, 3, 1)
    _GUICtrlListView_JustifyColumn($LVUsers, 4, 1)

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

    _GUICtrlStatusBar_SetText($SBInfo, "Benutzer: " & _GUICtrlListView_GetItemCount($LVUsers) & " Gruppen: " & _GUICtrlListView_GetItemCount($LVGroups), 0)

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

    Dim $B_DESCENDING_USERS[_GUICtrlListView_GetColumnCount($LVUsers) ]
    Dim $B_DESCENDING_GROUPS[_GUICtrlListView_GetColumnCount($LVGroups) ]

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

    ;Register WM_NOTIFY events
    GUIRegisterMsg($WM_NOTIFY, "WM_Notify_Events")

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

    While 1
    $strTitle = "Benutzer-/Gruppenverwaltung - " & GUICtrlRead($IBServer)

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

    If WinGetTitle($FrmUserInfo) <> $strTitle Then WinSetTitle($FrmUserInfo, "", $strTitle)

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

    Sleep(100)
    WEnd

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

    Func ButReadClick()
    GUICtrlSetState($LVUsers, $GUI_DISABLE)
    GUICtrlSetState($LVGroups, $GUI_DISABLE)
    _GUICtrlListView_DeleteAllItems($LVUsers)
    _GUICtrlListView_DeleteAllItems($LVGroups)
    _GUICtrlStatusBar_SetText($SBInfo, "Benutzer: " & _GUICtrlListView_GetItemCount($LVUsers) & " Gruppen: " & _GUICtrlListView_GetItemCount($LVGroups), 0)
    _GUICtrlStatusBar_SetText($SBInfo, "Daten werden eingelesen! Bitte warten...", 1)

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

    For $objWINNT In $objWINNTService
    $strName = $objWINNT.name
    ConsoleWrite($objWINNT & @LF)

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

    Switch $objWINNT.Class
    Case "user"
    $Line = _GetUserInfo(GUICtrlRead($IBServer), $strName, "|")
    GUICtrlCreateListViewItem($Line, $LVUsers)

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

    Case "group"
    $Line = _GetGroupInfo(GUICtrlRead($IBServer), $strName, "|")
    GUICtrlCreateListViewItem($Line, $LVGroups)

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

    EndSwitch
    _GUICtrlStatusBar_SetText($SBInfo, "Benutzer: " & _GUICtrlListView_GetItemCount($LVUsers) & " Gruppen: " & _GUICtrlListView_GetItemCount($LVGroups), 0)
    Next
    _GUICtrlStatusBar_SetText($SBInfo, "", 1)
    GUICtrlSetState($LVUsers, $GUI_ENABLE)
    GUICtrlSetState($LVGroups, $GUI_ENABLE)
    EndFunc ;==>ButReadClick

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

    Func FrmUserInfoClose()
    Exit
    EndFunc ;==>FrmUserInfoClose

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

    Func FrmUserInfoMaximize()
    _GUICtrlStatusBar_Resize($SBInfo)
    EndFunc ;==>FrmUserInfoMaximize

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

    Func FrmUserInfoMinimize()
    _GUICtrlStatusBar_Resize($SBInfo)
    EndFunc ;==>FrmUserInfoMinimize

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

    Func FrmUserInfoRestore()
    _GUICtrlStatusBar_Resize($SBInfo)
    EndFunc ;==>FrmUserInfoRestore

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

    Func IBServerChange()
    _GUICtrlListView_DeleteAllItems($LVUsers)
    $objWINNTService = ObjGet("WinNT://" & GUICtrlRead($IBServer))
    $objWMIService = ObjGet("winmgmts:\\" & GUICtrlRead($IBServer) & "\root\CIMV2")
    EndFunc ;==>IBServerChange

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

    Func LblServerClick()

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

    EndFunc ;==>LblServerClick

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

    Func LVGroupsClick()
    _GUICtrlStatusBar_SetText($SBInfo, "Daten werden sortiert! Bitte warten...", 1)
    _GUICtrlListView_SimpleSort($LVGroups, $B_DESCENDING_GROUPS, GUICtrlGetState($LVGroups))
    _GUICtrlStatusBar_SetText($SBInfo, "", 1)
    EndFunc ;==>LVGroupsClick

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

    Func LVUsersClick()
    _GUICtrlStatusBar_SetText($SBInfo, "Daten werden sortiert! Bitte warten...", 1)
    _GUICtrlListView_SimpleSort($LVUsers, $B_DESCENDING_USERS, GUICtrlGetState($LVUsers))
    _GUICtrlStatusBar_SetText($SBInfo, "", 1)
    EndFunc ;==>LVUsersClick

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

    Func _GetUserInfo($strComputer, $strUserID, $strSep = ";")
    $strInfos = ""

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

    $OEvent = ObjEvent("AutoIt.Error", "nothing") ; Bei Fehler weitermachen, entspricht "On Error Resume Next"
    $objWINNTUserID = ObjGet("WinNT://" & $strComputer & "/" & $strUserID & ",user")
    ;~ $colItemsUserID = $objWMIService.ExecQuery ("SELECT * FROM Win32_UserAccount where name ='" & $strUserID & "'", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

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

    ;~ If IsObj($colItemsUserID) Then
    ;~ For $colItemUserID In $colItemsUserID
    ;~ If $colItemUserID.Disabled = 0 Then
    ;~ $strInfos &= "J"
    ;~ Else
    ;~ $strInfos &= "N"
    ;~ EndIf
    ;~ $strInfos &= $strSep
    ;~ Next
    ;~ Else
    ;~ $strInfos &= $strSep
    ;~ EndIf
    $strInfos &= $objWINNTUserID.name
    $strInfos &= $strSep
    $strInfos &= $objWINNTUserID.fullname
    $strInfos &= $strSep
    $strInfos &= $objWINNTUserID.description
    $strInfos &= $strSep
    If $objWINNTUserID.lastlogin Then $strInfos &= WMIDateStringToDate($objWINNTUserID.lastlogin)
    $strInfos &= $strSep
    If $objWINNTUserID.PasswordAge Then $strInfos &= _DateDiff("D", _DateAdd('s', -$objWINNTUserID.PasswordAge, _NowCalc()), _NowCalc())
    $strInfos &= $strSep
    For $group In $objWINNTUserID.Groups
    $strInfos &= $group.name & ","
    Next

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

    Return StringTrimRight($strInfos, 1)
    EndFunc ;==>_GetUserInfo

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

    Func _GetGroupInfo($strComputer, $strGroupID, $strSep = ";")
    $strInfos = ""

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

    $OEvent = ObjEvent("AutoIt.Error", "nothing") ; Bei Fehler weitermachen, entspricht "On Error Resume Next"
    $objWINNTGroupID = ObjGet("WinNT://" & $strComputer & "/" & $strGroupID & ",group")

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

    $strInfos &= $objWINNTGroupID.name
    $strInfos &= $strSep
    $strInfos &= $objWINNTGroupID.description
    $strInfos &= $strSep
    For $Member In $objWINNTGroupID.Members
    $strInfos &= $Member.name & ","
    Next

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

    Return StringTrimRight($strInfos, 1)
    EndFunc ;==>_GetGroupInfo

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

    Func nothing()

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

    EndFunc ;==>nothing

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

    Func WMIDateStringToDate($strDate)
    Return StringMid($strDate, 1, 4) & "/" & StringMid($strDate, 5, 2) & "/" & StringMid($strDate, 7, 2) & _
    " " & StringMid($strDate, 9, 2) & ":" & StringMid($strDate, 11, 2) & ":" & StringMid($strDate, 13, 2)
    EndFunc ;==>WMIDateStringToDate

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

    ; WM_NOTIFY event handler
    Func WM_Notify_Events($hWndGUI, $MsgID, $wParam, $lParam)
    #forceref $hWndGUI, $MsgID, $wParam
    Local $tagNMHDR, $event, $hwndFrom, $code
    $tagNMHDR = DllStructCreate("int;int;int", $lParam);NMHDR (hwndFrom, idFrom, code)
    If @error Then Return
    $event = DllStructGetData($tagNMHDR, 3)
    Switch $wParam
    Case $LVGroups
    If $event = $NM_CLICK Then _GUICtrlListView_SetItemSelected($LVUsers, _GUICtrlListView_GetSelectedColumn($LVUsers), 1)

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

    Case $LVUsers
    If $event = $NM_CLICK Then _GUICtrlListView_SetItemSelected($LVGroups, _GUICtrlListView_GetSelectedColumn($LVGroups), 1)

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

    EndSwitch
    $tagNMHDR = 0
    $event = 0
    $lParam = 0
    EndFunc ;==>WM_Notify_Events

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit]
  • ich hab auch noch was:

    Spoiler anzeigen
    [autoit]


    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.2.2.0
    Author: Mirko Kühne
    B.A.S. Verkehrstechnik AG
    (freundliche Unterstützung aus dem AutoItforum durch: Bugfix)

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

    Script Function:
    Überprüfung der Mitgliedschaft zu einer Domänen-Gruppe

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

    #ce ----------------------------------------------------------------------------

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

    msgbox(0,"Gruppe überprüfen","Status der Gruppenmitgliedschaft (1=ja,0=nein): " & _mkMemberOfgroup("team-it")) ; <gruppen_name> durch den zu prüfenden

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

    Func _mkMemberOfGroup($mkGroupName); Beginn der Funktion mit Übergabe der zu überprüfenden Gruppe
    $wbemFlagReturnImmediately = 0x10; Variable $wbemFlagReturnImmediately setzen
    $wbemFlagForwardOnly = 0x20; Variable $wbemFlagForwardOnly setzen
    $colItems = ""; Variable $collItems setzen
    $objWMIService = ObjGet("winmgmts:\\localhost\root\CIMV2"); Objekt erstellen
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_GroupUser", _; Aus dem Objekt $objWMIService eine WMI-Abfrage auf alle Win32_GroupUser ausführen
    "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly); Ergebnis wird als Objekt in der Variablen $collItems gespeichert

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

    If IsObj($colItems) then; Falls ein Objekt erstellt wurde
    For $objItem In $colItems; Beginn der Schleife
    IF StringInStr($objitem.GroupComponent,$mkGroupName) _; Überprüfung, ob GroupComponent den zu überprüfenden Gruppennamen
    AND StringInStr($objitem.GroupComponent,@LogonDomain) _; UND GroupComponent die Domäne
    AND StringInStr($objitem.PartComponent,@UserName) THEN return 1; UND PartComponent den Benutzernamen (loginname)enthält, DANN Wahrheitswert zurückliefern
    Next; Ende der Schleife
    return 0; es konnte keine Übereinstimmung gefunden werden, Fehlerwert zurückliefern
    Endif; Ende der Bedingung
    EndFunc

    [/autoit]


    bzw. folgendes, da wird geprüft, ob der aktuelle user mitgleid einer bestimmten gruppe ist!

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    If IsMemberOf("team-it",@username) = 1then
    MsgBox(0, "AD","in der Gruppe")

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

    Else
    MsgBox(0, "AD","nicht in der Gruppe")
    EndIf

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

    ; IsMemberOf
    ; Takes the groupname (SamAccountName with or without the leading 'CN=', and the SamAccountName of the user
    ; Returns 1 if the the user is a member of the group, 0 otherwise

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

    Func IsMemberOf($group, $user)
    If StringLeft($group, 3) <> "CN=" Then
    $group = "CN=" & $group
    EndIf
    Dim $usergroups[1], $i = 1

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

    Dim $objConnection, $oUsr

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

    $objConnection = ObjCreate("ADODB.Connection") ; Create COM object to AD
    $objConnection.Provider = "ADsDSOObject"
    $objConnection.Open ("Active Directory Provider") ; Open connection to AD

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

    $objRootDSE = ObjGet("LDAP://RootDSE")
    Global $strDNSDomain = $objRootDSE.Get ("defaultNamingContext") ; Retrieve the current AD domain name

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

    $strQuery = "<LDAP://" & $strDNSDomain & ">;(sAMAccountName=" & $user & ");ADsPath;subtree"
    $objRecordSet = $objConnection.Execute ($strQuery) ; Retrieve the FQDN for the logged on user
    $ldap_entry = $objRecordSet.fields (0).value
    $oUsr = ObjGet($ldap_entry) ; Retrieve the COM Object for the logged on user
    $groups = $oUsr.groups ; Get the list of group objects from the user

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

    For $groupname In $groups
    If $groupname.name = $group Then Return 1

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

    Next
    Return 0

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

    EndFunc ;==>IsMemberOf

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


    in der "adfunctions.au3" sind die funtionen beschrieben....
    ich musste aber bei einem bestimmten projekt auf kix zurückgreifen, weil er mir die gruppenmitgliedschaft nicht bei jedem user ordnungsgemäß ausgelesen hat, bzw. es hat zu lange gedauert...

    hier mal das kix "user" dazu:

    hier der aufruf über autoit:

    [autoit]


    Run(@ComSpec & " /c \\server\NETLOGON\kix32 \\server\NETLOGON\user.kix", "", @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)

    [/autoit]


    ;)
    gruß gmmg

    4 Mal editiert, zuletzt von gmmg (20. Mai 2008 um 09:38)