Benutzerverwaltung NT4 Server

  • Hey,

    ich habe leider noch die "Ehre" mich mit NT4 Server auf der Arbeit quälen zu dürfen. Wie jeder sicherlich weis, sind nützliche Tools für NT4 Server sehr Rar. Da wir allerdings davon noch nicht wegkommen, muss ich wohl etwas tricksen.
    Ich habe eine GUI erstellt, mit dessen Hilfe ich mehrer Benutzer anlegen lassen kann.
    Der bisherige Code ist :

    Spoiler anzeigen
    [autoit]


    #include <GUIConstants.au3>
    #include <file.au3>
    #include <GuiListView.au3>
    #include <date.au3>

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

    GUICreate("UserPad - Benutzer", 450, 500)

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

    ;///////////////////////Tab für Benutzerverwaltung///////////////////////
    $Tab_UserInterface = GUICtrlCreateTab(1,1,450,500)
    $Tab_UserItem = GUICtrlCreateTabItem("Benutzer anlegen")

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

    ;///////////////////////Auswahl der TXT Datei für Benutzer///////////////////////

    $Tab_UserItem_Input_TXTFile = GUICtrlCreateInput("", 10, 30,250,20)
    $Tab_UserItem_Btn_BrowseTXTFile = GUICtrlCreateButton("Durchsuchen", 270, 27)
    $Tab_UserItem_Btn_CreateUser = GUICtrlCreateButton("Benutzer anlegen", 350, 27)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlCreateLabel ("Anzahl der ausgelesenen Benutzer: ", 10, 60)
    $Tab_UserItem_Label_Listview_items = GUICtrlCreateLabel ("0", 190, 60, 40)
    $Tab_UserItem_Label_Percent = GUICtrlCreateLabel("0",410,60,40)
    $Tab_UserItem_Label_PercentSign = GUICtrlCreateLabel("%", 430, 60, 10)
    $Tab_UserItem_Progressbar_UserState = GUICtrlCreateProgress(10, 80, 430, 10, $PBS_SMOOTH)

    ;///////////////////////Listbox mit allen in der TXT-Datei enthaltenen Benutzern///////////////////////

    $Tab_UserItem_Listview_User = GUICtrlCreateListView("Benutzername |Nachname |Vorname |Passwort |Klasse", 10, 100, 430, 300)

    ;///////////////////////Festlegen der Spalten breiten im ListView Feld///////////////////////

    _GUICtrlListViewSetColumnWidth ($Tab_UserItem_Listview_User, 0, 120);Benutzername
    _GUICtrlListViewSetColumnWidth ($Tab_UserItem_Listview_User, 1, 80);Nachname
    _GUICtrlListViewSetColumnWidth ($Tab_UserItem_Listview_User, 2, 80);Vorname
    _GUICtrlListViewSetColumnWidth ($Tab_UserItem_Listview_User, 3, 70);Passwort
    _GUICtrlListViewSetColumnWidth ($Tab_UserItem_Listview_User, 4, 70);Klasse

    ;///////////////////////Generieren von Tabs///////////////////////

    $Tab_UserCareItem = GUICtrlCreateTabItem("Benutzerverwaltung")

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

    $Tab_UserTemplate = GUICtrlCreateTabItem("Benutzervorlagen")

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

    ;///////////////////////Variable für Sortierfunktion///////////////////////

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

    Dim $B_DESCENDING[_GUICtrlListViewGetSubItemsCount ($Tab_UserItem_Listview_User) ]

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

    GUISetState()

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

    While 1
    $msg = GUIGetMsg()

    Switch $msg

    ;///////////////////////Klicken des Buttons "Durchsuchen"///////////////////////

    Case $Tab_UserItem_Btn_BrowseTXTFile
    $Tab_UserItem_Dest_TXTFile = FileOpenDialog("Bitte wählen Sie eine Datei aus", "", "TXT-Datei (*.txt)")
    GUICtrlSetData($Tab_UserItem_Input_TXTFile, $Tab_UserItem_Dest_TXTFile)
    If $Tab_UserItem_Dest_TXTFile <> "" Then
    $line = 1
    GUICtrlSetState($Tab_UserItem_Btn_CreateUser, $GUI_DISABLE)
    GUICtrlSetState($Tab_UserItem_Btn_BrowseTXTFile, $GUI_DISABLE)
    GUICtrlSetState($Tab_UserItem_Input_TXTFile, $GUI_DISABLE)
    While 1
    $read = FileReadLine($Tab_UserItem_Dest_TXTFile,$line)
    If @error = -1 Then ExitLoop
    $fill = ""
    $line = $line + 1
    $split = StringSplit($read,";")
    for $n = 1 to 5
    $fill = $fill & $split[$n] & "|"
    Next
    GUICtrlCreateListViewItem($fill,$Tab_UserItem_Listview_User)
    $Tab_UserItem_Listview_items = _GUICtrlListViewGetItemCount($Tab_UserItem_Listview_User)
    GUICtrlSetData($Tab_UserItem_Label_Listview_items, $Tab_UserItem_Listview_items)

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

    WEnd
    Else
    MsgBox(64, "Fehler", "Sie haben keine Datei ausgewählt")
    EndIf
    GUICtrlSetState($Tab_UserItem_Btn_CreateUser, $GUI_ENABLE)
    GUICtrlSetState($Tab_UserItem_Btn_BrowseTXTFile, $GUI_ENABLE)
    GUICtrlSetState($Tab_UserItem_Input_TXTFile, $GUI_ENABLE)

    ;///////////////////////Klicken des Buttons "Benutzer anlegen"///////////////////////

    Case $Tab_UserItem_Btn_CreateUser
    GUICtrlSetState($Tab_UserItem_Btn_CreateUser, $GUI_DISABLE)
    GUICtrlSetState($Tab_UserItem_Btn_BrowseTXTFile, $GUI_DISABLE)
    GUICtrlSetState($Tab_UserItem_Input_TXTFile, $GUI_DISABLE)

    ;///////////////////////Alle Benutzer aus der TXT-Datei werden hier angelegt///////////////////////

    $objUser = ObjGet("WinNT://VPC_NT4SRV_HH")
    For $i = 0 to $Tab_UserItem_Listview_items -1

    ;///////////////////////Rechnung für Progressbar///////////////////////

    $Tab_UserItem_Calc_Progressbar = $i/($Tab_UserItem_Listview_items-1)*100
    GUICtrlSetData($Tab_UserItem_Progressbar_UserState, $Tab_UserItem_Calc_Progressbar)
    $Tab_UserItem_PercentString = StringSplit($Tab_UserItem_Calc_Progressbar, ".")
    GUICtrlSetData($Tab_UserItem_Label_Percent, $Tab_UserItem_PercentString[1])

    $Tab_UserItem_Listview_column = _GUICtrlListViewGetItemText($Tab_UserItem_Listview_User, $i)
    $Tab_UserItem_split = StringSplit($Tab_UserItem_Listview_column,"|")
    $NewUser = $objUser.Create("user",$Tab_UserItem_split[1])
    $NewUser.FullName = $Tab_UserItem_split[3] &" "&$Tab_UserItem_split[2]
    $NewUser.Description = $Tab_UserItem_split[5]&" Schüler - angelegt am "&_NowDate()&" um "&_NowTime()
    $NewUser.SetPassword($Tab_UserItem_split[4])
    $NewUser.SetInfo()
    Next

    ;///////////////////////Erfolgesmeldung wenn Benutzer fertig angelegt wurden///////////////////////

    MsgBox(0,"Anzahl", "Es wurden von insgesamt "& $Tab_UserItem_Listview_items &" Benutzern "& $i &" angelegt")

    ;///////////////////////Nach Erfolg Buttons freigeben, alle Items aus ListView löschen und Input löschen///////////////////////

    _GUICtrlListViewDeleteAllItems ($Tab_UserItem_Listview_User)
    GUICtrlSetState($Tab_UserItem_Btn_CreateUser, $GUI_ENABLE)
    GUICtrlSetState($Tab_UserItem_Btn_BrowseTXTFile, $GUI_ENABLE)
    GUICtrlSetState($Tab_UserItem_Input_TXTFile, $GUI_ENABLE)
    GUICtrlSetData($Tab_UserItem_Input_TXTFile, "")
    GUICtrlSetData($Tab_UserItem_Label_Listview_items, "0")
    GUICtrlSetData($Tab_UserItem_Progressbar_UserState, "0")
    GUICtrlSetData($Tab_UserItem_Label_Percent, "0")

    ;///////////////////////Sortierfunktion für ListView Feld///////////////////////

    Case $Tab_UserItem_Listview_User

    _GUICtrlListViewSort($Tab_UserItem_Listview_User, $B_DESCENDING, GUICtrlGetState($Tab_UserItem_Listview_User))

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

    EndSwitch

    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
    Wend

    [/autoit]

    TO DO:
    -----------------------------------------------------------
    Benutzer anlegen:

    • Einträge aus ListView löschen und hinzufügen ohne TXT Datei zu bearbeiten(ContextMenu und Doppelklick Action)
    • Einbau Error Handle bei bereits existirenden Benutzern
    • Bei Fehlern -> Erzeugen von LOG-Datei


    Benutzerverwalten:

    • Gruppen Zugehörigkeit ändern
    • Passwort zurücksetzen
    • Benutzer(-gruppen) löschen
    • Benutzer editieren


    Benutzervorlagen:
    Dieser Punkt soll dazu dienen, dass ich eine Möglickeit habe ein "Template" anzulegen.
    Was ich damit meine ist folgendes:
    ein "Normaler"-Benutzer in einer Firma sieht meistens immer gleich aus. Er hat ein Loginscript, Homelaufwerk, Profilpfad etc.. Diese Einstellungen möchte ich definieren können, also quasi ein Benutzer aus der Abteilung X hat immer das Loginscript "AbteilungX.bat" und hat sein Homelaufwerk auf dem Pfad XYZ mit den Berechtigungen ZYX usw. Diese Einstellungen werden dann gespeichert (Speicherung in INI-Datei sehr wahrscheinlich). Beim anlegen neuer Benutzer, wähle ich dann das Template aus, was für den User gelten soll.

    Zurzeit versuche ich mich an dem ListView Feld und verzweifle mal wieder. Vielleicht ergeht es auch einigen Admins wie mir und ihr habt noch Spaß mit NT4. Ich würde mich freuen über Vorschläge und über eure Unterstützung :)

    Also dann Helft mir :D :]

    Danke wie immer an alle.

    Gruß
    Marc

    Einmal editiert, zuletzt von hessebou (26. September 2007 um 09:26)

  • Danke, hast mir in der Vergangenheit schon oft geholfen ;)

    Ich hänge an dem ListView. Will einen Eintrag auswählen (Doppelklick) und dann eine Edit-GUI öffnen lassen um den Eintrag zu editieren.

    Anbei habe ich mal eine Dummy TXT Datei.
    Vielleicht bist du schneller als ich :D (sicherlich)

    Gruß

    • Offizieller Beitrag

    Hi,

    so sollte es gehen:

    Spoiler anzeigen
    [autoit]

    #include <GuiConstants.au3>
    #include <GuiListview.au3>
    Opt("GUIOnEventMode", 1)

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

    Global Const $DebugIt = 1

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

    Global Const $WM_NOTIFY = 0x004E

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

    Global Const $NM_FIRST = 0
    Global Const $NM_CLICK = ($NM_FIRST - 2)
    Global Const $NM_DBLCLK = ($NM_FIRST - 3)

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

    Global $ListView = -999
    Global $Gui, $editFlag
    Global $editCtrl = "Edit1";name of the Edit control that pops up when edit a listitem....
    Global $editCtrlHandle
    Global $dll

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

    _Main()

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

    Func _Main()
    $Gui = GUICreate("Double Click Demo", 417, 356, 192, 125)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Terminate")
    $ListView = GUICtrlCreateListView("Items", 10, 10, 300, 200, $LVS_EDITLABELS);Important Style!!!
    $Property_Selection_Combobox = GUICtrlCreateCombo("New .....", 11, 304, 136, 25)
    GUICtrlSendMsg($ListView, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES)
    ; Populate list and make it wide enough to see
    For $i = 1 To 10
    GUICtrlCreateListViewItem("DoubleClick or press F2, then press Enter", $ListView)
    Next
    GUICtrlSendMsg($ListView, 0x101E, 0, -1);$listview, LVM_SETCOLUMNWIDTH, 0, resize to widest value
    GUISetState(@SW_SHOW)
    ;Register WM_NOTIFY events
    GUIRegisterMsg($WM_NOTIFY, "WM_Notify_Events")
    $dll = DllOpen("user32.dll")
    While 1
    Sleep(100)
    _MonitorEditState($Gui, $editCtrl, $editFlag, $ListView, $dll)
    WEnd
    EndFunc ;==>_Main

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

    Func _Terminate()
    DllClose($dll)
    Exit
    EndFunc ;==>_Terminate

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

    Func ListView_GetEditControl($h_ListView)
    Local $lResult = _SendMessage($h_ListView, $LVM_GETEDITCONTROL)
    If @error Then Return SetError(-1, -1, 0)
    Return $lResult
    EndFunc ;==>ListView_GetEditControl

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

    Func ListView_Click()
    ;----------------------------------------------------------------------------------------------
    If $DebugIt Then _DebugPrint("$NM_CLICK")
    ;----------------------------------------------------------------------------------------------
    If $editCtrlHandle Then
    CancelEdit($ListView)
    $editFlag = 0
    EndIf
    EndFunc ;==>ListView_Click

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

    Func ListView_DoubleClick()
    ;----------------------------------------------------------------------------------------------
    If $DebugIt Then _DebugPrint("$NM_DBLCLK")
    ;----------------------------------------------------------------------------------------------
    Rename($ListView)
    $editCtrlHandle = ListView_GetEditControl(ControlGetHandle($Gui, '', $ListView))
    EndFunc ;==>ListView_DoubleClick

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

    ; WM_NOTIFY event handler
    Func WM_Notify_Events($hWndGUI, $MsgID, $wParam, $lParam)
    #forceref $hWndGUI, $MsgID, $wParam
    Local $tagNMHDR, $event
    $tagNMHDR = DllStructCreate("int;int;int;int;int;int;int;int;ptr;int;int;int;int", $lParam);NMHDR (hwndFrom, idFrom, code)
    If @error Then Return
    $event = DllStructGetData($tagNMHDR, 3)
    Select
    Case $wParam = $ListView
    Select
    Case $event = $NM_CLICK
    ListView_Click()
    Case $event = $NM_DBLCLK
    ListView_DoubleClick()
    EndSelect
    EndSelect
    $tagNMHDR = 0
    $event = 0
    $lParam = 0
    ; Proceed the default Autoit3 internal message commands.
    ; You also can complete let the line out.
    ; !!! But only 'Return' (without any value) will not proceed
    ; the default Autoit3-message in the future !!!
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_Notify_Events

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

    Func _DebugPrint($s_text)
    $s_text = StringReplace($s_text, @LF, @LF & "-->")
    ConsoleWrite("!===========================================================" & @LF & _
    "+===========================================================" & @LF & _
    "-->" & $s_text & @LF & _
    "+===========================================================" & @LF)
    EndFunc ;==>_DebugPrint

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

    Func _MonitorEditState(ByRef $h_gui, ByRef $editCtrl, ByRef $editFlag, ByRef $ListView, ByRef $dll)

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

    Local $pressed = _IsPressedMod($dll)
    If $editFlag And $pressed = 13 Then; pressed enter
    Update($h_gui, $editCtrl, $ListView)
    ElseIf $editFlag And $pressed = 27 Then; pressed esc
    CancelEdit($ListView)
    $editFlag = 0
    ElseIf Not $editFlag And $pressed = 113 Then; pressed f2
    Rename($ListView)
    EndIf
    Sleep(50)

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

    If $editCtrlHandle Then
    If $editFlag = 0 Then
    Rename($ListView)
    EndIf
    Else
    $editFlag = 0
    EndIf

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

    EndFunc ;==>_MonitorEditState

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

    Func Rename(ByRef $ListView)
    Local $itemIndex = _GUICtrlListViewGetCurSel($ListView)
    GUICtrlSendMsg($ListView, $LVM_EDITLABEL, $itemIndex, 0)
    $editFlag = 1
    HotKeySet("{Enter}", "Enter")
    EndFunc ;==>Rename

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

    Func Enter()
    Update($Gui, $editCtrl, $ListView)
    EndFunc ;==>Enter

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

    Func Update(ByRef $h_gui, ByRef $editCtrl, ByRef $ListView)
    Local $newText = ControlGetText($h_gui, "", $editCtrl)
    Local $item = GUICtrlRead($ListView)
    GUICtrlSetData($item, $newText)
    HotKeySet("{Enter}")
    Send("{Enter}");quit edit mode
    $editFlag = 0
    $update = 0
    $editCtrlHandle = 0
    EndFunc ;==>Update

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

    Func CancelEdit(ByRef $ListView)
    GUICtrlSendMsg($ListView, $LVM_CANCELEDITLABEL, 0, 0)
    EndFunc ;==>CancelEdit

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

    Func _IsPressedMod($dll = "user32.dll")
    Local $aR, $bRv, $hexKey, $i
    For $i = 8 To 128
    $hexKey = '0x' & Hex($i, 2)
    $aR = DllCall($dll, "int", "GetAsyncKeyState", "int", $hexKey)
    If $aR[0] <> 0 Then Return $i
    Next
    Return 0
    EndFunc ;==>_IsPressedMod

    [/autoit]

    Oder halt ne Extra-GUI machen und dort die einzelnen Felder als INputfeld anzeigen mit einem Speichern Button. Ist die einfache Variante :)

    So long,

    Mega