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…