Hier möchte ich mal ein paar Gedanken über die Verteilung von Benutzerordner auf mehrere Volumes/Server teilen. Mit Ordnerumleitung und servergespeicherten Profilen kann ein einzelner Fileserver schnell mal zum Bottleneck werden.
Szenario:
Wir haben viele Benutzer mit großen persönlichen Ordnern und der betreffende Fileserver ist so groß, das man Probleme beim Backup, Restore, Handling ggf. sogar bei der Performance bekommt. Auch aus Gründen des Impacts eines Serverausfall kann ein einzelner Server ein Problem sein. Genug Gründe um hier eine bessere Lösung zu implementieren.
Lösungsansatz:
Schön wäre es wenn man die persönlichen Ordner inklusive der potentiellen Ordnerumleitung auf mehrere Server verteilt. Besser wäre es wenn die Ordner für neue Benutzer automatisch erstellt werden und diese auf die Server verteilt werden.
Lösung:
Wir werden auf aktuelle Mechanismen von Server 2012 R2 zurückgreifen, um mittels DFS mehrere Benutzerordner-ablagepunkte auf verschiedene Server bzw. Volumes zu verteilen. Um die Benutzerordnerablagepunkte eindeutig zu identifizieren wird das Attribute „Pager“ des jeweiligen Benutzers gepflegt. Alternativen sind auch möglich, wobei ich davon ausgehe das heutzutage kaum mehr Pager im Einsatz sind. Zudem muss man im Active Directory für dieses Attribute keinerlei Rechte verändern, da der Benutzer den Wert für sich selber setzen darf, daß ist bei anderen Attributen nicht so und bedeutet ggf. höheren Aufwand. In diesem Beitrag möchte ich jeden Schritt erklären und beleuchten, damit potentielle Hürden wie DFS, DFS-Links und GPOs keine Relevanz mehr haben.
Anpassbar an die jeweilige Umgebung:
- Der DFS Pfad ist anpassbar
- Die Anzahl der Benutzerordnerablagepunkte ist anpassbar
- Der Laufwerksbuchstabe für den persönlichen Ordner soll definierbar sein
- neue Benutzer mit leeren Attribut müssen gleichmäßig auf alle Server verteilt werden und das Attribut muss ins AD geschrieben werden, damit immer der gleiche Server für diesen Benutzer genutzt wird
- Kosmetik: Die Möglichkeit neu anzulegende Benutzerordner mit Großbuchstaben zu schreiben, auch wenn der SamAccountName Groß/Kleinschreibung enthält
- Kosmetik: Die Möglichkeit den DFS Pfad beim verbundenen Laufwerk durch einen Namen zu ersetzen (z.B. Persönlicher Ordner)
Grober Ablaufplan:
- Wichtige Werte für die Umgebung definieren
- Shares auf den Server bereit stellen
- DFS aufbauen, wenn nicht vorhanden
- GPO mit dem Script erstellen/vorhandene erweitern
- Migrationsstrategie für vorhandene Ordner
Wichtige Werte für die Umgebung definieren
In dem Script gibt es eine Sektion, in der man das Script auf die jeweilige Umgebung anpasst. Das ist wichtig, denn jede Umgebung hat andere Vorgaben. Schauen wir uns die nötigen Werte mal an.
DriveLetter
Diese Variable muss gepflegt werden und hat den Standardwert von „U:“. Wenn der Ordner zu einem anderen Laufwerksbuchstaben verbunden werden soll, dann muss genau hier Buchstabe eingetragen werden. Der Wert wird mit Doppelpunkt eingetragen.
HomeDirPath
In der Variable wird der Pfad im DFS angegeben, aber ohne ein Backslash am Ende und ohne die Nummern der DFS-Links. Wer noch nie DFS eingesetzt hat muss nicht die Mundwinkel hochziehen – DFS wird Schritt für Schritt in Teil 3 erklärt. Auch wenn wir jetzt noch nicht wissen was hier eingetragen werden soll, nach der DFS Bereitstellung in Teil 3 wissen wir das.
CountHomeStores
Die Variablen sind alle in Englisch gehalten, damit das Script auch Admins verstehen, die den deutschen nicht mächtig sind. Also diese Variable gibt an auf wie vielen Servern/Volumes zukünftig die persönlichen Ordner verteilt werden sollen. Derzeit ist es wahrscheinlich nur ein Server. Die Überlegung ist in wie viele Portionen ich die Daten auf dem einen Server aufteilen möchte. Standardwert dieser Variable ist 4, aber ggf. sind 2 für kleine oder bis zu 12 für große Unternehmen auch passend. Jeder Wert zwischen 1 und 12 ist möglich.
FoldernameUcase
Kommen wir zu etwas Kosmetik im Filesystem. Wenn diese Variable „True“ enthält dann wird bei Neuanlage eines persönlichen Ordners aus „BFischer“ „BFISCHER“ und aus „UsErNaMe67“ wird „USERNAME67“. Das soll Eingabefehler beim SamAccountName korrigieren und die Ordner vereinheitlichen. Wenn man das nicht will, dann einfach mit False deklarieren, dann wird die Funktion nicht ausgeführt. Diese Variable zieht nur bei neuen Benutzer und nicht bei bestehenden!
MappedDrivePathRename und MappedDrivePathName
Kosmetik im Explorer des Users. Die Variable MappedDrivePathRename gibt an ob das verbundene Laufwerk den DFS Pfad beinhalten soll oder ob das Laufwerk z.B. „Persönlicher Ordner“ heissen soll. Standardmäßig wird umbenannt in „Persönlicher Ordner“, wobei der Name des Laufwerks in der Variable MappedDrivePathName stehen muss. Hier kann man rumspielen, denn wird die Funktion deaktiviert, dann wird immer der DFS Pfad angezeigt.
Vorbereitung Fileserver
Fangen wir an mit der Einrichtung. Ich dokumentiere hier den Fall das wir auf einem Fileserver mehrere Volumes für die Benutzerordner nutzen wollen, alternativ kann man die Volumes auch auf verschiedenen Servern legen (große Umgebungen). Wichtig ist das die lokalen Rechte auf dem Server angepasst werden, damit Ordner automatisch angelegt werden und die Benutzerordner auch nur dem Benutzer selber gelesen und geschrieben werden können (Ausnahme Administratoren).
Zunächst habe ich 4 GPT Volumes erstellt und benannt mit Userhomes1-4 sowie einen Laufwerksbuchstaben zugewiesen. (Testumgebung daher nur 10 GB)
Wir geben das Laufwerk I: frei mit den Namen „Userhomes4$“ (verstecke Freigabe) und mit den Rechten „Jeder“ hat Vollzugriff, denn die NTFS Rechte sind restriktiver. Die NTFS Rechte auf I: müssen wie folgt geändert werden:
Die Rechte sollte man anpassen bevor ein Ordner auf dem Volume erstellt wurde.
Ziel ist das die Berechtigungen so aussehen:
ERSTELLER-BESITZER – Vollzugriff (Anwenden auf: nur Unterordner und Dateien)
System – Vollzugriff (Anwenden auf: Diesen Ordner, Unterordner und Dateien)
Domain Admins – Vollzugriff (Anwenden auf: Diesen Ordner, Unterordner und Dateien)
Jeder – Ordner erstellen/Daten anhängen (Anwenden auf: Nur diesen Ordner)
Jeder – Ordner auflisten/Daten lesen (Anwenden auf: Nur diesen Ordner)
Jeder – Berechtigungen lesen (Anwenden auf: Nur diesen Ordner)
Jeder – Ordner durchsuchen/Datei ausführen (Anwenden auf: Nur diesen Ordner)
Quelle: http://blogs.technet.com/b/migreene/archive/2008/03/24/3019467.aspx
Die Berechtigungen werden wie folgt geändert. Alle Berechtigungen für die lokale Gruppe „Benutzer“ werden entfernt. Die Berechtigung für „Jeder“ wird bearbeitet.
Erweiterte Berechtigungen anzeigen …
Und das Recht „Ordner erstellen/Daten anhängen“ aktivieren und mit OK bestätigen. Sollte im Endeffekt etwa so aussehen:
Dieser Vorgang wird wiederholt für die anderen Volumes mit Benutzerordnern. Danach haben wir den Part für den Fileserver fertig.
DFS einrichten
Das DFS (verteilte Dateisystem) ist gerade in großen Umgebungen unverzichtbar und eine große Hilfe. Egal ob es um Livecycle von Fileservern oder verteilen von großen Datenmengen auf verschiedene Server geht, DFS ist wichtig, damit der Pfad für die Benutzer immer gleich bleibt. Auch in unserem Fall wollen wir DFS einsetzen. Wer sich nicht damit auskennt, der sei beruhigt, ich werde Schritt für Schritt die Implementierung dokumentieren.
Domänencontroller vorbereiten
DFS-Namespace aktivieren (sowie der vorgeschlagenen Features) und mit Weiter akzeptieren.
Das sind die Punkte die wir brauchen, also Installieren.
Wenn die Installation fertig ist können wir die DFS-Verwaltung öffnen.
Neuen Namespace anlegen.
Der Namespaceserver ist der Server wo wir gerade die DFS Tools installiert haben. Später können wir weitere Domänencontroller als Namespaceserver hinzufügen, damit wir Redundanz schaffen für den Fall das dieser Domänencontroller ausfällt.
Der Name den wir hier festlegen wird später so aussehen \\fqdn_der_Domäne\Users . Ein wichtiger Punkt verbirgt sich unter Einstellungen.
Die DFS-Links, die wir gleich anlegen, werden auf dem Domänencontroller lokal abgelegt und zwar standardmäßig im Ordner C:\DFSRoots .Wir werden in unserem Beispiel keine ABE (zugriffsbasierte Aufzählung) implementieren, da das für die Benutzerordner nicht viel Sinn macht. Trotzdem ist es gut zu wissen, wo die logischen Links liegen, die auf die Fileserver zeigen.
Wir nutzen den domänenbasierten Namespace. Jetzt sieht man auch den Namen unseres Namespaces, den wir in die Variable „HomeDirPath“ im Script eintragen müssen.
(Optional) zweiten Namespaceserver hinzufügen
Wenn wir mindestens zwei Domänencontroller haben bietet es sich an, zumindest einen weiteren Namespaceserver hinzuzufügen, damit die Laufwerke auch verbunden werden wenn der erste Domänencontroller ausfällt. Für kleine Umgebungen ist das optional.
Namespace anwählen, auf die Karteikarte „Namespaceserver“ klicken und rechts „Namespaceserver hinzufügen“ klicken.
In der folgenden Maske den zweiten Domänencontroller auswählen mit OK bestätigen schon hat man die Redundanz implementiert.
Wir erstellen gleich die DFS-Links, diese werden automatisch auf beide Server gelegt. Wenn man den zweiten Namespaceserver hinzufügt nachdem man DFS-Links erstellt hat, dann muss man selber dafür sorgen dass diese auf den zweiten Server kopiert werden!
Erstellen der DFS Links
Um einen DFS-Link zu erstellen wählen wir neuer Ordner.
Der Name des ersten DFS-Links lautet „1“ und zeigt auf den Fileserver und der ersten versteckten Freigabe.
Tipp: Den Servernamen mit FQDN schreiben (als statt FS01 besser FS01.liesst.mit). Das löst Probleme bei Multidomänen bzw. bei Netzwerken mit verschiedenen DNS Suffixen.
Das Gleiche wird im Anschluss für die restlichen DFS-Links genauso gemacht, bis wir die Zahl erreicht haben die wir möchten (in unserem Fall 4).
GPO bauen und Script hinterlegen
Logonscript Script hinterlegen
Jetzt überlegen wir eine passende Ablage für das Logonscript. Da bietet sich natürlich das NETLOGON an, weil das zwischen den Domänencontroller repliziert wird.
Also auf dem Domänencontroller im Explorer C:\Windows\SYSVOL\domain\scripts eingeben und einen neuen Ordner erstellen, ich nenne ihn „Logonscript“.
Da hinein legen wir die beiden Dateien für das Logonscript.
Inhalt der Logonscript.cmd
Die Variable %Logonserver% wurde bewusst genutzt. Würden wir hier den FQDN der Domäne eintragen, dann müssen wir per GPO zusätzlich dafür sorgen, dass der FQDN der Domäne in den vertrauenswürdigen Seiten des Internet Explorer aller Clients eingetragen wird. Sicherer ist hier die Nutzung der Variable %Logonserver%
Anpassen des Scriptes
Jetzt passen wir das Script auf die jeweilige Umgebung an. Als Laufwerksbuchstaben möchte ich gern U: haben, also:
DriveLetter = „U:“
Der DFS Pfad in meinen Fall lautet:
HomeDirPath = „\\liesst.mit\Users“
Auf dem Fileserver habe ich 4 Volumes, 4 Freigaben und somit 4 DFS-Links erstellt:
CountHomeStores = 4
Jetzt die optionalen Einstellungen. Ich möchte das die Namen der Benutzer auf dem Fileserver groß geschrieben werden, also:
FoldernameUcase = „True“
Und das U: Laufwerk soll für den Benutzer umbenannt werden in Persönlicher Ordner, damit der DFS Pfad verschwindet:
MappedDrivePathRename = „True“
MappedDrivePathName = „Persönlicher Ordner“
Die letzte optionale Einstellung ist der Ablageort der Logdatei. Die würde ich gern in das Temp Verzeichnis schreiben. Die Datei wird jedesmal überschrieben und ist wenige kb groß.
Logfile = WshSysEnv(„TEMP“) & „\“ & „logon-results.txt“
Wer das nicht will – einfach auskommentieren.
Tipp: Wenn das Speichern des Scripts nicht funktioniert im Vorwege den Namen auf Logon2.vbs ändern, das Script bearbeiten und Speichern als Logon.vbs , alternativ kann man das Script unter C:\Temp anpassen und danach in den Originalordner kopieren.
GPO erstellen
Gruppenrichtlinienverwaltung öffnen
Neue GPO erstellen
Und einen Namen geben.
Unter Richtlinien\Windows-Einstellungen\Skripts ein Anmeldescript hinterlegen
\\fqdn_der_Domäne\NETLOGON\Logonscript finden wir unser Script und wählen die cmd Datei aus.
2 Mal mit OK bestätigen.
Optional kann in der gleichen GPO noch ein weiterer Wert definiert werden.
Unter Computerkonfiguration\Richtlinien\Administrative Vorlagen\System\Gruppenrichtlinie sollte man den Punkt „Anmeldeskriptverzögerung konfigurieren“ (engl. Configure Logon Script Delay) und dort den Wert „0“ eintragen. Hintergrund: Bei Windows 8.1 kann es dazu kommen dass das Logonscript erst Minuten nach der Anmeldung abgearbeitet wird. Durch setzen des Wertes auf „0“ wird das Script sofort abgearbeitet. Siehe KB2895815 von Microsoft.
Final muss nun noch die Gruppenrichtlinie in der Domäne bzw. an eine OU verknüpft werden.
Migrationsstrategie für vorhandene Ordner
Da in den wenigsten Fällen grüne Wiese existiert muss man sich Gedanken machen wie man die Ordner von dem alten Server auf die neuen Server bekommt und dabei so wenig wie möglich Unterbrechung gibt.
Man kann die neue GPO einstellen, dass sie nur von Mitgliedern einer Active Directory Gruppe übernommen wird. Somit gilt die GPO zuerst für niemanden. Wenn man nun den Ordner eines Benutzers kopiert hat, dann setzt man das Attribut „Pager“ für diesen Benutzer und nimmt ihn in die neue Gruppe auf. Auf dem alten Server nimmt man die Rechte für diesen User für seinen alten Ordner weg. Wenn der Benutzer das nächste Mal sich anmeldet, dann bekommt er das neue Logonscript und somit sein Laufwerk verbunden mit dem neuen Server. Somit kann man die Migration schrittweise und kontrolliert vollzogen werden.
Benutzer die neu angelegt werden müssten sofort in die neue AD-Gruppe aufgenommen werden, damit das Benutzer Attribute automatisch generiert wird und der Ordner auf dem Server angelegt wird.
Wenn die Ordner aller Benutzer migriert sind, kann man die Zuweisung der GPO wieder für alle Benutzer zulassen und die AD-Gruppe ist nicht mehr nötig.
Troubleshooting
Standardmäßig wird ein Log in den Ordner der lokalen Variable %Temp% abgelegt. Wenn das Laufwerk nicht verbunden wird, ist das der erste Anlaufpunkt. Standardmäßig findet man das Log unter C:\Users\<Benutzername>\AppData\Local\Temp
Also %temp% in der Adresszeile eingeben und mit Enter bestätigen.
Schon kann man das Log sich anschauen.
Einige Standardfehler habe ich versucht schon im Script abzufangen.
Unzureichende Rechte auf dem persönlichen Ordner
Fehlermeldung im Log:
-2147024891 Hat der Benutzer TESTER02 wirklich volle Rechte auf den Ordner \\liesst.mit\Users\2\TESTER02 ?
Dieser Punkt wird von Script geprüft und ins Log geschrieben. Dabei tritt ein Timeout ein was die Verarbeitung des Scriptes verzögert, aber man kann den Fehler sofort lesen.
Abhilfe:
Auf dem Fileserver die Rechte des Ordners prüfen. Ggf. wurden die Rechte nicht korrekt neu gesetzt nachdem der Ordner von einem anderen Server kopiert wurde.
Wert des Attributes Pager für den Benutzer ist nicht korrekt
Wenn der Wert des Pager Attributes zu groß oder zu klein ist, dann fängt das Script diesen Fehler ab und generiert eine Fehlermeldung für den Benutzer.
Abhilfe:
Prüfen ob der Ordner auf dem Fileserver schon vorhanden ist und die korrekte Zahl in das Attribute eintragen.
Im Benutzerobjekt ist der Wert Basisordner verbinden gesetzt
Fehlermeldung im Log:
— Achtung! —
Wenn das Laufwerk nicht mehr verbunden ist liegt das ggf. daran, das bei diesem Benutzer im AD
auf der Karteikarte Profil der Punkt Basisordner verbunden wird mit …
Abhilfe:
Im AD Benutzerobjekt prüfen ob die Konfiguration des Basisordners aktiviert ist und deaktivieren.
EnableLinkedConnections nicht vorhanden
Fehlermeldung im Log:
Key HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\EnableLinkedConnections nicht vorhanden!
Wenn UAC aktiviert ist kann es sein, dass das Laufwerk nicht korrekt verbunden wird. Dann sollte man EnableLinkedConnections mit dem Wert 1 in die Registry eintragen. Siehe: https://technet.microsoft.com/de-de/library/ee844140%28v=ws.10%29.aspx
Anregungen zum Erweitern des Scriptes
Hier sind ein paar Punkte aufgezählt, wie man das Script auf persönliche Wünsche erweitern kann. Diese sind aber nicht allgemein und deswegen nicht implementiert.
- Das Script kann man dazu benutzen auch weitere Laufwerke zu verbinden.
- Man kann das Script erweitern, so dass der Administrator eine E-Mail erhält, wenn ein Fehler auftritt.
- Man kann das Script erweitern, so dass die Migration der Daten vom alten Server auf den neuen Server vollzogen wird. Bedeutet aber Wartezeit bei der Anmeldung oder zumindest eine Info an den User, dass die Daten im Hintergrund migriert werden.
- Statt DFS kann man auch dediziert eine Reihe von Ablageorten auf verschiedenen Servern festlegen – ich finde DFS schicker.
Getestet auf: Server 2008 R2 und höher, sowie Windows 7 und höher
Download des vb Scripts
Logonscript
Inhalt der Loginscript.cmd
cscript //nologo %Logonserver%\NETLOGON\Logonscript\Logon.vbs
Inhalt der Logon.vbs
‚~~[author]~~
‚Daniel Schober
‚~~[/author]~~
‚
‚~~[emailAddress]~~
’script (at) ftpnet (dot)de
‚~~[/emailAddress]~~
‚
‚~~[scriptType]~~
‚vbscript
‚~~[/scriptType]~~
‚~~[subType]~~
‚SystemAdministration
‚~~[/subType]~~
‚~~[keywords]~~
‚windows, microsoft, active directory, attribute, schema, logon script, dfs
‚~~[/keywords]~~
‚
‚ Das Script verbindet das persönliche Laufwerk eines Benutzers auf einem bestimmten Laufwerksbuchstaben. Wenn noch kein
‚ persönlicher Ordner existiert, dann wird einer angelegt. Dabei wird jeden Monat ein anderer Server zur Neuanlage benutzt.
‚ Zudem findet eine Plausibelitätsprüfung des Attributes statt.
‚
‚*******************************************************************************
Option Explicit
Dim objRootDSE, objDNSDomain, objFso, objShell, objDrives, objLog
Dim objUser, objUserID, objSysInfo, objNetwork, objUsername, objHomeDir
Dim DriveLetter, HomeDirPath, FoldernameUcase, TimeStart, ScriptDuration
Dim CountHomeStores, UserHomeID, i, Logfile, WshSysEnv, WshShell
Dim MappedDrivePathRename, MappedDrivePathName, Regvalue, errString
‚ Starte den Timer
TimeStart = Timer
‚ Verbindung mit dem Active Directory
Set objRootDSE = GetObject(„LDAP://RootDSE“)
objDNSDomain = objRootDSE.Get(„DefaultNamingContext“)
‚*******************************************************************************
‚ Trage Accountinformationen zusammen
Set objNetwork = CreateObject(„WScript.Network“)
Set objSysInfo = CreateObject(„ADSystemInfo“)
Set objUser = GetObject(„LDAP://“ & objSysInfo.UserName)
objUsername = objUser.sAMAccountName
objHomeDir = objUser.homeDirectory
Set objShell = CreateObject(„Shell.Application“)
Set objFso = CreateObject(„Scripting.FileSystemObject“)
Set WshShell = WScript.CreateObject(„WScript.Shell“)
Set WshSysEnv = WshShell.Environment(„PROCESS“)
‚*******************************************************************************
‚ Das ist der Bereich, der auf die jeweilige Umgebung angepasst werden muss
‚
‚ Welcher Laufwerksbuchstabe soll für das Benutzerverzeichnis gesetzt werden?
DriveLetter = „U:“
‚ Wie lautet der Pfad zum DFS? (ohne „\“ am Ende!)
‚ Bsp: \\dfs-path\folder
‚ Bsp: \\mydomain.local\Global\User
HomeDirPath = „\\liesst.mit\Users“
‚ Wie viele verschiedene Benutzerordnerablagepunkte soll es geben?
‚ Diese Zahl muss der Anzahl der erstellten DFS Links entsprechen
‚ Zahl zwischen 1 – 12
CountHomeStores = 4
‚ Soll der persönliche Ordnername eines neuen Benutzers groß geschrieben werden (bei Neuanlage)?
‚ Hintergrund: Der Samaccountname könnte teils groß teils klein geschrieben werden. Hiermit können die Ordnernamen angepasst werden.
‚ Kosmetischer Faktor – für die Funktion des Scripts unwichtig
‚ Entweder True oder False (False schaltet die Funktion ab)
FoldernameUcase = „True“
‚ Soll der Netzwerkpfad des gemappten Benutzerlaufwerks umbenannt werden, damit der kryptische Name versteckt wird?
‚ Kosmetischer Faktor – für die Funktion des Scripts unwichtig
‚ Entweder True oder False (False schaltet die Funktion ab)
MappedDrivePathRename = „True“
MappedDrivePathName = „Persönlicher Ordner“
‚ Wohin soll das Logfile lokal geschrieben werden?
‚ Das Logfile wird jedesmal überschrieben
Logfile = WshSysEnv(„TEMP“) & „\“ & „logon-results.txt“
‚ End of customization.
‚*******************************************************************************
‚*******************************************************************************
Set objLog = objFso.CreateTextFile(Logfile, True)
objLog.WriteLine „——————————————————————“
objLog.WriteLine „Start des Scripts: “ & (cstr(Now))
objLog.WriteLine „Benutzerobjekt = “ & objSysInfo.UserName
objLog.WriteLine „SamAccountName = “ & objUser.sAMAccountName
objLog.WriteLine „Konfigurierter Laufwerksbuchstabe = “ & DriveLetter
objLog.WriteLine „Konfigurierter DFS Pfad = “ & HomeDirPath
objLog.WriteLine „Anzahl konfigurierter Benutzerordnerablagepunkte ist “ & CountHomeStores & „. Daraus ergeben sich folgende DFS-Links:“
For i = 1 To CountHomeStores
objLog.WriteLine HomeDirPath & „\“ & i
Next
‚*******************************************************************************
‚ Lese das Attribute aus dem Active Directory
‚ Ich habe mich für den Wert Pager entschieden, da dieser heute kaum noch genutzt wird
‚ wird ein alternatives Attribute genutzt, dann im Script „pager“ durch das neue Attribut ersetzen
‚ Achtung bei Custom Attributen! Rechte setzen, damit der Benutzer diesen Wert ändern darf!
UserHomeID = objUser.pager
objLog.WriteLine „Ausgelesender Wert für Attribut pager = “ & UserHomeID
‚*******************************************************************************
‚ Prüfe ob das Attribute leer ist
‚ Wenn ja, dann hole den aktuellen Monat als Zahl
‚ Ist die Zahl größer als die Anzahl der Benutzerordnerablagepunkte, dann wird die Zahl um den
‚ Wert der Benutzerordnerablagepunkte subtrahiert, bis die Zahl kleiner oder gleich ist
‚ Zudem wird der neue Wert dann ins AD geschrieben
‚ Das wird gemacht damit neue Benutzer jeden Monat auf einen anderen Server verteilt werden
If (IsEmpty(UserHomeID)) Then
UserHomeID = Month(Now)
objLog.WriteLine „Das Attribut pager für den User “ & objUsername & “ war im Active Directory nicht gepflegt.“
objLog.WriteLine „Die Nummer des aktuellen Monats = “ & Month(Now) & „.“
Do While UserHomeID+0 > CountHomeStores+0
objLog.WriteLine „Der Wert “ & UserHomeID & “ ist zu groß und wird subtrahiert mit “ & CountHomeStores
UserHomeID = UserHomeID – CountHomeStores
Loop
‚ Schreibe den neuen Wert in das Attribute des Users
objUser.Put „pager“, UserHomeID
objUser.SetInfo
objLog.WriteLine „Schreibe den neuen Wert “ & UserHomeID & “ für das Attribute pager ins AD.“
End If
‚*******************************************************************************
‚ Prüfe ob der Wert im Active Directory valide ist
If UserHomeID+0 > CountHomeStores+0 Then
MsgBox „Bitte informieren Sie Ihren Administrator. Der Wert für pager des Benutzers “ & objUsername & “ ist “ & UserHomeID & „. Die konfigurierte Anzahl der Benutzerordnerablagepunkte ist “ & CountHomeStores & „.“,VBOKOnly,“Benutzerlaufwerk “ & DriveLetter & “ konnte nicht verbunden werden!“
‚ MsgBox „Please contact your admin. The value for pager is “ & UserHomeID & “ for user “ & objUsername & “ & „. Configured distributed home shares is “ & CountHomeStores & „.“,VBOKOnly,“Drive “ & DriveLetter & “ couldn`t be mapped!“
ElseIf UserHomeID < 1 Then
MsgBox „Bitte informieren Sie Ihren Administrator. Der Wert für pager des Benutzers “ & objUsername & “ ist “ & UserHomeID & „. Dieser Wert muss größer 0 sein, jedoch maximal “ & CountHomeStores & „.“,VBOKOnly,“Benutzerlaufwerk “ & DriveLetter & „: konnte nicht verbunden werden!“
‚ MsgBox „Please contact your admin. The value for pager is “ & UserHomeID & “ for user “ & objUsername & „. The value must be at least 1, but not greater than “ & CountHomeStores & „.“,VBOKOnly,“Drive “ & DriveLetter & “ couldn`t be mapped!“
End If
‚*******************************************************************************
‚ Schreibe den Benutzernamen mit Großbuchstaben, wenn gewünscht.
If FoldernameUcase = „True“ Then
objUsername = ucase(objUsername)
objLog.WriteLine „Ordnernamen umgewandelt in Grossbuchstaben -> “ & objUsername
End If
‚*******************************************************************************
‚ Prüfe ob der persönliche Ordner vorhanden ist und erstelle ihn neu wenn nötig.
objLog.WriteLine „Prüfe ob der Pfad existiert: “ & HomeDirPath & „\“ & UserHomeID & „\“ & objUsername
If objFso.Folderexists(HomeDirPath & „\“ & UserHomeID & „\“ & objUsername) = false then
objFso.CreateFolder(HomeDirPath & „\“ & UserHomeID & „\“ & objUsername)
objLog.WriteLine „Ordner existiert nicht. Erstelle den Ordner “ & HomeDirPath & „\“ & UserHomeID & „\“ & objUsername
Else objLog.WriteLine „Pfad existiert. Ordner muss nicht erstellt werden.“
End if
‚*******************************************************************************
‚ Trenne das Benutzerlaufwerk (wenn verbunden) und verbinde es neu.
If(objFso.DriveExists(DriveLetter)) Then
objNetwork.RemoveNetworkDrive DriveLetter, True, True
objLog.WriteLine „Laufwerk “ & DriveLetter & “ war bereits verbunden und wurde getrennt.“
End If
wscript.sleep 100
objLog.WriteLine „Versuche Laufwerk “ & DriveLetter & “ mit “ & HomeDirPath & „\“ & UserHomeID & „\“ & objUsername & “ zu verbinden.“
On Error resume Next
objNetwork.MapNetworkDrive DriveLetter, HomeDirPath & „\“ & UserHomeID & „\“ & objUsername
If Err <> 0 then
Select case Err.Number
case -2147024891
objLog.WriteLine err.Number & “ Hat der Benutzer “ & objUsername & “ wirklich volle Rechte auf den Ordner “ & HomeDirPath & „\“ & UserHomeID & „\“ & objUsername & “ ?“
case else
objLog.WriteLine „Fehler “ & err.Number & “ –> “ & Err.Description
End Select
End If
‚*******************************************************************************
‚ Benenne den Netzwerkpfad des gemappten Benutzerlaufwerks um, wenn gewünscht.
If MappedDrivePathRename = „True“ Then
objShell.NameSpace(DriveLetter).Self.Name = MappedDrivePathName
Else
objShell.NameSpace(DriveLetter).Self.Name = HomeDirPath & „\“ & UserHomeID
End If
objLog.WriteLine „Folgende Netzlaufwerke sind an diesem Client verbunden:“
Set objDrives = objNetwork.EnumNetworkDrives
For i = 0 to objDrives.Count-1 Step 2
objLog.WriteLine objDrives.Item(i) & vbTab & objDrives.Item (i + 1)
Next
‚*******************************************************************************
‚ Fange Standardfehler ab: Basisordner hat einen Wert im AD
If Not (IsEmpty(objHomeDir)) Then
objLog.WriteLine „— Achtung! —“
objLog.WriteLine „Wenn das Laufwerk nicht mehr verbunden ist liegt das ggf. daran, das bei diesem Benutzer im AD“
objLog.WriteLine „auf der Karteikarte Profil der Punkt Basisordner verbunden wird mit “ & objHomeDir
End If
‚*******************************************************************************
‚ Fange Standardfehler ab (Netzlaufwerk ist verschwunden, wenn UAC aktiviert ist)
‚ https://technet.microsoft.com/de-de/library/ee844140%28v=ws.10%29.aspx
objLog.WriteLine „“
If RegExists(„HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\EnableLinkedConnections“) Then
Regvalue = WshShell.RegRead(„HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\EnableLinkedConnections“)
If Regvalue = 1 Then
objLog.WriteLine „Key HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\EnableLinkedConnections vorhanden.“
Else
objLog.WriteLine „Key EnableLinkedConnections vorhanden – Wert ist aber nicht = 1 !“
objLog.WriteLine „HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\“
objLog.WriteLine „RegDWORD EnableLinkedConnections=1“
objLog.WriteLine „siehe https://technet.microsoft.com/de-de/library/ee844140%28v=ws.10%29.aspx“
End If
Else
objLog.WriteLine „Key HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\EnableLinkedConnections nicht vorhanden!“
objLog.WriteLine „Wenn das Laufwerk “ & DriveLetter & “ nicht mehr verfügbar ist und UAC aktiviert ist bitte folgenden Regkey setzen und“
objLog.WriteLine „Computer neu starten: HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\“
objLog.WriteLine „RegDWORD EnableLinkedConnections=1“
objLog.WriteLine „siehe https://technet.microsoft.com/de-de/library/ee844140%28v=ws.10%29.aspx“
End If
objLog.WriteLine „“
Function RegExists(regPath)
On Error Resume Next
RegExists = False
If (Right(regPath, 1) <> „\“) Then
Regvalue = WshShell.RegRead(regPath)
If (Err.Number=0) Then RegExists = True
Else
Regvalue = WshShell.RegRead(„HKLM\Nothing\“)
errString = Replace(Err.Description, „““HKLM\Nothing\““.“, „“ )
Regvalue = WshShell.RegRead(regPath)
If (Err.Number=0) Then
RegExists = True
Else
If Replace(Err.Description, „“““ & regPath & „““.“, „“ ) <> errString Then
RegExists = True
End If
End If
End If
Set WshShell = Nothing
On Error Goto 0
End Function
‚*******************************************************************************
‚ Berechne die Dauer, die das Script gebraucht hat
ScriptDuration = Int((Timer – TimeStart) * 1000)
objLog.WriteLine „Ende des Scripts. Die Scriptverarbeitung hat “ & ScriptDuration & “ Millisekunden gedauert.“
objLog.WriteLine „——————————————————————“
‚*******************************************************************************
‚ Schliesse das Log und beende das Script.
objLog.Close
set objNetwork=nothing
WScript.Quit