Nickname
Passwort | vergessen?

225 anonyme User

2 angemeldete Mitglieder


Friemler
pieh-ejdsch
68315 Mitglieder freuen sich auf Dich!
Top-Aktivitäten
Sehen Sie hier, wer zu den aktivsten Mitgliedern der letzten Woche zählt:
Sponsored Links
In den Bereich Windows Server wechseln ..

Wie gestalte ich eine Prüfung unter Verwendung eines AD so, dass Zusammenarbeit der Prüflinge möglichst verhindert wird?

Mitglied: Edi.Pfisterer
Geschrieben von Edi.Pfisterer (Level 2 - Administrator in Ausbildung)
Erstellt am 05.03.2010, um 10:23:56 Uhr, Permanent-ID: 137501
Dieser Beitrag wurde bisher 3988 mal aufgerufen und gilt als gelöst.
Melden Sie sich mit Ihrem Nicknamen an, um diesen Beitrag zu bewerten!
Neutral0 NeutralDruckenBeobachten
Da sich in diesem Forum doch einige Lehrer tummeln, hier ein Ansatz, wie ich es versuche zu verhindern, dass SchülerInnen während schriftlicher Prüfungen am PC schummeln...
Hallo!

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

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)
(Das folgende Script ist eine zusammengebastelte Lösung aus Webfunden und eigenen Ideen. Da ich es schon lange im Einsatz habe, kann ich nicht mehr mit Sicherheit sagen, woher ich die Schnipsel habe, was ich selbst gebastelt habe... Falls jemand sich als Urheber einzelner Teile erkennt. Bitte PM oder hier vermerken. Ich persönlich lege bei meinen Schnipseln keinen Wert auf das Urheberrecht...)

Ich verwende folgende Datei, die ich in ein Verzeichnis auf einem Domänencontroller lege:

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

01.
'################################################################################################################# 
02.
'### Script, um die Anzahl von N Usern per Skript im AD mit 10-stelligen, komplexem Passwort anlegen           ### 
03.
'### getestet auf Windows Server 2003 SP2, Server2003 R2 u 2008 R2 (jeweils Deutsch)                           ### 
04.
'### Ver 10/3/2010_23:53                                                                                        ### 
05.
'################################################################################################################# 
06.
 
07.
 
08.
'_______________________________________________________________________________________________________________ 
09.
' Der folgende Teil dient lediglich dazu, den Urheber zu finden, wenn das Skript nicht (nicht mehr) funktioniert 
10.
' und ihr Kontakt aufnehmen wollt 
11.
' Script zusammengebastelt aus Webfunden (Urheber sind mir nicht bekannt) und eigenen Schnipseln von 
12.
' User urobe73(Edi Pfisterer) --> www.administrator.de 
13.
' Anregungen / Codeteile von Bastla --> www.administrator.de 
14.
' bei Fragen: einfach eine PM an mich oder eine Mail an den Admin der Handelsakadmie Neusiedl am See 
15.
' Ich übernehme keine Haftung und lege auf jegliche Urheberrechte an Skripts, die ich erstellt habe, keinen Wert! 
16.
' Kopiert, verändert und/oder gebt es als Euer Skript aus: mir ist alles recht!!! 
17.
'_______________________________________________________________________________________________________________ 
18.
Set objComputer = CreateObject("Shell.LocalMachine")         ' nicht verändern! 
19.
 
20.
 
21.
'### folgende Variablen können (müssen abern nicht) verändert werden: ## 
22.
 
23.
  ServerName = objComputer.MachineName                          'Server, auf dem die Shares erstellt wurden; falls nicht anders 
24.
                                                                'angegeben, der DC auf dem das Script gestartet wird 
25.
 
26.
  LoesungsPfad = "C:\Klausuren"                                         'In diesem Pfad des Servers werden die Freigaben erstellt 
27.
  AngabePfad = "C:\Angaben"                                          'In diesem Pfad des Servers werden die Freigaben erstellt 
28.
 
29.
  LoesungsShare = "Klausuren"                                   'Freigabe, auf der die Lösungen gespchert werden. 
30.
  LoesungsDrive = "U:" 
31.
  AngabeShare = "Angabe"                                        'Freigabe für Angaben! 
32.
  AngabeDrive = "V:" 
33.
  PruefungsOU = "Klausuren"                                     'Organisationseinheit, die im AD per Skript angelegt wird 
34.
  GroupString = "Klausurengroup"                                'Sicherheitsgruppe, in der die User automatisch Mitglieder werden 
35.
  Lehrer = "lehrer"                                             'Sicherheitsgruppe, in der die Lehrer Mitglieder sind 
36.
 
37.
'### hier beginnt der Teil, der eher nur noch von Auskennern angefasst werden sollte ;-)  ## 
38.
 
39.
 
40.
Anzahl = InputBox("Wie viele User?") 
41.
Bezeichnung = InputBox("Wie sollen die Benutzer heissen?") 
42.
ZielOU = InputBox("In welcher OU sollen die User angelegt werden?") 
43.
 
44.
Set objFS = CreateObject("scripting.filesystemobject") 
45.
Set WshShell = WScript.CreateObject("WScript.Shell") 
46.
Set rootDSE = GetObject("LDAP://RootDSE") 
47.
DomainName = rootDSE.Get("defaultnamingcontext") 
48.
 
49.
' aus DC=hak-neusiedl,DC=local wird hak-neusiedl.local 
50.
DomainString = Replace(DomainName, "DC=", "") 
51.
DomainString = Replace(DomainString, ",", ".") 
52.
 
53.
'erstellt eine neue OU für die Prüfungen 
54.
If Not OUExists(PruefungsOU, "LDAP://" & DomainName) Then 
55.
    Set PrfOU = GetObject("LDAP://" & DomainName).Create("organizationalUnit", "ou=" & PruefungsOU) 
56.
    PrfOU.SetInfo 
57.
Else 
58.
    Set PrfOU = GetObject("LDAP://" & "ou=" & PruefungsOU& "," & DomainName) 
59.
End If 
60.
 
61.
' erstellt, falls noch nicht vorhanden, eine neue Gruppe, in der die User Mitglied werden 
62.
If Not ObjectExists(GroupString, "group", "WinNT://" & DomainString) Then 
63.
    Set objGroup = PrfOU.Create("Group", "CN=" & GroupString) 
64.
    objGroup.Put "sAMAccountName", GroupString 
65.
    objGroup.SetInfo 
66.
End If 
67.
' Die Gruppe wird gesucht und als Ziel definiert. 
68.
Set GroupObj = GetObject("WinNT://" & DomainString & "/" & GroupString) 
69.
 
70.
' ZielOU nach Prüfung auf Vorhandensein erstellen 
71.
Abbruch = False 
72.
Do While OUExists(ZielOU, PrfOU.ADSPath) And Not Abbruch 
73.
    Do 
74.
        ZielOU = InputBox(_  
75.
            "Die OU " & ZielOU & " wurde bereits verwendet!" & vbCrLf & _ 
76.
            "Bitte geben Sie eine andere OU oder ""exit"" für Abbruch ein!") 
77.
    Loop Until ZielOU <> "" 
78.
    If LCase(ZielOU) = "exit" Then Abbruch = True 
79.
Loop 
80.
If Abbruch Then WScript.Quit 
81.
 
82.
' Prüfung, ob Benutzer angelegt 
83.
Do While ObjectExists(Bezeichnung & "01", "user", "WinNT://" & DomainString) And Not Abbruch 
84.
    Do 
85.
        Bezeichnung = InputBox(_  
86.
            "Die Bezeichnung " & Bezeichnung & " wurde bereits verwendet!" & vbCrLf & _ 
87.
            "Bitte geben Sie eine andere Bezeichnung oder ""exit"" für Abbruch ein!") 
88.
    Loop Until Bezeichnung <> "" 
89.
    If LCase(Bezeichnung) = "exit" Then Abbruch = True 
90.
Loop 
91.
If Abbruch Then WScript.Quit 
92.
 
93.
' erstellt in der Prüfungs-OU nun eine neue OU lt Eingabe 
94.
Set ThisOU = GetObject(PrfOU.ADSPath).Create("organizationalUnit", "ou=" & ZielOU) 
95.
ThisOU.SetInfo 
96.
 
97.
' erstellt den Pfad für die Freigaben 
98.
CreatePath LoesungsPfad 
99.
CreatePath AngabePfad & "\" & ZielOU 
100.
 
101.
' es werden die Freigaben erzeugt 
102.
CreateShare LoesungsShare, LoesungsPfad 
103.
CreateShare AngabeShare, AngabePfad 
104.
 
105.
' Grundlegende Rechte für Angabe- und Pruefungsordner setzen 
106.
WshShell.Run "cmd /c echo j|cacls " & LoesungsPfad & " /G Administratoren:F " & Lehrer & ":C " & GroupString & ":R", 0, 1			  
107.
WshShell.Run "cmd /c echo j|cacls " & LoesungsPfad & " /E /G " & GroupString & ":W", 0, 1			  
108.
WshShell.Run "cmd /c echo j|cacls " & AngabePfad & " /G Administratoren:F " & Lehrer & ":C " & GroupString & ":R", 0, 1			  
109.
WshShell.Run "cmd /c echo j|cacls " & AngabePfad & "\" & ZielOU & " /G Administratoren:F " & Lehrer & ":C ", 0, 1			  
110.
 
111.
 
112.
' loginscript schreiben 
113.
LoginScriptName = ZielOU & ".bat" 
114.
LoginScriptPfad = "sysvol\" & DomainString & "\Scripts\Abschluss\Login" 
115.
LoginScript = "\\" & DomainString & "\" & LoginScriptPfad & "\" & LoginScriptName 
116.
LoginScriptPfadLokal = "C:\WINDOWS\SYSVOL" & "\" & LoginScriptPfad 
117.
LoginScriptDatei = LoginScriptPfadLokal & "\" & LoginScriptName 
118.
CreatePath LoginScriptPfadLokal 
119.
 
120.
Set objTextStream = objFS.CreateTextfile(LoginScriptDatei) 
121.
objTextStream.write "net use " & AngabeDrive & " \\" & ServerName & "\" & AngabeShare & "\" & ZielOU 
122.
objTextStream.Close 
123.
 
124.
Informationen = "Benutzername;Passwort" & vbCrLf 
125.
Randomize 
126.
 
127.
For g = 1 To Anzahl 
128.
    ' die Verzeichnisse für die Lösungen werden erstellt; 
129.
    ' alle User haben eine zweistellige Bezeichnung, dh 01 bis 09, 10 usw 
130.
    Zahl = Right("0" & g, 2) 
131.
    MUsername = Bezeichnung & Zahl 
132.
 
133.
    CreatePath "\\" & ServerName & "\" & LoesungsShare & "\" & ZielOU & "\" & MUsername 
134.
 
135.
    ' die User werden nun im AD angelegt 
136.
 
137.
    'Passwort = "Passwort" & i & "-" & Int(10000 * rnd + 1) 
138.
    Passwort = Kennwort(10) 
139.
 
140.
    Set usr = ThisOU.Create("user", "CN=" & MUsername) 
141.
    usr.Put "samAccountName", MUsername 
142.
    usr.Put "userPrincipalName", MUsername & "@" & DomainString 
143.
    usr.Put "homeDirectory", "\\" & ServerName & "\" & LoesungsShare & "\" & ZielOU & "\" & MUsername 
144.
    usr.Put "homeDrive", LoesungsDrive 
145.
    usr.Put "scriptPath", LoginScript 
146.
    usr.SetInfo 
147.
    usr.SetPassword Passwort 
148.
    usr.AccountDisabled = False 
149.
    usr.SetInfo 
150.
    WScript.Sleep (1000) 
151.
 
152.
    Informationen = Informationen & vbCrLf & MUsername & ";" & Passwort 
153.
    i = i + 1 
154.
 
155.
    GroupObj.Add ("WinNT://"& DomainString & "/" & MUsername) 
156.
    WScript.Sleep (1000) 
157.
 
158.
    ' die Berechtigungen werden in den Verzeichnissen der User gesetzt 
159.
    PermL1 = "Administratoren:F " & Lehrer & ":C " & MUsername & ":R " 
160.
    PermL2 = MUsername & ":W " 
161.
    PermA = "Administratoren:F " & Lehrer & ":C " & MUsername & ":R " 
162.
 
163.
    CMD = "cmd /c echo j|cacls \\" & ServerName & "\" & LoesungsShare & "\" & ZielOU & "\" & MUsername & " /G " & PermL1 & " && " & _ 
164.
                 "echo j|cacls \\" & ServerName & "\" & LoesungsShare & "\" & ZielOU & "\" & MUsername & " /E /G " & PermL2 & " && " & _ 
165.
                 "echo j|cacls \\" & ServerName & "\" & AngabeShare & "\" & ZielOU & " /E /G " & PermA 
166.
    WshShell.Run CMD, 0, 1			  
167.
 
168.
    WScript.Sleep (1000) 
169.
 
170.
Next 
171.
 
172.
' die csv mit den Usern und Passwörtern wird erstellt 
173.
strDateiname = ZielOU & ".csv" 
174.
Set objTextStream = objFS.CreateTextFile(strDateiname, True) 
175.
objTextStream.write Informationen 
176.
objTextStream.Close 
177.
 
178.
If i > 0 Then 
179.
    Erfolg = "Fertig: " & i & " Benutzer angelegt" 
180.
Else 
181.
    Erfolg = "Keine User angelegt." 
182.
End If 
183.
 
184.
WScript.Echo Erfolg 
185.
 
186.
 
187.
Function Zeichen(Anfang, Ende) 
188.
    Zufall = Int((Ende - Anfang + 1) * Rnd + Anfang) 
189.
    Zeichen = Chr(Zufall) 
190.
End Function 
191.
 
192.
Function Verschiebe(VWort) 
193.
    WLaenge = Len(VWort) 
194.
    NeuWort = "" 
195.
    ReDim WFeld(WLaenge) 
196.
    For t = 1 To WLaenge 
197.
        WFeld(t) = Mid(VWort, t, 1) 
198.
    Next 
199.
    Zahl = 0 
200.
    Do Until Len(NeuWort) = WLaenge 
201.
        j = Int((WLaenge) * Rnd + 1) 
202.
        If WFeld(j) <> "" Then 
203.
            NeuWort = NeuWort & WFeld(j) 
204.
            WFeld(j) = "" 
205.
        End If 
206.
        Zahl = Zahl + 1 
207.
        If Zahl > 1000 Then Exit Do ' Zur Sicherheit 
208.
    Loop 
209.
    Verschiebe = NeuWort 
210.
End Function 
211.
 
212.
Function Kennwort(KennwortLaenge) 
213.
If KennwortLaenge > 128 Then KennwortLaenge = 128 
214.
Wort = "" 
215.
Wort = Zeichen(48, 57) ' Ziffern 
216.
Wort = Wort & Zeichen(65, 90) ' Großbuchstaben 
217.
Wort = Wort & Zeichen(97, 122) ' Kleinbuchstaben 
218.
Wort = Wort & Zeichen(33, 47) ' Satzzeichen 
219.
If KennwortLaenge > 4 Then 
220.
    For t = 5 To KennwortLaenge 
221.
        Wort = Wort & Zeichen(33, 122)  'sonstige Zeichen 
222.
    Next 
223.
End If 
224.
Wort = Verschiebe(Wort) ' Zeichenfolge zufällig ändern 
225.
Kennwort = Wort 
226.
Kennwort = Replace(Kennwort, " ", "_") 
227.
Kennwort = Replace(Kennwort, ";", "_") 
228.
Kennwort = Replace(Kennwort, """", "_") 
229.
End Function 
230.
 
231.
Sub CreatePath(FullPath) 'Rekursive Erstellung eines Pfades 
232.
If Not objFS.FolderExists(FullPath) Then 
233.
    Folder = objfs.GetFileName(FullPath) 
234.
    ParentPath = objfs.GetParentFolderName(FullPath) 
235.
    If Right(ParentPath, 1) <> "\" Then ParentPath = ParentPath & "\" 
236.
    CreatePath(ParentPath) 
237.
    objFS.CreateFolder(ParentPath & Folder) 
238.
End If 
239.
End Sub 
240.
 
241.
Sub CreateShare(ShareName, SharePath) 
242.
Set Freigaben = GetObject("WinNT://" & ServerName & "/LanmanServer,FileService") 
243.
Angelegt = False 
244.
For Each Freigabe In Freigaben 
245.
    If LCase(Freigabe.Name) = LCase(ShareName) Then 
246.
        Angelegt = True 
247.
        Exit For 
248.
    End If 
249.
Next 
250.
If Not Angelegt Then 
251.
    Set fs = Freigaben.Create("FileShare", ShareName) 
252.
    fs.Path = SharePath 
253.
    fs.MaxUserCount = -1 
254.
    fs.SetInfo 
255.
End If 
256.
Set Freigaben = Nothing 
257.
Set fs = Nothing 
258.
End Sub 
259.
 
260.
Function OUExists(OUName, ParentOU) 
261.
Set Container = GetObject(ParentOU) 
262.
Container.Filter = Array("organizationalUnit") 
263.
OUExists = False 
264.
For Each OU In Container 
265.
    If LCase(OU.ou) = LCase(OUName) Then 
266.
        OUExists = True 
267.
        Exit For 
268.
    End If 
269.
Next 
270.
End Function 
271.
 
272.
Function ObjectExists(ObjectName, ObjectType, DomainRoot) 
273.
Set Dom = GetObject(DomainRoot) 
274.
Dom.Filter = Array(ObjectType) 
275.
ObjectExists = False 
276.
For Each Obj In Dom 
277.
    If LCase(Obj.Name) = LCase(ObjectName) Then 
278.
        ObjectExists = True 
279.
        Exit For 
280.
    End If  
281.
Next 
282.
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_
Deutschklausur

ergibt:
es werden 5 User mit einem 10-stelligen hochkomplexen Passwort angelegt. Alle User befinden sich in der OU "Deutschklausur" und heissen
Deutschschularbeit_01
Deutschschularbeit_02
...
Deutschschularbeit_05
abschliessend wird eine Deutschklausur.csv erstellt, die alle Usernamen und Passwörter enthält.

Wie benutzt ihr das Skript?

Folgende Variablen können geändert werden

groupstring = "pruefungsgruppe" --> Gruppe, der die User beitreten
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 Matura eintragt.
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:
01.
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.

[auf die Anregung von n.o.b.o.d.y s hin:]
Verwendung der cmd.exe 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 -->
im Bedarfsfall mit anderer Software wiederholen


[letzte Anmerkung:
bei mir pfeift die Anmeldung manchmal auf das loginscript der User... daher habe ich noch eine zusätzliche Gruppenrichtlinie erstellt, die das laufwerk V: mit der Angabe mappt...]



3.) 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 angelegt wird) 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)

[edit: hier wird auch noch ein Skript eingestellt, das dieses für Euch erledigt...]]


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...

Freue mich über Anregungen oder Rückmeldungen face-wink

lg
Edi
Kommentar schreibenMit Zitat
Anmeldung erforderlich!
Bitte melden Sie sich erst mit Ihrem Nicknamen und Passwort an.
Diskussionsverlauf (10 Kommentare)