Schriftliche Prüfungen am PC sicher und “schwindelfrei”


sehr verwirrender ArtikelNaja, ganz OKbrauchbar für Checker...guter Artikelsehr guter Artikel - Danke

Das Problem:
Es sollen vermehrt Prüfungen am PC abgewickelt werden. Schummeln könnte eingeschränkt werden, wenn folgende Rahmenbedingungen erfüllt wären:

a) kein Datenaustausch übers Internet
b) nicht auf die eigenen Daten zugreifen
c) keine Daten per USB-Stick mitbringen
d) Daten nicht schon vor der Prüfung irgendwo am PC deponieren
e) nicht auf Netzwerkfreigaben (z.B auf Laptops eingerichtet) zugreifen können
f) während der Prüfung soll sich der Schüler nur mit der Prüfungskennung einloggen können

Ein Lösungsansatz:
für jeden Prüfung eigene Accounts mit hochkomplexen Passwörtern per Script anlegen
Diese Accounts in eine Gruppe legen, der der Internetzugang verwehrt wird
alle Laufwerksbuchstaben (mit Ausnahme des Netzwerkshares für die Lösung) verstecken

Voraussetzungen :
ein funktionierendes Active Directory
ein Proxyserver, der mit AD kommuniziert (zB: ISA)

meine Lösung:

1.) Script, um n User in Active Directory mit hochkomplexem 10-stelligem Passwort zu erstellen (und dieses in eine csv speichern)

Ich habe folgendes Script geschrieben, das ich in ein Verzeichnis auf einem Domänencontroller lege:

Download: user_anlegen.vbs (Auf einem Domänencontroller an beliebiger Stelle erstellen, durch Doppelklick starten)

'#################################################################################################################

'### Script, um die Anzahl von N Usern per Skript im AD mit 10-stelligen, komplexem Passwort anlegen           ###

'### getestet auf Windows Server 2003 SP2, Server2003 R2 u 2008 R2 (jeweils Deutsch)                           ###

'### Ver 10/3/2010_23:53 - Autor: Mag. Pfisterer Edi                                                                                       ###

'#################################################################################################################

'Set objComputer = CreateObject("Shell.LocalMachine")         ' nicht verändern!

Set objComputer = CreateObject("Wscript.Network")

'### folgende Variablen können (müssen abern nicht) verändert werden: ##

  ServerName = objComputer.Computername                          'Server, auf dem die Shares erstellt wurden; falls nicht anders

                                                                'angegeben, der DC auf dem das Script gestartet wird

  LoesungsPfad = "C:\TestAbgabe"                                         'In diesem Pfad des Servers werden die Freigaben erstellt

  AngabePfad = "C:\TestAngaben"                                          'In diesem Pfad des Servers werden die Freigaben erstellt

  LoesungsShare = "TestAbgaben"                                   'Name der Freigabe, auf der die Lösungen gespeichert werden.

  LoesungsDrive = "v:"

  AngabeShare = "TestAngabe"                                        'Name der Freigabe für Angaben!

  AngabeDrive = "u:"

  PruefungsOU = "TestsMeinerDomaene"                                     'Organisationseinheit, die im AD per Skript angelegt wird

  GroupString = "TestGruppe"                                'Sicherheitsgruppe, in der die User automatisch Mitglieder werden

  Lehrer = "lehrer"                                             'Sicherheitsgruppe, in der die Lehrer Mitglieder sind

'### hier beginnt der Teil, der eher nur noch von Auskennern angefasst werden sollte ;-)   ##

Anzahl = InputBox("Wie viele User?")

Bezeichnung = InputBox("Wie sollen die Benutzer heissen?")

ZielOU = InputBox("In welcher OU sollen die User angelegt werden?")

Set objFS = CreateObject("scripting.filesystemobject")

Set WshShell = WScript.CreateObject("WScript.Shell")

Set rootDSE = GetObject("LDAP://RootDSE")

DomainName = rootDSE.Get("defaultnamingcontext")

' aus DC=hak-neusiedl,DC=local wird hak-neusiedl.local

DomainString = Replace(DomainName, "DC=", "")

DomainString = Replace(DomainString, ",", ".")

'erstellt eine neue OU für die Prüfungen

If Not OUExists(PruefungsOU, "LDAP://" & DomainName) Then

    Set PrfOU = GetObject("LDAP://" & DomainName).Create("organizationalUnit", "ou=" & PruefungsOU)

    PrfOU.SetInfo

Else

    Set PrfOU = GetObject("LDAP://" & "ou=" & PruefungsOU& "," & DomainName)

End If

' erstellt, falls noch nicht vorhanden, eine neue Gruppe, in der die User Mitglied werden

If Not ObjectExists(GroupString, "group", "WinNT://" & DomainString) Then

    Set objGroup = PrfOU.Create("Group", "CN=" & GroupString)

    objGroup.Put "sAMAccountName", GroupString

    objGroup.SetInfo

End If

' Die Gruppe wird gesucht und als Ziel definiert.

Set GroupObj = GetObject("WinNT://" & DomainString & "/" & GroupString)

' ZielOU nach Prüfung auf Vorhandensein erstellen

Abbruch = False

Do While OUExists(ZielOU, PrfOU.ADSPath) And Not Abbruch

    Do

        ZielOU = InputBox(_ 

            "Die OU " & ZielOU & " wurde bereits verwendet!" & vbCrLf & _

            "Bitte geben Sie eine andere OU oder ""exit"" für Abbruch ein!")

    Loop Until ZielOU <> ""

    If LCase(ZielOU) = "exit" Then Abbruch = True

Loop

If Abbruch Then WScript.Quit

' Prüfung, ob Benutzer angelegt

Do While ObjectExists(Bezeichnung & "01", "user", "WinNT://" & DomainString) And Not Abbruch

    Do

        Bezeichnung = InputBox(_ 

            "Die Bezeichnung " & Bezeichnung & " wurde bereits verwendet!" & vbCrLf & _

            "Bitte geben Sie eine andere Bezeichnung oder ""exit"" für Abbruch ein!")

    Loop Until Bezeichnung <> ""

    If LCase(Bezeichnung) = "exit" Then Abbruch = True

Loop

WScript.Echo "Die Verarbeitung kann einige Zeit dauern. Bitte um Geduld..."

If Abbruch Then WScript.Quit

' erstellt in der Prüfungs-OU nun eine neue OU lt Eingabe

Set ThisOU = GetObject(PrfOU.ADSPath).Create("organizationalUnit", "ou=" & ZielOU)

ThisOU.SetInfo

' erstellt den Pfad für die Freigaben

CreatePath LoesungsPfad

CreatePath AngabePfad & "\" & ZielOU

' es werden die Freigaben erzeugt

CreateShare LoesungsShare, LoesungsPfad

CreateShare AngabeShare, AngabePfad

' Grundlegende Rechte für Angabe- und Pruefungsordner setzen

WshShell.Run "cmd /c echo j|cacls " & LoesungsPfad & " /G Administratoren:F " & Lehrer & ":C " & GroupString & ":R", 0, 1			 

WshShell.Run "cmd /c echo j|cacls " & LoesungsPfad & " /E /G " & GroupString & ":W", 0, 1			 

WshShell.Run "cmd /c echo j|cacls " & AngabePfad & " /G Administratoren:F " & Lehrer & ":C " & GroupString & ":R", 0, 1			 

WshShell.Run "cmd /c echo j|cacls " & AngabePfad & "\" & ZielOU & " /G Administratoren:F " & Lehrer & ":C ", 0, 1			 

' loginscript schreiben

LoginScriptName = ZielOU & ".bat"

LoginScriptPfad = "sysvol\" & DomainString & "\Scripts\Abschluss\Login"

LoginScript = "\\" & DomainString & "\" & LoginScriptPfad & "\" & LoginScriptName

LoginScriptPfadLokal = "C:\WINDOWS\SYSVOL" & "\" & LoginScriptPfad

LoginScriptDatei = LoginScriptPfadLokal & "\" & LoginScriptName

CreatePath LoginScriptPfadLokal

Set objTextStream = objFS.CreateTextfile(LoginScriptDatei)

objTextStream.write "net use " & AngabeDrive & " \\" & ServerName & "\" & AngabeShare & "\" & ZielOU

objTextStream.Close

Informationen = "Benutzername;Passwort" & vbCrLf

Randomize

For g = 1 To Anzahl

    ' die Verzeichnisse für die Lösungen werden erstellt;

    ' alle User haben eine zweistellige Bezeichnung, dh 01 bis 09, 10 usw

    Zahl = Right("0" & g, 2)

    MUsername = Bezeichnung & Zahl

    CreatePath "\\" & ServerName & "\" & LoesungsShare & "\" & ZielOU & "\" & MUsername

    ' die User werden nun im AD angelegt

    'Passwort = "Passwort" & i & "-" & Int(10000 * rnd + 1)

    Passwort = Kennwort(10)

    Set usr = ThisOU.Create("user", "CN=" & MUsername)

    usr.Put "samAccountName", MUsername

    usr.Put "userPrincipalName", MUsername & "@" & DomainString

    usr.Put "homeDirectory", "\\" & ServerName & "\" & LoesungsShare & "\" & ZielOU & "\" & MUsername

    usr.Put "homeDrive", LoesungsDrive

    usr.Put "scriptPath", LoginScript

    usr.SetInfo

    usr.SetPassword Passwort

    usr.AccountDisabled = False

    usr.SetInfo

    WScript.Sleep (1000)

    Informationen = Informationen & vbCrLf & MUsername & ";" & Passwort

    i = i + 1

    GroupObj.Add ("WinNT://"& DomainString & "/" & MUsername)

    WScript.Sleep (1000)

    ' die Berechtigungen werden in den Verzeichnissen der User gesetzt

    PermL1 = "Administratoren:F " & Lehrer & ":C " & MUsername & ":R "

    PermL2 = MUsername & ":W "

    PermA = "Administratoren:F " & Lehrer & ":C " & MUsername & ":R "

WshShell.Run "cmd /c echo j|cacls \\" & ServerName & "\" & LoesungsShare & "\" & ZielOU & "\" & MUsername & " /G " & PermL1 , 0, 1

WshShell.Run "cmd /c echo j|cacls \\" & ServerName & "\" & LoesungsShare & "\" & ZielOU & "\" & MUsername & " /E /G " & PermL2 , 0, 1

WshShell.Run "cmd /c echo j|cacls \\" & ServerName & "\" & AngabeShare & "\" & ZielOU & " /E /G " & PermA , 0, 1

    WScript.Sleep (1000)

Next

' die csv mit den Usern und Passwörtern wird erstellt

strDateiname = ZielOU & ".csv"

Set objTextStream = objFS.CreateTextFile(strDateiname, True)

objTextStream.write Informationen

objTextStream.Close

If i > 0 Then

    Erfolg = "Fertig: " & i & " Benutzer angelegt"

Else

    Erfolg = "Keine User angelegt."

End If

WScript.Echo Erfolg

Function Zeichen(Anfang, Ende)

    Zufall = Int((Ende - Anfang + 1) * Rnd + Anfang)

    Zeichen = Chr(Zufall)

End Function

Function Verschiebe(VWort)

    WLaenge = Len(VWort)

    NeuWort = ""

    ReDim WFeld(WLaenge)

    For t = 1 To WLaenge

        WFeld(t) = Mid(VWort, t, 1)

    Next

    Zahl = 0

    Do Until Len(NeuWort) = WLaenge

        j = Int((WLaenge) * Rnd + 1)

        If WFeld(j) <> "" Then

            NeuWort = NeuWort & WFeld(j)

            WFeld(j) = ""

        End If

        Zahl = Zahl + 1

        If Zahl > 1000 Then Exit Do ' Zur Sicherheit

    Loop

    Verschiebe = NeuWort

End Function

Function Kennwort(KennwortLaenge)

If KennwortLaenge > 128 Then KennwortLaenge = 128

Wort = ""

Wort = Zeichen(48, 57) ' Ziffern

Wort = Wort & Zeichen(65, 90) ' Großbuchstaben

Wort = Wort & Zeichen(97, 122) ' Kleinbuchstaben

Wort = Wort & Zeichen(33, 47) ' Satzzeichen

If KennwortLaenge > 4 Then

    For t = 5 To KennwortLaenge

        Wort = Wort & Zeichen(33, 122)  'sonstige Zeichen

    Next

End If

Wort = Verschiebe(Wort) ' Zeichenfolge zufällig ändern

Kennwort = Wort

Kennwort = Replace(Kennwort, " ", "_")

Kennwort = Replace(Kennwort, ";", "_")

Kennwort = Replace(Kennwort, """", "_")

End Function

Sub CreatePath(FullPath) 'Rekursive Erstellung eines Pfades

If Not objFS.FolderExists(FullPath) Then

    Folder = objfs.GetFileName(FullPath)

    ParentPath = objfs.GetParentFolderName(FullPath)

    If Right(ParentPath, 1) <> "\" Then ParentPath = ParentPath & "\"

    CreatePath(ParentPath)

    objFS.CreateFolder(ParentPath & Folder)

End If

End Sub

Sub CreateShare(ShareName, SharePath)

Set Freigaben = GetObject("WinNT://" & ServerName & "/LanmanServer,FileService")

Angelegt = False

For Each Freigabe In Freigaben

    If LCase(Freigabe.Name) = LCase(ShareName) Then

        Angelegt = True

        Exit For

    End If

Next

If Not Angelegt Then

    Set fs = Freigaben.Create("FileShare", ShareName)

    fs.Path = SharePath

    fs.MaxUserCount = -1

    fs.SetInfo

End If

Set Freigaben = Nothing

Set fs = Nothing

End Sub

Function OUExists(OUName, ParentOU)

Set Container = GetObject(ParentOU)

Container.Filter = Array("organizationalUnit")

OUExists = False

For Each OU In Container

    If LCase(OU.ou) = LCase(OUName) Then

        OUExists = True

        Exit For

    End If

Next

End Function

Function ObjectExists(ObjectName, ObjectType, DomainRoot)

Set Dom = GetObject(DomainRoot)

Dom.Filter = Array(ObjectType)

ObjectExists = False

For Each Obj In Dom

    If LCase(Obj.Name) = LCase(ObjectName) Then

        ObjectExists = True

        Exit For

    End If 

Next

End Function

Verwendung und Erklärung:

Durch doppelklicken der Datei useranlegen.vbs werden Euch 3 Fragen gestellt:
Wieviele User sollen angelegt werden?
Wie sollen die User heissen?
Wie soll die OU heissen, in der die User angelegt werden?

Ein Beispiel:
5
Deutschschularbeit_Lehrer1_
Deutschschularbeit

ergibt:
es werden 5 User mit einem 10-stelligen hochkomplexen Passwort angelegt. Alle User befinden sich in der OU “Deutschschularbeit” und heissen
Deutschschularbeit_Lehrer1_01
Deutschschularbeit_Lehrer1_02

Deutschschularbeit_Lehrer1_05
abschliessend wird eine Deutschklausur.csv erstellt, die alle Usernamen und Passwörter enthält.
Es werden  individuelle “Abgabeverzeichnisse” für jedenen einzelnen User erstellt; in diesen darf natürlich nur der jeweilige User arbeiten, lediglich die Gruppe der Lehrer hat ebenfalls Zugriff darauf;
Es wird eine Freigabe für die Angabe angelegt, in der die Lehrer schreiben dürfen, die Prüflinge aber nur lesen!

Wie benutzt ihr das Skript?

Folgende Variablen können im Script geändert werden (einfach mit einem Editor [zb Notepad o. ä.] öffnen)

groupstring = "pruefungsgruppe" --> Sicherheitsruppe, der die User beitreten (für Gruppenrichtlinien, etc)
servername = "halvar" --> Server, auf dem die Freigaben sind
loesungsshare = "\home\abschluss" --> Freigabe, auf der die Lösungsabgaben sind (Achte auf den Backslash am Beginn!!!)
angabeshare = "\abschluss\angabe" --> Freigabe, auf der die Angaben sind (Achte auf den Backslash am Beginn!!!)
PruefungsOU = "Pruefungen" --> Organisationseinheit, in der die User in einer UnterOU angelegt werden...

Die Abarbeitung des Scripts kann sich über einige wenige Minuten hinziehen… Durch die eingebauten Pausen ist das so erwünscht und vorgesehen (weil einige meiner DC noch PIII verbaut haben…)
Den Abschluss des Scripts erkennt ihr durch eine abschliessende Meldung.
Ihr findet nun im Ordner des Skripts eine .csv-Datei mit den Usernamen und Passwörtern

2. lokale Datenträger sollen nicht aufscheinen

Ihr braucht dazu eine Gruppenrichtlinie, die Ihr in der Organisationseinheit der Prüflinge eintragt. Die Vorgangsweise unterscheidet sich grundlegend, davon abhängig, ob ihr Windows XP oder Windows Vista/7 installiert habt…

Clients mit XP:

Da die User beim Login die Laufwerke U: und V: gemappt bekommen, müssen wir ihnen alle Laufwerke ausser diesen beiden ausblenden. Dies geschieht auf folgende Weise:

Navigiert in der gpmc zu folgendem Pfad:
Benutzerkonfigration – Administrative Vorlagen
Rechte Maustaste darauf –> Vorlagen hinzufügen und entfernen
… hinzufügen
es öffnet sich der Ordner C:\Windows\Inf
hier gibt es bereits die Vorlage system.adm
kopiert diese an einen sicheren Ort (falls ihr etwas kaputtisiert…)
öffnet die system.adm mit notepad und verändert sie wie folgt:
im Abschnitt
POLICY !!NoDrives
tragt nach “NAME !!ABCDOnly VALUE NUMERIC 15″ folgende Zeile ein:

NAME "Alle Laufwerke ausser U: und V:" VALUE NUMERIC 63963135

wiederholt diesen Vorgang im Abschnitt “POLICY !!NoViewOnDrive”

speichert die system.adm

gmpc schliessen und wieder öffnen
–> Benutzerkonfigration – Administrative Vorlagen – Explorer
öffnet den Eintrag “Diese angegebenen Datenträger im Fenster “Arbeitsplatz” ausblenden.
Ihr findet hier nun den Eintrag
“Alle Laufwerke ausser U: und V:”
diesen wählt ihr aus.

Clients mit Windows 7 bzw. Vista:

Gruppenrichtlinienverwaltung unter Windows7/Vista/Server 2008 als Domänenadministrator öffnen
Benutzerkonfiguration/Richtlinien/Administrative Vorlagen / System / Wechselmedienzugriff
[die Einstellungen sind selbsterklärend]

3. Verwendung der cmd.exe / PowerShell / MSN / Skype / etc. verweigern

Navigiert in der soeben erstellten Richtlinie zu folgendem Pfad:
Benutzerkonfiguration / Windowseinstellungen / Sicherheitseinstellungen / Softwarebeschränkungsrichtlinien / Richtlinien für Softwareeinschränkungen
Rechte Maustaste –> neue Hashregel
navigiert zu eurer cmd.exe –> das System errechnet den Hash-Wert dieser Datei –>
mit anderer Software wiederholen
ACHTUNG: ihr müsst zuvor die cmd/powershell etc vom Client kopieren und mit diesen .exe-Dateien arbeiten!!!
(zb.: cmd.exe von Win7 hat einen anderen Hashwert als die von Windows Server 2008 R2)

4.) Internetzugang am ISA-Server sperren

1.) Ich verwende hier die Gruppe, die im Skript in der Variable “groupstring” benannt wurde…
2.) an oberster Stelle (dh, die Firewallregel, die als letzte angewendet wird und somit alle anderen “überschreibt”) erstelle ich eine Regel, die der Gruppe Matura
den gesamten Verkehr von Netzwerk Intern nach Netzwerk Extern verweigert
falls Zugang zu einzelnen Seiten (zb Online-Dictionaries, etc) erwünscht :
3.) an oberster Stelle (dh, noch vor der soeben erstellten Regel) erstelle ich eine Regel, die der Gruppe Matura http und https erlaubt von Netzwerk Intern nach URL-Satz Matura (den muss ich natürlcih erst erstellen und anschliessend zb http://dict.tu-chemnitz.de etc. einfügen)

5.) Verhindern, dass die Prüflinge eigene “Server” in der Schule aufmachen

Alle oben genannten Maßnahmen helfen wenig, wenn die Schüler ein Notebook im Haus aufstellen, und sich über eine dort eingerichtete Freigabe die Lösungen zukommen lassen.
Hier hilft nur die Verwendung von VLANs mit entsprechenden Accesslists, sodass ein Netzwerkverkehr nur vom Prüfungsraum zu den Domänencontrollern möglich ist.
Jeder andere Netzwerkverkehr MUSS unterbunden werden, ansonsten sind alle anderen Unternehmungen “vergebene Liebesmüh”.

Zur Verwendung und Konfiguration von VLANs ein ander mal!

6.) Der Prüfling soll sich nur mit der dafür vorgesehenen Kennung einloggen

Mittels einer Gruppenrichtlinie [Computerkonfiguration / Windows-Einstellungen / Sicherheitseinstellungen / Lokale Richtlinien / Zuweisen von Benutzerrechten » Lokal anmelden zulassen] wird im Prüfungsraum nur (einzelnen) Lehrern, den Domänenadmins (!) sowie den Prüfungskennungen die Anmeldung gewährt.

 Diese Vorgangsweise ist sicher nicht der letzten Weisheit Schluss, aber für meine Bedürfnisse reichts.
Ich hoffe, ich habe die Benutzung einigermassen nachvollziehbar verfasst! Würde mich freuen, wenn ich euch zumindest einige Ideen liefern konnte…


This entry was posted in Active Directory, Gruppenrichtlinie, Prüfungen, VBScript, Windows Server 2003, Windows Server 2008. Bookmark the permalink.

Hinterlasse eine Antwort