#region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_Res_requestedExecutionLevel=asInvoker
#endregion ;**** Directives created by AutoIt3Wrapper_GUI ****


Opt("WinTitleMatchMode", 2)
Opt("TrayIconDebug", 0)
Opt("TrayIconHide", 1)
Opt("GUICloseOnESC", 0)
Opt("MustDeclareVars", 0)

If Not @Compiled Then
	Opt("TrayIconDebug", 1)
	Opt("TrayIconHide", 0)
EndIf

#include <Array.au3>
#include <Date.au3>
#include <GUIConstants.au3>
#include <ButtonConstants.au3>
#include <IE.au3>
#include <GuiStatusBar.au3>
#include <File.au3>
#include <Math.au3>
#include <Misc.au3>
#include <ComboConstants.au3>
#include <GuiListView.au3>
#include <INet.au3>
#include <String.au3>
#include <localization.au3>
#include <MsgBoxConstants.au3>

#region  ; Define AD Constants
Global Const $ADS_GROUP_TYPE_GLOBAL_GROUP = 0x2
Global Const $ADS_GROUP_TYPE_DOMAIN_LOCAL_GROUP = 0x4
Global Const $ADS_GROUP_TYPE_UNIVERSAL_GROUP = 0x8
Global Const $ADS_GROUP_TYPE_SECURITY_ENABLED = 0x80000000
Global Const $ADS_GROUP_TYPE_GLOBAL_SECURITY = BitOR($ADS_GROUP_TYPE_GLOBAL_GROUP, $ADS_GROUP_TYPE_SECURITY_ENABLED)
Global Const $ADS_GROUP_TYPE_UNIVERSAL_SECURITY = BitOR($ADS_GROUP_TYPE_UNIVERSAL_GROUP, $ADS_GROUP_TYPE_SECURITY_ENABLED)
Global Const $ADS_GROUP_TYPE_DOMAIN_LOCAL_SECURITY = BitOR($ADS_GROUP_TYPE_DOMAIN_LOCAL_GROUP, $ADS_GROUP_TYPE_SECURITY_ENABLED)

Global Const $ADS_UF_PASSWD_NOTREQD = 0x0020
Global Const $ADS_UF_WORKSTATION_TRUST_ACCOUNT = 0x1000
Global Const $ADS_ACETYPE_ACCESS_ALLOWED = 0x0
Global Const $ADS_ACETYPE_ACCESS_ALLOWED_OBJECT = 0x5
Global Const $ADS_ACETYPE_ACCESS_DENIED_OBJECT = 0x6
Global Const $ADS_FLAG_OBJECT_TYPE_PRESENT = 0x1
Global Const $ADS_RIGHT_GENERIC_READ = 0x80000000
Global Const $ADS_RIGHT_DS_SELF = 0x8
Global Const $ADS_RIGHT_DS_WRITE_PROP = 0x20
Global Const $ADS_RIGHT_DS_CONTROL_ACCESS = 0x100
Global Const $ADS_UF_ACCOUNTDISABLE = 2
Global Const $ADS_OPTION_SECURITY_MASK = 3
Global Const $ADS_SECURITY_INFO_DACL = 4
Global Const $ADS_UF_DONT_EXPIRE_PASSWORD = 0x10000

Global Const $ALLOWED_TO_AUTHENTICATE = "{68B1D179-0D15-4d4f-AB71-46152E79A7BC}"
Global Const $RECEIVE_AS = "{AB721A56-1E2f-11D0-9819-00AA0040529B}"
Global Const $SEND_AS = "{AB721A54-1E2f-11D0-9819-00AA0040529B}"
Global Const $USER_CHANGE_PASSWORD = "{AB721A53-1E2f-11D0-9819-00AA0040529b}"
Global Const $USER_FORCE_CHANGE_PASSWORD = "{00299570-246D-11D0-A768-00AA006E0529}"
Global Const $USER_ACCOUNT_RESTRICTIONS = "{4C164200-20C0-11D0-A768-00AA006E0529}"
Global Const $VALIDATED_DNS_HOST_NAME = "{72E39547-7B18-11D1-ADEF-00C04FD8D5CD}"
Global Const $VALIDATED_SPN = "{F3A64788-5306-11D1-A9C5-0000F80367C1}"
Const $Member_SchemaIDGuid = "{BF9679C0-0DE6-11D0-A285-00AA003049E2}"
#endregion  ; Define AD Constants


Global $objConnection = ObjCreate("ADODB.Connection") ; Create COM object to AD
If @error Then
	MsgBox(16, "Problem", $texts[$language][0])
	Exit
EndIf
$objConnection.ConnectionString = "Provider=ADsDSOObject"
$objConnection.Open("Active Directory Provider") ; Open connection to AD

Global $rs = ObjCreate("ADODB.Recordset") ; Recordset für Suchergebnisse bei den Datenbanken
Global $ADSystemInfo = ObjCreate("ADSystemInfo")
Global $anzahl_pcs
Global $anzahl_ncs

#region  ; User Interface
$titel = "Benutzerinformationen MVV"
If @AutoItX64 Then
	$titel &= " [64 Bit]"
Else
	$titel &= " [32 Bit]"
EndIf

If @Compiled And _Singleton("Benutzerinformationen ", 1) = 0 Then ; wenn das Ding schon läuft, nur das laufende Exe nach vorne holen und sich dann selbst verabschieden
	WinActivate($titel)
	Exit
EndIf

$Form1 = GUICreate($titel, 1000, 768, -1, -1)
GUISetBkColor(0xeeeeee)
GUICtrlSetFont($Form1, 6)
$reihe1 = 36 ; Start der 1. Beschriftung
$reihe2 = 130 ; Start der 1. Werte
$reihe3 = 490 ; Start der 2. Beschriftung
$reihe4 = 570 ; Start der 2. Werte
$breite1 = 380 ; Breite der 1. Werte
$breite2 = 180 ; Breite der 2. Werte
$breite3 = 60
$breite4 = 220

Global Const $buttonreihe = 825
Global Const $buttonbreite = 150

GUICtrlCreateGroup($texts[$language][1], 820, 5, 160, 770)
$y = 20
; for some reason, the "flashing" of labels (when clicked) only works when labes are created after creating the buttons...
$bn_refresh = GUICtrlCreateButton($texts[$language][2], $buttonreihe, $y, $buttonbreite, 40)
GUICtrlSetImage(-1, "shell32.dll", 255)
$y += 40

$btn_userwechsel = GUICtrlCreateButton($texts[$language][4], $buttonreihe, $y, $buttonbreite, 40)
GUICtrlSetImage(-1, "shell32.dll", 23)
$y += 590

$bn_ende = GUICtrlCreateButton($texts[$language][19], $buttonreihe, $y, $buttonbreite, 40)
GUICtrlSetImage(-1, "shell32.dll", 28)
$y += 40

GUICtrlCreateGroup("", -99, -99, 1, 1) ;close group


$y = 10
GUICtrlCreateLabel($texts[$language][20], $reihe1, $y, 90, 17)
$lbl_name = GUICtrlCreateLabel("", $reihe2, $y, $breite1, 17)
GUICtrlSetFont(-1, -1, 800)
GUICtrlCreateLabel($texts[$language][21], $reihe3, $y, $breite3, 17)
$lbl_userid = GUICtrlCreateLabel("", $reihe4, $y, $breite4, 17)
GUICtrlSetFont(-1, -1, 800)

$y += 20
GUICtrlCreateLabel($texts[$language][24], $reihe1, $y, 90, 17)
$lbl_ou = GUICtrlCreateLabel("", $reihe2, $y, $breite1, 17)
GUICtrlSetFont(-1, -1, 800)

GUICtrlCreateLabel($texts[$language][25], $reihe3, $y, $breite3, 17)
$lbl_telefon = GUICtrlCreateLabel("", $reihe4, $y, $breite4, 17)
GUICtrlSetFont(-1, -1, 800)

$y += 20
GUICtrlCreateLabel($texts[$language][26], $reihe1, $y, 69, 17)
$lbl_abteilung = GUICtrlCreateLabel("", $reihe2, $y, $breite1, 17)
GUICtrlSetFont(-1, -1, 800)

GUICtrlCreateLabel($texts[$language][27], $reihe3, $y, $breite3, 17)
$lbl_domain = GUICtrlCreateLabel("", $reihe4, $y, $breite4, 17)
GUICtrlSetFont(-1, -1, 800)

$y += 20
GUICtrlCreateLabel($texts[$language][28], $reihe1, $y, 50, 17)
$lbl_email = GUICtrlCreateLabel("", $reihe2, $y, $breite1, 17)
GUICtrlSetFont(-1, -1, 800)

GUICtrlCreateLabel($texts[$language][29], $reihe3, $y, 69, 17)
$lbl_ort = GUICtrlCreateLabel("", $reihe4, $y, $breite4, 17)
GUICtrlSetFont(-1, -1, 800)

$y += 20

$breite4 = 330
$y += 10
GUICtrlCreateLabel($texts[$language][33], $reihe1, $y, 90, 17)
$lbl_aenderung = GUICtrlCreateLabel("", $reihe2, $y, 130, 17)
GUICtrlSetFont(-1, -1, 800)

GUICtrlCreateLabel($texts[$language][34], $reihe1 + 220, $y, 55, 17)
$lbl_expiration = GUICtrlCreateLabel("", $reihe1 + 280, $y, 130, 17)
GUICtrlSetFont(-1, -1, 800)

GUICtrlCreateLabel($texts[$language][35], $reihe3, $y, $breite3, 17)
$lbl_pwreq = GUICtrlCreateLabel("", $reihe4, $y, $breite4, 17)
GUICtrlSetFont(-1, -1, 800)

$y += 20

GUICtrlCreateLabel($texts[$language][36], $reihe3, $y, $breite3, 17)
$lbl_change = GUICtrlCreateLabel("", $reihe4, $y, $breite4, 17)
GUICtrlSetFont(-1, -1, 800)

$y += 20
GUICtrlCreateLabel($texts[$language][37], $reihe1, $y, 85, 17)
$lbl_gesperrt = GUICtrlCreateLabel("", $reihe2, $y, 30, 17)
GUICtrlSetFont(-1, -1, 800)
GUICtrlCreateLabel("/", $reihe2 + 30, $y, 5, 17)
$lbl_deakt = GUICtrlCreateLabel("-", $reihe2 + 40, $y, 50, 17)
GUICtrlSetFont(-1, -1, 800)

$bn_unlock = GUICtrlCreateButton($texts[$language][38], 200, $y - 4, 90, 20)

GUICtrlCreateLabel($texts[$language][39], $reihe3, $y, $breite3, 17)
$lbl_erzeugt = GUICtrlCreateLabel("", $reihe4, $y, $breite4, 17)
GUICtrlSetFont(-1, -1, 800)

$y += 20
GUICtrlCreateLabel($texts[$language][40], $reihe1, $y, 85, 17)
$lbl_errorcount = GUICtrlCreateLabel("", $reihe2, $y, 85, 17)
GUICtrlSetFont(-1, -1, 800)

GUICtrlCreateLabel($texts[$language][41], $reihe3, $y, $breite3, 17)
$lbl_login = GUICtrlCreateLabel("", $reihe4, $y, $breite4, 17)
GUICtrlSetFont(-1, -1, 800)

$y += 20
GUICtrlCreateLabel($texts[$language][42], $reihe1, $y, 89, 17)
$lbl_homeverz = GUICtrlCreateLabel("", $reihe2, $y, $breite1, 17)
GUICtrlSetFont(-1, -1, 800)

GUICtrlCreateLabel($texts[$language][43], $reihe3, $y, $breite3, 17)
$lbl_homelauf = GUICtrlCreateLabel("", $reihe4, $y, $breite4, 17)
GUICtrlSetFont(-1, -1, 800)

$y += 20
GUICtrlCreateLabel($texts[$language][44], $reihe1, $y, 55, 17)
$lbl_script = GUICtrlCreateLabel("", $reihe2, $y, $breite1, 17)
GUICtrlSetFont(-1, -1, 800)

GUICtrlCreateLabel($texts[$language][45], $reihe3, $y, $breite3, 17)
$lbl_profil = GUICtrlCreateLabel("", $reihe4, $y, $breite4, 17)
GUICtrlSetFont(-1, -1, 800)

$y += 25
$Gruppenliste = GUICtrlCreateListView($texts[$language][53], 8, $y, 800, 770 - $y)
_GUICtrlListView_SetColumnWidth($Gruppenliste, 0, 240)
_GUICtrlListView_SetColumnWidth($Gruppenliste, 1, 200)

$bar = _GUICtrlStatusBar_Create($Form1)


; Aufbau des Fensters für die Eingabe von Username und Domäne
$Form2 = GUICreate($titel, 470, 240, -1, -1)
GUICtrlCreateLabel("UserID/Name/Tel.:", 5, 8, 130, 17)
$edit = GUICtrlCreateInput(@UserName, 140, 5, 250, 20)
GUICtrlCreateLabel("Wildcards:", 5, 35, 100, 17)
$radio1 = GUICtrlCreateRadio("UserID", 110, 35, 70, 20)
GUICtrlSetState($radio1, $GUI_CHECKED)
$Enter_key = GUICtrlCreateDummy()
Dim $a_AccelKeys[1][2] = [["{ENTER}", $Enter_key]] ; Hotkey-Array für das Auswerten der Enter-Taste in Form2
GUISetAccelerators($a_AccelKeys, $Form2)


GUICtrlCreateLabel("Domain:", 5, 65, 100, 17)
$domain = GUICtrlCreateCombo("", 110, 62, 250, 250, $CBS_DROPDOWNLIST)
$btn_ok = GUICtrlCreateButton("Ok", 110, 90, 120, 25)
$btn_cancel = GUICtrlCreateButton($texts[$language][56], 240, 90, 120, 25)
$statusbar = _GUICtrlStatusBar_Create($Form2)

#endregion  ; User Interface

Global $oMyError = ""
$oMyError = ObjEvent("AutoIt.Error", "_ADDoError") ; Install a custom error handler

Dim $gruppen
Global $lw_m = ""
Global $lw_y = ""
Global $pc = ""
Global $user = ""
Global $objRootDSE
Global $strDNSDomain
Global $strHostServer
Global $strConfiguration
Global $intUAC
Global $oUsr
Global $objRecordSet
Global $time ; Zeitstempel fürs Stoppen des Auslesens der Userdaten
Global $pc_status = 0 ; PC online?
Global $cancel ; Flag zum Beenden der Domänensuche
Global $loopflag ; dient zur Kontrolle der Schleife bei der Userauswahl
Global $passwortdauer ; wie lang ein PW in der Domäne gültig ist

; ==================================================================================================================
;        Main program ;)
; ==================================================================================================================
Domaenenliste()
User_festlegen()

; ==================================================================================================================
;        Functions
; ==================================================================================================================

Func Domaenenliste() ; get all known Domains - and, in our case, select ours
	$oDS = ObjGet("WinNT:")
	$y = ""
	For $x In $oDS
		$y = $y & "|" & $x.Name
	Next
	GUICtrlSetData($domain, $y, "Konzern")
EndFunc   ;==>Domaenenliste

Func User_festlegen($userid_tmp = "")
	ControlFocus($titel, "", $btn_userwechsel)
	_GUICtrlStatusBar_SetText($statusbar, $texts[$language][58])
	$pc = ""
	$lw_m = ""
	GUISetState(@SW_HIDE, $Form1)
	GUISetState(@SW_SHOW, $Form2)

	$loopflag = 0
	If $userid_tmp <> "" Then
		GUICtrlSetData($edit, $userid_tmp)
		$loopflag = finde_domaene()
	EndIf

	If $loopflag = 0 Then
		ControlClick($titel, "", $edit)
		Send("+{home}")
		$loopflag = 1
		While $loopflag
			$msg = GUIGetMsg()
			Switch $msg
				Case $Enter_key
					finde_domaene()
				Case $GUI_EVENT_CLOSE
					$objConnection.Close
					Exit
				Case $btn_ok
					finde_domaene()
				Case $btn_cancel
					Exit
			EndSwitch
		WEnd
	EndIf
	GUISetState(@SW_HIDE, $Form2)

	; if we get here, useraccount has been found. -> get our values
	$ldap_entry = $objRecordSet.fields(0).value

	$oUsr = ObjGet($ldap_entry) ; Retrieve the COM Object for the logged on user
	$user = $oUsr.samAccountName ; get SamAccountname

	GUISetState(@SW_SHOW, $Form1)
	GUISetCursor(15, 1, $Form1)
	_GUICtrlStatusBar_SetText($bar, $texts[$language][59])

	ad_abfragen()
	GUISetCursor(2)
	GUILoop()
EndFunc   ;==>User_festlegen

Func GUILoop()
	While 1
		$nMsg = GUIGetMsg()
		Switch $nMsg
			Case $GUI_EVENT_CLOSE
				$objConnection.Close
				Exit
			Case $bn_ende
				$objConnection.Close
				Exit

			   _ArrayToClip($gruppen, 1)

			Case $bn_unlock
				Entsperren($user)

			Case $bn_refresh
				$time = TimerInit() ; Timer zurücksetzen
				ad_abfragen()
			Case $btn_userwechsel
				User_festlegen()
			Case $edit ; sonst wird der Text aus dem Edit-Feld der Suchmaske ins Clipboard kopiert wenn ein Treffer über Wildcardsuche erfolgte

			Case -100 To 0
				;
			Case Else
				$tmp = GUICtrlRead($nMsg)
				If $tmp <> "" Then ; nur, wenn auch ein Text erfasst wurde
					While StringLeft($tmp, 1) = "|" ; entferne führende Trennstriche
						$tmp = StringMid($tmp, 2)
					WEnd
					$tmp = StringReplace($tmp, "|", @CRLF)
					$tmp = StringReplace($tmp, @CRLF & @CRLF, "")
					ClipPut($tmp) ; kopiere in Zwischenablage
					_GUICtrlStatusBar_SetText($bar, $tmp & $texts[$language][60]) ; aktualisiere Statusleiste
					$x = ControlGetFocus($titel) ; finde heraus, worauf geklickt wurde
					If Not StringInStr($x, "SysListView32") Then ; Wenn nicht gerade etwas in der Gruppenliste angeklickt wurde
						GUICtrlSetBkColor($nMsg, 0xff0000) ; färbe den Eintrag rot
						Sleep(250) ; warte eine Viertelsekunde
						GUICtrlSetBkColor($nMsg, -1) ; und gib dem Text wieder die alte Farbe
					EndIf
				EndIf
		EndSwitch
		Sleep(50)
	WEnd
EndFunc   ;==>GUILoop

Func finde_domaene($user = "", $domaene = "")
	If $user = "" Then $user = GUICtrlRead($edit)
	If $domaene = "" Then $domaene = GUICtrlRead($domain)

	If $user <> "" Then
		$time = TimerInit()
		$user = StringStripWS($user, 3)

		$objRootDSE = ObjGet("LDAP://" & $domaene & "/RootDSE")
		If @error Then
			_GUICtrlStatusBar_SetText($statusbar, $texts[$language][61] & $domaene & $texts[$language][62])
			$loopflag = 1
			Return 0
		EndIf
		$strDNSDomain = $objRootDSE.Get("defaultNamingContext") ; Retrieve the current AD domain name
		$strHostServer = $objRootDSE.Get("dnsHostName") ; Retrieve the name of the connected DC
		$strConfiguration = $objRootDSE.Get("ConfigurationNamingContext") ; Retrieve the Configuration naming context

		Switch _ADObjectExists($user)
			Case 1 ; User wurde erfolgreich gefunden
				$loopflag = 0
				$x = ObjGet("WinNT://" & $domaene)
				$passwortdauer = $x.MaxPasswordAge
				Return 1
			Case -1 ; Suchbegriff lieferte mehrere Treffer, daher wurde die UserID ins Formular eingetragen
				ControlClick($titel, "", $btn_ok)
				Return 0 ; und brav wieder das Fensterchen anzeigen, nun aber mit der eindeutigen Userkennung
			Case 0 ; User wurde nicht gefunden
				_GUICtrlStatusBar_SetText($statusbar, $texts[$language][63] & $user & $texts[$language][64])
				$loopflag = 1
				Return 0
		EndSwitch
	EndIf
EndFunc   ;==>finde_domaene

Func ad_abfragen()
	$pc = ""
	$lastlogon = "-"
	GUICtrlSetData($lbl_homelauf, "")
	GUICtrlSetData($lbl_homeverz, "")
	GUICtrlSetData($lbl_script, "")
	_GUICtrlListView_DeleteAllItems($Gruppenliste)
	_ADGetUserData($user)
	_ADGetUserGroups($gruppen, $user)
	_ADGetAccount($user)
	DB_Abfrage($user)

	$tmp = $oUsr.scriptpath

	If $lastlogon = "-" Then ; Domänen LastLogin auswerten
		$tmp = $oUsr.LastLogin
		If $tmp <> "" Then
			$lastlogon = Zeit($oUsr.LastLogin)
		Else
			$lastlogon = $texts[$language][65]
		EndIf
	EndIf
	GUICtrlSetData($lbl_login, $lastlogon)

	$tmp = TimerDiff($time) / 1000
	$tmp1 = StringFormat("%.2f", $tmp)
	$tmp = TimerDiff($time) / 1000
	$tmp2 = StringFormat("%.2f", $tmp)
	_GUICtrlStatusBar_SetText($bar, $texts[$language][66] & $tmp2 & $texts[$language][67] & $tmp1 & $texts[$language][68] & $strHostServer)
EndFunc   ;==>ad_abfragen



Func _ADDoError()
	$HexNumber = Hex($oMyError.number, 8)

	If $HexNumber = 80020009 Then
		SetError(3)
		Return
	EndIf
	If $HexNumber = "8007203A" Then
		SetError(4)
		Return
	EndIf


	MsgBox(262144, "", "We intercepted a COM Error !" & @CRLF & _
			"Number is: " & @TAB & $HexNumber & @CRLF & _
			"Windescription is: " & @TAB & $oMyError.windescription & @CRLF & _
			"err.description is: " & @TAB & $oMyError.description & @CRLF & _
			"err.source is: " & @TAB & $oMyError.source & @CRLF & _
			"err.helpfile is: " & @TAB & $oMyError.helpfile & @CRLF & _
			"err.helpcontext is: " & @TAB & $oMyError.helpcontext & @CRLF & _
			"err.lastdllerror is: " & @TAB & $oMyError.lastdllerror & @CRLF & _
			"err.retcode is: " & @TAB & $oMyError.retcode & @CRLF & _
			"Script Line number is: " & @TAB & $oMyError.scriptline)
	Select
		Case $oMyError.windescription = "Access is denied."
			$objConnection.Close("Active Directory Provider")
			$objConnection.Open("Active Directory Provider")
			SetError(2)
		Case 1
			SetError(1)
	EndSelect
EndFunc   ;==>_ADDoError


Func _ADObjectExists($object)
	$flag = 0 ; für Auswertung der Radiobuttons
	$strQuery = "<LDAP://" & $strHostServer & "/" & $strDNSDomain & ">;(&(objectCategory=person)(objectclass=user)(sAMAccountName=" & $object & "));ADsPath;subtree"
	$objRecordSet = $objConnection.Execute($strQuery) ; Retrieve the FQDN if it exists
	Switch $objRecordSet.RecordCount
		Case 0; User wurde nicht UserID gefunden
			; nix tun, weitere Suchen ablaufen lassen
		Case 1 ; User wurde eindeutig identifiziert anhand des Namens
			GUISetState(@SW_SHOW, $Form2) ; Fenster zur Benutzerwahl wieder einblenden
			Return 1
		Case Else ; mehrere User wurden über UserID gefunden
			If GUICtrlRead($radio1) = $GUI_CHECKED Then $flag = 1 ; Ergebnis nur behalten wenn suche nach UserID aktiviert
	EndSwitch

	If $flag = 0 Then ; wenn bei der UserID Suche nichts gefunden wurde bzw. Suche nach Name/Vorname gewünscht
		$strQuery = "<LDAP://" & $strHostServer & "/" & $strDNSDomain & ">;(&(objectCategory=person)(objectclass=user)(sn=" & $object & "));ADsPath;subtree"
		$objRecordSet = $objConnection.Execute($strQuery) ; Retrieve the FQDN if it exists
		Switch $objRecordSet.RecordCount
			Case 0; User wurde nicht per Nachname gefunden
				; nix tun, weiter prüfen
			Case 1 ; User wurde eindeutig identifiziert anhand des Namens
				GUISetState(@SW_SHOW, $Form2) ; Fenster zur Benutzerwahl wieder einblenden
				Return 1
			Case Else ; mehrere User wurden über UserID gefunden -> Userliste anzeigen lassen
				If GUICtrlRead($radio1) = $GUI_CHECKED Then $flag = 1 ; Ergebnis nur behalten wenn suche nach Nachname aktiviert
		EndSwitch
	EndIf

	If ($flag = 0) And (GUICtrlRead($radio1) = $GUI_CHECKED) Then ; Wenn immer noch nichts gefunden, suche nach dem Vornamen
		$strQuery = "<LDAP://" & $strHostServer & "/" & $strDNSDomain & ">;(&(objectCategory=person)(objectclass=user)(givenName=" & $object & "));ADsPath;subtree"
		$objRecordSet = $objConnection.Execute($strQuery)
	EndIf

	If $objRecordSet.RecordCount = 0 Then ; Bisher wurde rein gar nichts gefunden -> also suchen wir nach einer Telefonnummer
		If StringIsDigit($object) Then $object = "*" & $object
		$strQuery = "<LDAP://" & $strHostServer & "/" & $strDNSDomain & ">;(&(objectCategory=person)(objectclass=user)(telephoneNumber=" & $object & "));ADsPath;subtree" ; also suche nach Telefonnummer
		$objRecordSet = $objConnection.Execute($strQuery) ; Retrieve the FQDN if it exists
	EndIf

	If $objRecordSet.RecordCount = 0 Then ; Bisher wurde rein gar nichts gefunden -> also suchen wir nach einer Postkorbnummer
		$tmp2 = suche_postkorb($object)
		If $tmp2 <> "" Then
			GUICtrlSetData($edit, $tmp2) ; die Userkennung aus dem Ergebnis der Postkorbsuche wird im Suchfenster eingetragen
			Return -1 ; Zurück zum Aufrufer mit Info, dass neue UserID in Suchmaske eingetragen wurde
		EndIf
	EndIf


	Switch $objRecordSet.RecordCount
		Case 0 ; dieser User wurde nicht gefunden
			Return 0
		Case 1 ; User wurde eindeutig identifiziert anhand des Namens
			GUISetState(@SW_SHOW, $Form2) ; Fenster zur Benutzerwahl wieder einblenden
			Return 1
		Case Else ; User existiert, aber mehrere Treffer (Suchbegriff: Meier ^^)
			Dim $treffer_arry[1]
			$z = ""
			Do
				$y = $objRecordSet.Fields(0).Value ; FQDN-Name des Users
				If Not StringInStr($y, "ou=Empfänger") Then ; skip all mail-only accounts (ou=benutzer,ou=empfänger)
					$oUsr = ObjGet($objRecordSet.Fields(0).Value) ; Retrieve the COM Object for the logged on user
					_ArrayAdd($treffer_arry, $oUsr.sn & "," & $oUsr.givenName & "|" & $oUsr.samAccountName)
				EndIf
				$objRecordSet.MoveNext
			Until $objRecordSet.EOF
			If UBound($treffer_arry) = 2 Then ; Array hat nur 1 Element => die anderen Treffer waren reine Mailempfänger und wurden beim Übertragen ins Array übergangen
				$x = StringInStr($treffer_arry[1], "|")
				GUICtrlSetData($edit, StringMid($treffer_arry[1], $x + 1)) ; die Userkennung wird im Suchfenster eingetragen
				GUISetState(@SW_SHOW, $Form2) ; Fenster zur Benutzerwahl wieder einblenden
				Return -1
			Else ; aha, es gibt tatsächlich mehrere User die in Frage kommen
				GUISetState(@SW_HIDE, $Form2)
				$Form3 = GUICreate($texts[$language][69], 350, 355)
				$Enter_key2 = GUICtrlCreateDummy()
				Dim $b_AccelKeys[1][2] = [["{ENTER}", $Enter_key2]] ; Hotkey-Array für das Auswerten der Enter-Taste in Form3
				GUISetAccelerators($b_AccelKeys, $Form3)
				$liste = GUICtrlCreateListView($texts[$language][70], 5, 40, 340, 280)
				MsgBox($MB_SYSTEMMODAL, "Title",$liste, 10) ; <-- debug
				_GUICtrlListView_SetColumnWidth($liste, 100, 250)
				$btn_userwahl = GUICtrlCreateButton("Ok", 5, 325, 340, 25)
				GUICtrlCreateLabel($texts[$language][71] & UBound($treffer_arry) - 1 & $texts[$language][72], 5, 5, 290, 30)
				_ArrayDelete($treffer_arry, 0) ; das leere erste Feld löschen
				_ArraySort($treffer_arry) ; Treffer sortieren
			    _ArrayDisplay($treffer_arry); <-debug

			   For $i = 1 To UBound($treffer_arry) - 1 ; und alle Ergebnisse in Listview kopieren
					GUICtrlCreateListViewItem($treffer_arry[$i], $liste)
						MsgBox($MB_SYSTEMMODAL, "Title", $treffer_arry[$i]& "....." & $liste, 10) ; <- debug
			   Next
				GUISetState(@SW_SHOW, $Form3)

				While 1
					$msg = GUIGetMsg()
					If $msg = $GUI_EVENT_CLOSE Then Exit
					If ($msg = $btn_userwahl) Or ($msg = $Enter_key2) Then
						$x = GUICtrlRead($liste)
						If $x <> "" Then ; nur wenn auch ein User gewählt wurde...
							$y = GUICtrlRead($liste) ; die Control-ID des markierten Listview-Items holen
							$y = GUICtrlRead($y) ; das ListviewItem auslesen
							$tmp = StringSplit($y, "|") ; aufteilen und nur die UserID behalten
							$x = GUICtrlSetData($edit, $tmp[2]) ; die Userkennung wird im Suchfenster eingetragen
							ExitLoop
						EndIf
					EndIf
				WEnd
				GUIDelete($Form3) ; Auswahl-GUI löschen
				GUISetState(@SW_SHOW, $Form2) ; Fenster zur Benutzerwahl wieder einblenden
				Return -1 ; User wurde im Formuar eingetragen
			EndIf
	EndSwitch
EndFunc   ;==>_ADObjectExists

Func _ADGetUserData($user)

	$oUsr.GetInfo() ; ADS-Cache der Attribute neu auslesen sonst kriegt das Programm evtl. keine Gruppenänderungen mit
	$tmp = $oUsr.DisplayName
	If $tmp <> "" Then
		GUICtrlSetData($lbl_name, $oUsr.DisplayName)
	Else
		GUICtrlSetData($lbl_name, $oUsr.sn & ", " & $oUsr.givenName)
	EndIf

	; Auswertung des "Veröffentlicht auf" Wertes. Falle: Wenn ein "," im Namen des Users selbst drin steht, wird er als  \, maskiert.
	; Das stört Stringsplit aber leider gar nicht. Daher wandeln wir das Ding vor dem Stringsplit um und danach wieder zurück.
	$tmp = $oUsr.distinguishedName
	$tmp = StringReplace($tmp, "\,", "õõ")
	$tmp = StringSplit($tmp, ",")

	$tmp2 = ""
	For $i = 1 To $tmp[0] ; Abtrennen der DC= Klamotten
		$tmp[$i] = StringReplace($tmp[$i], "õõ", ",")
		$tmp[$i] = StringMid($tmp[$i], 4)
	Next ; die hinteren 3 mit einem . trennen
	$max = $tmp[0]
	$tmp2 = $ADSystemInfo.DomainShortName & " (" & $tmp[$max - 2] & "." & $tmp[$max - 1] & "." & $tmp[$max] & ")"

	GUICtrlSetData($lbl_userid, $user)
	GUICtrlSetData($lbl_domain, $tmp2)

	$tmp2 = $tmp2 & "/"
	For $i = $tmp[0] - 3 To 2 Step -1
		$tmp2 = $tmp2 & $tmp[$i] & "/"
	Next
	$tmp2 = StringReplace($tmp2, "/\", "/")
	$tmp2 = StringLeft($tmp2, StringLen($tmp2) - 1)

	GUICtrlSetData($lbl_ou, $tmp2)

	GUICtrlSetData($lbl_email, $oUsr.mail)
	GUICtrlSetData($lbl_telefon, $oUsr.telephoneNumber)
	GUICtrlSetData($lbl_abteilung, StringReplace($oUsr.department, "&", "&&"))
	GUICtrlSetData($lbl_profil, $oUsr.profilePath)

	$lw_m = $oUsr.homeDirectory
	GUICtrlSetData($lbl_homelauf, $oUsr.homeDrive)
	GUICtrlSetColor($lbl_homeverz, -1)
	GUICtrlSetColor($lbl_homelauf, -1)
	If $lw_m <> "" Then
		GUICtrlSetData($lbl_homeverz, $lw_m)
	EndIf

	GUICtrlSetData($lbl_ort, StringStripWS($oUsr.postalCode & " " & $oUsr.l, 3))

EndFunc   ;==>_ADGetUserData

Func DB_Abfrage($user)
	Return
	$connSBDAT.Open("Driver={SQL Server};Server=xxx.de;Database=X500;") ; mit der Datenbank verbinden
	If @error Then
		SplashTextOn("", $texts[$language][125], 250, 100)
		Sleep(2000)
		SplashOff()
		Return
	EndIf

	$suche = "SELECT EBK, GebDatum,Geblist, PWChange FROM xxxxxxxxxxx WHERE UserID LIKE '" & $user & "'"
	$rs.Open($suche, $connSBDAT)
	$gebdatum = StringLeft($rs.Fields("GebDatum").Value, 8)

	;	$gebdatum = StringRight($gebdatum, 2) & "." & StringMid($gebdatum, 5, 2) & "." &

	$gebjahr = StringLeft($gebdatum, 4)
	$gebmon = StringMid($gebdatum, 5, 2)
	$gebtag = StringRight($gebdatum, 2)
	$gebdatum = $gebtag & "." & $gebmon & "." & $gebjahr & " (" & _DateDiff("y", $gebjahr & "/" & $gebmon & "/" & $gebtag, _NowCalc()) & ")"
	$gebliste = $rs.Fields("GebList").Value

	If $gebliste <> "X" Then
		GUICtrlSetData($lbl_geboren, "geheim")
	Else
		GUICtrlSetData($lbl_geboren, $gebdatum)
	EndIf


	GUICtrlSetData($lbl_fnummer, $rs.Fields("EBK").Value)
	GUICtrlSetData($lbl_pwchange, $rs.Fields("PWChange").Value)
	$rs.Close

	$suche = "SELECT Postkorb, AmtsBez, Geschlecht, SAP_PNR FROM T_DB2 WHERE UserID LIKE '" & $user & "'"
	$rs.Open($suche, $connSBDAT)
	GUICtrlSetData($lbl_postkorb, $rs.Fields("Postkorb").Value)
	GUICtrlSetData($lbl_AmtsBez, $rs.Fields("AmtsBez").Value)
	GUICtrlSetData($lbl_geschlecht, $rs.Fields("Geschlecht").Value)
	GUICtrlSetData($lbl_SAP_PNR, $rs.Fields("SAP_PNR").Value)

	$rs.Close
	$connSBDAT.Close

EndFunc   ;==>DB_Abfrage

Func _ADGetUserGroups(ByRef $usergroups, $user = @UserName)
	$usergroups = $oUsr.GetEx("memberof")
	$count = UBound($usergroups)
	If $count = 0 Then
		GUICtrlSetData($bn_gruppen, $texts[$language][12]) ; reset label of button
		Return ; catch empty list
	EndIf
	_ArrayInsert($usergroups, 0, $count)
	_ArraySort($usergroups, 0, 1)
	For $i = 1 To $count
		$tmp = $usergroups[$i]
		$tmp = StringReplace($tmp, "/", "\/")
		$objGroup = ObjGet("LDAP://" & $tmp)
		If BitAND($objGroup.groupType, $ADS_GROUP_TYPE_SECURITY_ENABLED) Then
			$tmp2 = "Sicherheit"
		Else
			$tmp2 = "Distribution"
		EndIf
		$tmp3 = $objGroup.memberOf
		$tmp3 = StringMid($tmp3, 4)
		$tmp3 = StringSplit($tmp3, ",")

		Switch $objGroup.InstanceType
			Case 2
				$tmp4 = "Global"
			Case 4
				$tmp4 = "Lokal"
			Case 8
				$tmp4 = "Universell"
		EndSwitch
		$tmp = StringReplace($objGroup.name, "\/", "/") ; Maskierung wieder rückgängig machen für gescheite Anzeige
		$tmp = StringReplace($tmp, "CN=", "") & "|" & $objGroup.samAccountName & "|" & $tmp2 & "|" & $tmp3[1] & "|" & $tmp4
		GUICtrlCreateListViewItem($tmp, $Gruppenliste)
	Next

EndFunc   ;==>_ADGetUserGroups

Func _ADGetAccount($user)
	GUICtrlSetData($lbl_aenderung, Zeit($oUsr.PasswordLastChanged))
	If $oUsr.IsAccountLocked Then
		GUICtrlSetData($lbl_gesperrt, $texts[$language][74])
		GUICtrlSetColor($lbl_gesperrt, 0xff0000)
		GUICtrlSetState($bn_unlock, $GUI_ENABLE)
	Else
		GUICtrlSetData($lbl_gesperrt, $texts[$language][75])
		GUICtrlSetColor($lbl_gesperrt, 0x00aa00)
		GUICtrlSetState($bn_unlock, $GUI_DISABLE)
	EndIf

	GUICtrlSetData($lbl_errorcount, $oUsr.BadLoginCount)

	$intUAC = $oUsr.Get("userAccountControl")

	; Prüfen, ob der User sein Passwort ändern darf. Da keine direkte Abfrage möglich ist, erfolgt dies über den Security Descriptor
	$oSecDesc = $oUsr.Get("ntSecurityDescriptor")
	$oACL = $oSecDesc.DiscretionaryACL
	For $oACE In $oACL
		If ($oACE.ObjectType = $USER_CHANGE_PASSWORD) And (($oACE.Trustee = "Everyone") Or ($oACE.Trustee = "Jeder")) Then
			If ($oACE.AceType = $ADS_ACETYPE_ACCESS_ALLOWED_OBJECT) Then
				GUICtrlSetData($lbl_change, $texts[$language][76])
				GUICtrlSetColor($lbl_change, 0x00aa00)
			Else
				GUICtrlSetData($lbl_change, $texts[$language][77])
				GUICtrlSetColor($lbl_change, 0xff0000)
			EndIf
		EndIf
	Next

	If BitAND(0x00020, $intUAC) Then ; PW not required flag ist gesetzt
		GUICtrlSetData($lbl_pwreq, $texts[$language][75])
	Else ; nicht gesetzt -> Passwort nötig
		GUICtrlSetData($lbl_pwreq, $texts[$language][74])
	EndIf

	GUICtrlSetData($lbl_erzeugt, Zeit($oUsr.whenCreated))
	GUICtrlSetData($lbl_script, $oUsr.scriptPath)

	If BitAND($intUAC, $ADS_UF_ACCOUNTDISABLE) Then ; Disabled flag ist gesetzt
		GUICtrlSetData($lbl_deakt, $texts[$language][74])
		GUICtrlSetColor($lbl_deakt, 0xff0000)
	Else
		GUICtrlSetData($lbl_deakt, $texts[$language][75])
		GUICtrlSetColor($lbl_deakt, 0x00aa00)
	EndIf


	GUICtrlSetColor($lbl_expiration, 0x000000)
	$dummy = $oUsr.AccountExpirationDate
	$tmp = Zeit2($dummy) ; Umgewandelte Zeit für DateDiff
	$dummy = Zeit($dummy) ; Umgewandelte Zeit für die Ausgabe

	$tmp2 = _DateDiff("D", _NowCalcDate(), $tmp)
	If ($tmp2 < 1) And ($tmp2 > -148883) Then GUICtrlSetColor($lbl_expiration, 0xff0000) ; Passwort ist keinen Tag mehr gültig

	If ($dummy = "01.01.1601 02:00") Or ($dummy = "01.01.1970 00:00") Or ($dummy = "01.01.1601 01:00") Then
		$dummy = $texts[$language][78]
		GUICtrlSetColor($lbl_expiration, 0x000000)
	EndIf
	GUICtrlSetData($lbl_expiration, $dummy)

EndFunc   ;==>_ADGetAccount

Func Entsperren($user)
	If $oUsr.IsAccountLocked Then
		$oUsr.IsAccountLocked = False
		$oUsr.SetInfo
		Sleep(500)
		$oUsr.GetInfo() ; ADS-Cache der Attribute neu auslesen sonst kriegt das Programm evtl. keine Gruppenänderungen mit
		If Not $oUsr.IsAccountLocked Then
			GUICtrlSetData($lbl_gesperrt, $texts[$language][75])
			GUICtrlSetColor($lbl_gesperrt, 0x00aa00);Green
			GUICtrlSetState($bn_unlock, $GUI_DISABLE)
		Else
			GUICtrlSetData($lbl_gesperrt, $texts[$language][74])
			GUICtrlSetColor($lbl_gesperrt, 0xff0000) ; Red
			GUICtrlSetState($bn_unlock, $GUI_ENABLE)
		EndIf
	EndIf
EndFunc   ;==>Entsperren

Func passwort_req($user)
	$oUsr.Put("userAccountControl", BitXOR($intUAC, 0x00020))
	$oUsr.SetInfo

	$oUsr.GetInfo
	$intUAC = $oUsr.Get("userAccountControl")
	If BitAND(0x00020, $intUAC) Then ; PW not required flag ist gesetzt
		GUICtrlSetData($lbl_pwreq, $texts[$language][75])
		GUICtrlSetColor($lbl_pwreq, 0xff0000)
	Else ; nicht gesetzt -> Passwort nötig
		GUICtrlSetData($lbl_pwreq, $texts[$language][74])
		GUICtrlSetColor($lbl_pwreq, 0x00aa00)
	EndIf
EndFunc   ;==>passwort_req

Func Zeit($zeit) ; Umwandeln der AD-Zeit ins deutsche Format
	If $zeit = "" Then Return "---" ; User wurde grade frisch zurückgesetzt
	$tmp = StringMid($zeit, 7, 2) & "." & StringMid($zeit, 5, 2) & "." & StringLeft($zeit, 4) & " " & StringMid($zeit, 9, 2) & ":" & StringMid($zeit, 11, 2)
	Return $tmp
EndFunc   ;==>Zeit

Func Zeit2($zeit) ; Umwandeln der AD-Zeit ins englische Format für _DateAdd
	$tmp = StringLeft($zeit, 4) & "/" & StringMid($zeit, 5, 2) & "/" & StringMid($zeit, 7, 2) & " " & StringMid($zeit, 9, 2) & ":" & StringMid($zeit, 11, 2) & ":" & StringMid($zeit, 13, 2)
	Return $tmp
EndFunc   ;==>Zeit2

Func Zeit3($zeit) ; Umwandeln vom englischen Datumsformat YYYYMMDD ins deutsche
	If $zeit = "0" Then Return "---" ; User wurde grade frisch zurückgesetzt
	$tmp = StringSplit($zeit, "/")
	$tmp2 = StringLeft($tmp[3], 2) & "." & $tmp[2] & "." & $tmp[1] & " " & StringMid($tmp[3], 4, 5)
	Return ($tmp2)
EndFunc   ;==>Zeit3

Func Zeit4($zeit) ; umwandeln von MM/DD/YYYY ins deutsche Format z.B.: 9/5/2008 4:57:39 PM
	$tmp = StringSplit($zeit, "/")
	If Not IsArray($tmp) Or ($tmp[0] < 3) Then Return "-"
	If StringLen($tmp[1]) = 1 Then $tmp[1] = "0" & $tmp[1] ; notfalls den Monat zweistellig machen
	If StringLen($tmp[2]) = 1 Then $tmp[2] = "0" & $tmp[2] ; notfalls den Tag zweistellig machen
	$tmp3 = StringLeft($tmp[3], 4) ; das Jahr
	$tmp4 = StringStripWS(StringMid($tmp[3], 5), 3) ; die Uhrzeit
	If StringRight($tmp4, 2) = "PM" Then ; wenn Nachmittags: 12 Stunden draufpacken
		$doppelpunkt = StringInStr($tmp4, ":")
		$tmp4 = StringLeft($tmp4, $doppelpunkt - 1) + 12 & StringMid($tmp4, $doppelpunkt, 6)
	Else ; wenn vormittags: nur das " AM" entfernen
		$tmp4 = StringLeft($tmp4, StringLen($tmp4) - 3)
	EndIf

	If StringInStr($tmp4, ":") = 2 Then $tmp4 = "0" & $tmp4

	$tmp2 = $tmp[2] & "." & $tmp[1] & "." & $tmp3 & " " & StringLeft($tmp4, 5) ; Datum zusammensetzen
	Return $tmp2
EndFunc   ;==>Zeit4

Func _ADGetGroupMembers($gruppe)
	If $gruppe = "" Then Return

	$groupdn = _ADSamAccountNameToFQDN($gruppe)
	If $groupdn = "" Then
		MsgBox(16, "Problem", $texts[$language][79])
		Return
	EndIf
	$objGroup = ObjGet("LDAP://" & $groupdn)

	Dim $userarry[50000][2]
	$i = 0
	For $objmember In $objGroup.members
		$userarry[$i][0] = StringReplace($objmember.displayname, " (LBV)", "") ; remove useless additional string from our Actice Directory
		$userarry[$i][1] = $objmember.samAccountName
		$i = $i + 1
	Next
	ReDim $userarry[$i][2]

	_ArraySort($userarry) ; sortiere nach Displayname
	$counter = 0
	$result1 = ""
	For $strMember = 0 To UBound($userarry) - 1
		$result1 = $result1 & "<td bgcolor=66ff66>" & $userarry[$counter][0] & "<br>(" & $userarry[$counter][1] & ")</td>"
		$counter = $counter + 1
		If Mod($counter, 5) = 0 Then $result1 = $result1 & "</tr><tr><th>&nbsp;</th>"
	Next
	$result1 = StringReplace($result1, "\", "")

	_ArraySort($userarry, 0, 0, 0, 1) ; sortiere nach UserID
	$counter = 0
	$result2 = ""
	For $strMember = 0 To UBound($userarry) - 1
		$tmp = StringSplit($strMember, ",")
		$result2 = $result2 & "<td bgcolor=66ff66>" & $userarry[$counter][1] & "<br>(" & $userarry[$counter][0] & ")</td>"
		$counter = $counter + 1
		If Mod($counter, 5) = 0 Then $result2 = $result2 & "</tr><tr><th>&nbsp;</th>"
	Next
	$result2 = StringReplace($result2, "\", "")

	$objGroup.GetInfo

	$intGroupType = $objGroup.GroupType

	If $intGroupType And $ADS_GROUP_TYPE_DOMAIN_LOCAL_GROUP Then
		$x = "Domain local"
	ElseIf $intGroupType And $ADS_GROUP_TYPE_GLOBAL_GROUP Then
		$x = "Global"
	ElseIf $intGroupType And $ADS_GROUP_TYPE_UNIVERSAL_GROUP Then
		$x = "Universal"
	Else
		$x = "Unknown"
	EndIf

	If $intGroupType And $ADS_GROUP_TYPE_SECURITY_ENABLED Then
		$z = "Security group"
	Else
		$z = "Distribution group"
	EndIf

	$erzeugt = $objGroup.whenCreated
	$erzeugt = StringLeft($erzeugt, 4) & "-" & StringMid($erzeugt, 5, 2) & "-" & StringMid($erzeugt, 7, 2) & " " & StringMid($erzeugt, 9, 2) & ":" & StringMid($erzeugt, 11, 2) & ":" & StringMid($erzeugt, 13, 2)

	$geaendert = $objGroup.whenChanged
	$geaendert = StringLeft($geaendert, 4) & "-" & StringMid($geaendert, 5, 2) & "-" & StringMid($geaendert, 7, 2) & " " & StringMid($geaendert, 9, 2) & ":" & StringMid($geaendert, 11, 2) & ":" & StringMid($geaendert, 13, 2)

	$datei = FileOpen(@TempDir & "\userinfo.htm", 2)
	FileWriteLine($datei, "<table>")
	FileWriteLine($datei, "<tr><th bgcolor=ff6666>" & $texts[$language][80] & ":</th><td bgcolor=66ff66 colspan=10>" & $gruppe & "</td></tr>")
	FileWriteLine($datei, "<tr><th bgcolor=ff6666>" & $texts[$language][81] & ":</th><td bgcolor=66ff66 colspan=10>" & $erzeugt & "</td></tr>")
	FileWriteLine($datei, "<tr><th bgcolor=ff6666>" & $texts[$language][82] & ":</th><td bgcolor=66ff66 colspan=10>" & $geaendert & "</td></tr>")
	FileWriteLine($datei, "<tr><th bgcolor=ff6666>" & $texts[$language][83] & ":</th><td bgcolor=66ff66 colspan=10>" & $objGroup.mail & "</td></tr>")
	FileWriteLine($datei, "<tr><th bgcolor=ff6666>" & $texts[$language][84] & ":</th><td bgcolor=66ff66 colspan=10>" & $objGroup.info & "</td></tr>")
	FileWriteLine($datei, "<tr><th bgcolor=ff6666>" & $texts[$language][85] & ":</th><td bgcolor=66ff66 colspan=10>" & $objGroup.description & "</td></tr>")
	FileWriteLine($datei, "<tr><th bgcolor=ff6666>" & $texts[$language][86] & ":</th><td bgcolor=66ff66 colspan=10>" & $x & "</td></tr>")
	FileWriteLine($datei, "<tr><th bgcolor=ff6666>" & $texts[$language][87] & ":</th><td bgcolor=66ff66 colspan=10>" & $z & "</td></tr>")
	FileWriteLine($datei, "<tr><th bgcolor=ff6666>" & $texts[$language][88] & ":</th><td bgcolor=66ff66 colspan=10>" & UBound($userarry) - 1 & "</td></tr>")
	FileWriteLine($datei, "<tr><th bgcolor=ff6666>" & $texts[$language][89] & ":</th>" & $result1 & "</tr>")
	FileWriteLine($datei, "<tr><th bgcolor=ff6666>" & $texts[$language][90] & ":</th>" & $result2 & "</tr>")
	FileWriteLine($datei, "</table>")
	FileClose($datei)
	_IECreate(@TempDir & "\userinfo.htm")

	_GUICtrlStatusBar_SetText($bar, $texts[$language][91])
	Return
EndFunc   ;==>_ADGetGroupMembers

Func _ADSamAccountNameToFQDN($samname)
	$strQuery2 = "<LDAP://" & $strHostServer & "/" & $strDNSDomain & ">;(sAMAccountName=" & $samname & ");distinguishedName;subtree"
	$objRecordSet2 = $objConnection.Execute($strQuery2)

	If $objRecordSet2.RecordCount = 1 Then
		$fqdn = $objRecordSet2.fields(0).value
		$objRecordSet2 = 0
		Return StringReplace($fqdn, "/", "\/")
	Else
		$objRecordSet2 = 0
		Return ""
	EndIf
EndFunc   ;==>_ADSamAccountNameToFQDN

Func userzaehlen()
	$z = ""
	$summe = 0
	For $i = 1 To 6
		$strQuery = "<LDAP://" & $strHostServer & "/" & $strDNSDomain & ">;(&(objectCategory=person)(objectclass=user)(department=*0" & $i & "*));ADsPath;subtree"
		$objRecordSet = $objConnection.Execute($strQuery) ; Retrieve the FQDN if it exists
		$z = $z & "Abteilung " & $i & ": " & $objRecordSet.RecordCount & @CRLF
		$summe += $objRecordSet.RecordCount
	Next
	$z &= "===========================" & @CRLF & "Summe: " & $summe
	MsgBox(0, $texts[$language][124], $z)
EndFunc   ;==>userzaehlen
