Kategorien
Scripte

AD Import einfach gemacht mit LDIF

CSS Programming Image

AD Import: LDIF steht für LDAP Data Interchange Format und ist das Format der Wahl wenn ihr in einer Active Directory Struktur Massenänderungen durchführen wollt.

Ein LDAP-Objekt wird durch mehrere LDIF-Zeilen beschrieben. Am Anfang steht immer der distinguished name dn, der die absolute Position im LDAP-Baum angibt. Es folgen Objektklassen, die definieren, welche Attribute zulässig oder vorgeschrieben sind. 

Beispiel einer Definition für einen AD Import:

dn: dc=struktur, dc=de
objectclass: organization
objectclass: top
o: struktur

Es existieren zwei grundlegende LDIF Formate die für den AD Import genutzt werden können, LDIF Change und LDIF Change. Letzterer enthält die Änderungen an einem Objekt.

Ziel:

Das Script wandelt eine Excel Tabelle in das LDIF Format um, zum weiteren Import in eine Active Directory Struktur.

Private Sub Excel2LDIF_Click()

'LDIF Ausgabe aus Excelliste
Dim oAs, oUser As Object
Dim xlApp As Object
Dim zaehler
Dim ADSI As Object
Dim OUTeil(256) As String

'On Error Resume Next

Set xlApp = CreateObject(pfad_tabelle.Caption)
xlApp.Application.Visible = False
xlApp.Windows(1).Visible = False

On Error Resume Next

With CommonDialog1
  .CancelError = True
  .Flags = cdlOFNOverwritePrompt
  .Filter = "Textdateien (*.LDIF)|*.LDIF"
  .ShowSave
  If .FileName <> "" Then
    F = FreeFile
    Open .FileName For Output As #F
  End If
End With

' Ermittlung der Anzahl Datensaetze und Prüfung
Fehleranzahl = 0 ' Fehleranzahl

Kontrollfeld.Text = Kontrollfeld.Text & "Prüfung !!!" & vbCrLf
AnzahlDatensaetze = 2
While (xlApp.Worksheets(1).Range("A" & AnzahlDatensaetze).Value) <> ""
  If Trim(xlApp.Worksheets(1).Range("C" & AnzahlDatensaetze).Value) = "" Then
    Fehleranzahl = Fehleranzahl + 1
  End If
  If Trim(xlApp.Worksheets(1).Range("D" & AnzahlDatensaetze).Value) = "" Then
    Fehleranzahl = Fehleranzahl + 1
  End If
  If Trim(xlApp.Worksheets(1).Range("E" & AnzahlDatensaetze).Value) = "" Then
    Fehleranzahl = Fehleranzahl + 1
  End If
  If Trim(xlApp.Worksheets(1).Range("G" & AnzahlDatensaetze).Value) = "" Then
    Fehleranzahl = Fehleranzahl + 1
  End If
  AnzahlDatensaetze = AnzahlDatensaetze + 1
Wend

If Fehleranzahl > 0 Then
  Antwort = MsgBox("Anzahl fehlerhafter Datensätze: " & Fehleranzahl, vbYesNo + vbExclamation, "Wollen Sie eine LDIF - Ausgabe erstellen?")
  If Antwort = vbOK Then
  Else
    Print #F, Kontrollfeld.Text
    Close #F
    Unload Form1
    Exit Sub
    xlApp.Application.Quit
  End If
End If

Jetzt zur Bearbeitung

' Start Bearbeitung
zaehler = 2
While (xlApp.Worksheets(1).Range("A" & zaehler).Value) <> ""

'Refresh der Anzeige
Form1.Refresh
Kontrollfeld.Refresh
'Schreibe LDIF

'Variablen belegen
'---------------------------------------------------------------------------
    'Variable Werte aus Tabelle --------------------------------------------

    Datum = Format$(Now, "yy.mm.dd")
    Tag = Right(Datum, 2)
    Monat = Mid(Datum, 4, 2)
    Jahr = Left(Datum, 2)
    Zeit = Format$(Now, "hh:nn:ss")
    Min = Mid(Zeit, 4, 2)
    St = Left(Zeit, 2)

    If zaehler > 9 Then
      employeeNumber = "E" & Jahr & Monat & Tag & St & zaehler & "1"
    Else
      employeeNumber = "E" & Jahr & Monat & Tag & St & Min & zaehler
    End If

    sn = Trim(xlApp.Worksheets(1).Range("C" & zaehler).Value) 'Nachname
    givenName = Trim(xlApp.Worksheets(1).Range("D" & zaehler).Value) 'Vorname

    ' - berechneter Wert aus Tabelle ---------------------------------------
    Print #F, "dn: cn=" & sn & " " & givenName & " " & employeeNumber & "," & "cn=Users,cn=XXXXXX"
    Print #F, "cn: " & sn & " " & givenName & " " & employeeNumber 
    Print #F, "employeeNumber: " & employeeNumber
    Print #F, "sn: " & Trim(xlApp.Worksheets(1).Range("C" & zaehler).Value) 
    Print #F, "givenName: " & Trim(xlApp.Worksheets(1).Range("D" & zaehler).Value)

    ' Prüfung auf Firma vorhanden wenn ja dann Excelliste wenn nein ="extern"

    If UCase(Trim(xlApp.Worksheets(1).Range("H" & zaehler).Value)) = "" Then
      Print #F, "Company: EXTERN 'Firma =xxx"
    Else
      Print #F, "Company: " & UCase(Trim(xlApp.Worksheets(1).Range("H" & zaehler).Value)) 
    End If
    Print #F, "Salutation: " & Trim(xlApp.Worksheets(1).Range("B" & zaehler).Value)

    OU = UCase(Trim(xlApp.Worksheets(1).Range("E" & zaehler).Value))
    K = 1
    OUTeil(K) = UCase(Trim(xlApp.Worksheets(1).Range("E" & zaehler).Value)) '(1)
    K = K + 1
    While (InStrRev(OU, "-")) <> 0
      Position = (InStrRev(OU, "-"))
      OUTeil(K) = Left(OU, Position - 1)
      OU = Left(OU, Position - 1)
      K = K + 1
    Wend
    OU = "OU: ou="
    For J = 1 To K - 1
    If J = K - 1 Then
      OU = OU & OUTeil(J)
    Else
      OU = OU & OUTeil(J) & ",ou="
    End If
    Next J
    OU = OU & ",o=xxx,cn=xxx"
    Print #F, OU

 

Und noch die Kostenstelle verarbeiten

 'Kostenstelle
    Print #F, "Kostenstelle: " & UCase(Trim(xlApp.Worksheets(1).Range("G" & zaehler).Value)) 'Kostenstelle

    ' ADS User Typ auswerten -> Base OU bestimmen START
    ADOU = UCase(Trim(xlApp.Worksheets(1).Range("K" & zaehler).Value)) 
    Select Case ADOU
    Case "1"
      ADOU = "OU=Users,"
    Case "2"
      ADOU = "OU=Users,"
    Case "3"
      ADOU = "OU=Users,"
    Case Else
      ADOU = "OU=Users,"
    End Select
    Print #F, "ADOU: " & ADOU

    Print #F, "AD: " & Trim(xlApp.Worksheets(1).Range("I" & zaehler).Value) 'AD Status

    Print #F, vbCrLf

  zaehler = zaehler + 1
Wend
Close #F
xlApp.Application.Quit
End Sub

Diesen Code verwendet ihr auf eigene Gefahr. Voraussetzung sind entsprechende Berechtigungen auf die AD Struktur. Ich übernehme keine Gewährleistung.

Michael Leidig

Kategorien
Scripte

Disconnect users with WMI

Ein kleines Script um einen Benutzer remote oder lokal abzumelden (disconnect). Benötigt wird ein administrativer Zugriff aus das System. Nützlich für zeitgesteuerte Aufgaben zu starten.

Benutzer abmelden
rechnername = InputBox("Rechnername?")
WMI Scripting Interface
Set ISWbemLoc = CreateObject("WbemScripting.SWbemLocator")
ISWbemLoc.Security_.Privileges.Add 18
user = InputBox("Benutzername?",,"Administrator")
pwd = InputBox("Kennwort?")
Set wmi = ISWbemLoc.ConnectServer(rechnername, "root/cimv2", user, pwd)
Set ossam = wmi.InstancesOf("Win32_OperatingSystem")
For each os in ossam
	Set thisoss = os
	exit For
Next
MsgBox thisoss.GetObjectText_
antwort = MsgBox("Wollen Sie den Benutzer abmelden?", vbYesNo + vbQuestion + vbSystemModal)
If antwort = vbYes then
	thisoss.Win32Shutdown 0, 0
End If

513 B

Kategorien
Scripte

Service Status in Excel exportieren

CSS Programming Image

Dieses Skript legt eine Excel Datei mit allen Diensten und deren Stati an. Die Vorausetzung ist, Excel muss installiert sein.

VBS Datei

Es handelt sich um eine VBS Datei. Ihr müsst nur den Code kopieren und bei Euch abspeichern und ausführen.

msg = "Kurzbeschreibung:" & vbCr & "Dieses Skript legt eine Excel Datei mit allen Diensten und deren Stati an. Voraussetzung -> Excel.
" & vbCr & vbCr & "Jetzt das Skript ausführen?"
antwort = MsgBox(msg, vbYesNo + vbQuestion)
if antwort = vbNo then 
  MsgBox "Abbruch", vbExclamation
  WScript.Quit
end if
' das Variablenfeld mit den Klartextnamen für Status
startcodes = Split(",läuft nicht,wird gestartet,wird gestoppt,läuft,wird fortgesetzt,wird angehalten,angehalten,Fehler", ",")

' ein Variablenfeld mit den Klartextnamen für Starttyp anlegen
starttypes = Split("Autostart Boot,Autostart Windowsstart,Autostart Controlmanager,manuell,gesperrt",",")
'SYS: Windows Script Host Runtime Library
Set net = CreateObject("WScript.Network")

' Hier den lokalen Rechnernamen:
computer = InputBox("Bitte geben Sie den Rechnernamen an!",,net.ComputerName)

' Verbindung herstellen:
Set obj = GetObject("WinNT://" & computer & ",computer")
'SYS: Microsoft Office 2000 component
Set objXL = CreateObject("Excel.Application")
objXL.Visible = True
objXL.Workbooks.Add
objXL.Columns(1).ColumnWidth = 30
objXL.Columns(2).ColumnWidth = 15
objXL.Columns(3).ColumnWidth = 35
objXL.Columns(4).ColumnWidth = 20
objXL.Columns(5).ColumnWidth = 15
objXL.Columns(6).ColumnWidth = 10
objXL.Columns(7).ColumnWidth = 20
objXL.Columns(8).ColumnWidth = 20
' Spaltenüberschriften:
objXL.Cells(1, 1).Value = "Dienstname"
objXL.Cells(1, 2).Value = "Systemname"
objXL.Cells(1, 3).Value = "Executable"
objXL.Cells(1, 4).Value = "abhängig von"
objXL.Cells(1, 5).Value = "Konto"
objXL.Cells(1, 6).Value = "Status"
objXL.Cells(1, 7).Value = "Starttyp"
objXL.Cells(1, 8).Value = "Diensttyp"

Im Anschluss wird die 1. Zeile formatiert.

' erste Zeile formatieren:
objXL.Range("A1:H1").Select
objXL.Selection.Font.Bold = True
objXL.Selection.Interior.ColorIndex = 1
objXL.Selection.Interior.Pattern = 1 'xlSolid
objXL.Selection.Font.ColorIndex = 2

' Daten beginnen in zweiter Zeile
intIndex = 2

Servicefilter

' nur Service-Objekte anzeigen
obj.Filter = Array("Service")

' alle Dienste untersuchen
For each dienst in obj
   ' Infos in Spreadsheet eintragen:
   GetInfo(dienst)
Next

MsgBox "Fertig.",vbInformation + vbSystemModal

Fehlerbehandlung ausschalten, denn einige Eigenschaften können
undefiniert sein (z.B. Dependencies).

Sub GetInfo(obj)

   On Error Resume Next
   objXL.Cells(intIndex, 1).Value = obj.DisplayName
   objXL.Cells(intIndex, 2).Value = obj.Name
   objXL.Cells(intIndex, 3).Value = obj.Path
   dependencies = "unabhängig"
   dependencies = obj.Dependencies
   ' ist es etwa ein VariablenFELD?
   If TypeName(dependencies) = "Variant()" Then
      ' ja, also Feld in mehrzeiligen Text umwandeln
      dependencies = Join(dependencies, vbLf)
   End If
   objXL.Cells(intIndex, 4).Value = dependencies
   objXL.Cells(intIndex, 5).Value = obj.ServiceAccountName
   ' Zahlenwert in Klartext umwandeln:
   objXL.Cells(intIndex, 6).Value = startcodes(obj.Status)
   ' Zahlenwert in Klartext umwandeln:
   objXL.Cells(intIndex, 7).Value = starttypes(obj.StartType)
   ' Bitmaske in Klartext umwandeln:
   objXL.Cells(intIndex, 8).Value = DecodeType(obj.ServiceType)
   
   ' nächste Zeile:
   intIndex = intIndex + 1
   On Error Goto 0
   
End Sub

Hier erfolgt die Typdekodierung.

Function DecodeType(code)
   If (code And 1)<>0 Then
      DecodeType = "Kernel-Treiber"
   End If
   
   If (code And 2)<>0 Then
      DecodeType = DecodeType & "Dateisystem-Treiber"
   End If
   
   If (code And 16)<>0 Then
      DecodeType = DecodeType & "eigener Prozeß"
   End If
   
   If (code And 32)<>0 Then
      DecodeType = DecodeType & "gemeinsamer Prozeß"
   End If
End Function

Viel Erfolg mit dem Testen und ändert es einfach ab wenn etwas nicht passt.

Kategorien
Scripte

Windows neu starten nach Abfrage

CSS Programming Image

Wenn es nicht tut, hilft nur Reboot. Ihr kennt alle diese tollen Sprüche. Im Ernst…

Nach Installationen oder auch zu Wartungszwecken ist es mitunter nötig den Rechner oder das Notebook unter Windows neu zu starten.

Dieses kurze Script kann dabei helfen und am Ende einer Prozedur hinzugefügt werden. Der Benutzer kann die Ausführung, wenn es nötig sein sollte, abbrechen.

Ihr könnt das Script dem entsprechend abändern. Ausführung erfolgt mit “Windows Based Script Host”.

nachricht = "Beschreibung:" & vbCr & "Dieses Skript startet Windows neu. ACHTUNG: Windows wird mit diesem Skript NEU GESTARTET!" & vbCr & vbCr & "Jetzt das Skript ausführen?"
antwort = MsgBox(nachricht, vbYesNo + vbQuestion)
if antwort = vbNo then 
  MsgBox "Abbruch", vbExclamation
  WScript.Quit
end if

'SYS: Windows Shell Common Dll
Set shell = CreateObject("Shell.Application")

'SYS: Windows Script Host Runtime Library
Set wshshell = CreateObject("WScript.Shell")

antwort = MsgBox("Wollen Sie wirklich Windows neu starten?", vbYesNo + vbQuestion)
If antwort = vbYes Then
   ' Beenden aufrufen
   shell.ShutdownWindows
   ' halbe Sekunde warten
   WScript.Sleep 750
   ' Neu starten wählen
   wshshell.SendKeys "%N{ENTER}"
End If
Kategorien
Scripte

PS leere AD Gruppen ermitteln

Powershell Logo
Powershell Logo

Leere Active Directory-Objekte (Gruppen) sollten gefunden und gelöscht werden. Der Grund ist, weil sie unnötigen Speicherplatz beanspruchen, die Sicherheit gefährden und die Verwaltung erschweren können. Ein aufgeräumtes Active Directory funktioniert schneller und sicherer.

Get-ADGroup -Filter * -Properties Members | where { -not $_.Members} | select Name

Das Cmdlet Get-ADGroup ruft eine Gruppe ab oder führt eine Suche durch, um ein oder mehrere Gruppen aus einem Active Directory abzurufen.

Der Parameter Identity gibt die abzurufende Active Directory-Gruppe an. Sie können eine Gruppe anhand des Distinguished Name (DN), ihrer GUID, ihrer Sicherheitskennung (SID) oder ihres Kontonamens (Security Accounts Manager, SAM) identifizieren.

Um mehr als eine Gruppe zu suchen und anzuzeigen, gibt es die LDAP-Filter-Parameter. Der Parameter Filter verwendet die PowerShell Expression Language, um Abfragezeichenfolgen für Active Directory zu schreiben.

Hier in dem Beispiel erfolgt ein Ausschluss für Gruppen die keine Mitglieder enthalten. Der Anwendungszweck wäre z.B. die Vorbereitung einer Bereinigung an AD Objekten.

Kategorien
Scripte

Network Virtual Service Provider Bind

Binäre Darstellung

Summary

The purpose of nvspbind is to disable and enable protocol bindings from the command line when operating in the parent partition for Hyper-V in a server core environment.  This is typically accomplished using the network control panel. However, the network control panel GUI applet is not available in a server core installation of Windows Server 2008 or Microsoft Hyper-V Server.  Nvspbind provides a means for enabling and disabling the protocols from the command line.

Beispiel 1 (IPV6 on IPV4 off):

@echo off
REM IPV6 on IPV4 off
cls
REM cd IPV6
.\nvspbind.exe /e * ms_tcpip
.\nvspbind.exe /e * ms_tcpip6
pause
cls
.\nvspbind /o ms_tcpip6
.\nvspbind /o ms_tcpip
pause

Beispiel 2 (IPV6 on IPV4 on):

@echo off
REM IPV6 on IPV4 on
cls
REM cd IPV6
.\nvspbind.exe /e * ms_tcpip    
.\nvspbind.exe /e * ms_tcpip6
pause
cls
.\nvspbind /o ms_tcpip6
.\nvspbind /o ms_tcpip
pause

Die eigentlichen Tools kopiert ihr am besten in das gleiche Verzeichnis.

Kategorien
Scripte

Benutzerkonto in AD Gruppe aufnehmen

AD Icon Graustufen

Hier beschreibe ich ein Script um einen Active Directory User (Benutzerkonto) in eine AD Gruppe aufzunehmen.

Es geht hier vor allem nicht um den einzelnen Vorgang zu einem Benutzerkonto, der mit Sicherheit auch immer wieder benötigt wird. Es geht um eine Vorstufe der Automatisierung.
Ihr könnt den Code natürlich abändern oder auch gänzlich neu schreiben. Wichtig ist ihr habt einen Plan und macht nicht immer alles manuell. Da verliert man echt den Spass.

User=InputBox(“Usernamen eingeben”,”Userinput”)
Gruppe=InputBox(“Gruppennamen eingeben”,”Userinput”)

User=InputBox("Usernamen eingeben","Userinput")
Gruppe=InputBox("Gruppennamen eingeben","Userinput")
' Gruppe auswählen
Set ou = GetObject("LDAP://ou=Groups,dc=abc,dc=xy")
Set gruppe_G = ou.GetObject("group", "cn=" + Gruppe)
' User Auswählen
Set ou = GetObject("LDAP://ou=SWM-Users,dc=intra,dc=swm,dc=de")
Set User_G = ou.GetObject("user", "cn=" + User)

gruppe_G.Add User_G.ADsPath

Es geht hier um die Vorbereitung einer Möglichkeit die Funktion Administratoren über ein Servicekonto möglich zu machen. Die Verarbeitung in Bezug auf ein AD Benutzerkonto ist eines der Hauptaufgaben der Administration.

Kategorien
Scripte

Passwort eines AD Benutzers setzen

AD Icon Graustufen

Zusammenfassung

Der Ansatz (mit dem Passwort) erweist sich als äußerst wertvoll, wenn es darum geht, die initiale Verteilung von neuen Benutzerkonten zu optimieren. Insbesondere im Kontext der Einführung einer neuen Domäne. In solchen Szenarien wird das Passwort für die gewünschten Benutzer im Active Directory festgelegt. Dies gewährleistet nicht nur die Sicherheit und den Zugriff auf die benötigten Ressourcen, sondern sorgt auch für einen reibungslosen Onboarding-Prozess.

Was diesen Prozess besonders mächtig macht, ist die Möglichkeit, ihn in eine Schleife einzubetten. Durch die Implementierung einer Schleife wird die Einrichtung neuer Benutzerkonten zu einer äußerst effizienten Methode zur Massenänderung. Auf diese Weise können Sie eine Vielzahl von Benutzerkonten gleichzeitig verwalten. Sie können sicherstellen, dass sie alle korrekt eingerichtet und mit den erforderlichen Zugriffsrechten ausgestattet sind. Dies spart nicht nur Zeit, sondern gewährleistet auch eine konsistente und zuverlässige Verwaltung der Benutzerkonten. Das verbessert wiederum die Gesamteffizienz und Sicherheit Ihrer IT-Infrastruktur.

Set objUser = GetObject ("LDAP://abc.xy/CN=Accounname,OU=Users,DC=abc,DC=xy")
Kategorien
Scripte

Powershell und effektive Automatisierung

CSS Programming Image

Einführung

Der wesent­liche Zweck von Power­shell ist die Auto­mat­isierung der System­verwaltung. Von mehreren Computern ist eine Remoteverwaltung gleich­zeitig möglich. Seit der PS in Ver­sion 3.0 ist ein Unter­brechen von Sitzungen und deren Weiterführung von einer anderen Work­station aus möglich.

Enter-PSSession ist ein Befehl in Windows PowerShell, der verwendet wird, um eine Remotesitzung mit einem anderen Computer herzustellen. Mit diesem Befehl können Sie auf einen entfernten Computer zugreifen und Befehle direkt auf diesem Computer ausführen, als wären Sie vor Ort.

In einfachen Worten: Wenn Sie Enter-PSSession verwenden, “betreten” Sie eine andere Computerumgebung, um Befehle darauf auszuführen, als ob Sie direkt davor sitzen würden. Dies ist besonders nützlich für die Verwaltung und Wartung von Remote-Computern in einem Netzwerk.

In der interaktiven Variante startet man in der Powershell durch:

Enter-PSSession 

eine Shell auf dem anderen Rechner und führt dort Kom­mandos aus, so als wäre man an der Konsole der betreffenden Maschine. Für die Automa­tisierung von Aufgaben wird man mehrere parallele Sessions öffnen und über diese Scripts oder Befehle starten.

Kategorien
Scripte

How do I view Active Directory data?

Binäre Darstellung

Active Directory Domain Info ermitteln

Domain Policy Info abfragen, Ausgegeben werden Passwortinformationen und Attribute zur Sicherheit.

Const MIN_IN_DAY = 1440, SEC_IN_MIN = 60
Set objDomain = GetObject("WinNT://domain")
Set objAds = GetObject("LDAP://dc=domain")
Kontrollfeld.Text = ""
intMaxPwdAgeSeconds = objDomain.Get("MaxPasswordAge")
intMinPwdAgeSeconds = objDomain.Get("MinPasswordAge")
intLockOutObservationWindowSeconds = objDomain.Get("LockoutObservationInterval")
intLockOutDurationSeconds = objDomain.Get("AutoUnlockInterval")
intMinPwdLength = objAds.Get("minPwdLength")
intPwdHistoryLength = objAds.Get("pwdHistoryLength")
intPwdProperties = objAds.Get("pwdProperties")
intLockoutThreshold = objAds.Get("lockoutThreshold")
intMaxPwdAgeDays =
 ((intMaxPwdAgeSeconds / SEC_IN_MIN) / MIN_IN_DAY) & " days"
intMinPwdAgeDays =
 ((intMinPwdAgeSeconds / SEC_IN_MIN) / MIN_IN_DAY) & " days"
intLockOutObservationWindowMinutes =
 (intLockOutObservationWindowSeconds / SEC_IN_MIN) & " minutes"
If intLockOutDurationSeconds <> -1 Then
  intLockoutDurationMinutes =
 (intLockOutDurationSeconds / SEC_IN_MIN) & " minutes"
Else
  intLockoutDurationMinutes =
 "Administrator muss manuell gelockte Accounts entsperren"
End If
Kontrollfeld.Text = Kontrollfeld.Text &
"maxPwdAge = " & intMaxPwdAgeDays & vbCrLf
Kontrollfeld.Text = Kontrollfeld.Text &
 "minPwdAge = " & intMinPwdAgeDays & vbCrLf
Kontrollfeld.Text = Kontrollfeld.Text &
 "minPwdLength = " & intMinPwdLength & vbCrLf
Kontrollfeld.Text = Kontrollfeld.Text &
 "pwdHistoryLength = " & intPwdHistoryLength & vbCrLf
Kontrollfeld.Text = Kontrollfeld.Text &
 "pwdProperties = " & intPwdProperties & vbCrLf
Kontrollfeld.Text = Kontrollfeld.Text &
 "lockOutThreshold = " & intLockoutThreshold & vbCrLf
Kontrollfeld.Text = Kontrollfeld.Text &
 "lockOutObservationWindow = " &
intLockOutObservationWindowMinutes & vbCrLf
Kontrollfeld.Text = Kontrollfeld.Text &
 "lockOutDuration = " & intLockoutDurationMinutes & vbCrLf
End Sub