nother
Goto Top

Ordnerberechtigung per Batch - Powershell - Script auf Home- und Profileshare

Guten Abend liebe Mitleidenden,

ich suche nach einem Script, welches mir Anhand einer AD-Abfrage oder Liste die Berechtigungen einer Filestruktur wieder gerade biegt.
Gegeben ist ein Fileserver, Windows 2003 mit einer Share für Profile und Usershare. (Ich weiß, das trennt man... unwissende Kollegen).

D:\pc_user
Darunter befinden sich die Usershare mit Achtstelliger Personalnummer sowie Personalnummer.V2 für das Profil.
like: 12345678 und 12345678.V2
800 Nutzer in etwa und dementsprechend die Ordner...
Besagte Kollegen haben nun die Berechtigungen von oben "Durchgebügelt" (mit Jeder:Vollzugriff) und nun ist natürlich jeder Ordner für Jeden ensehbar.
Das geht ja mal gar nicht...
Also wie bekomme ich nun die Kuh vom Eis... (habe leider gerade keinen Praktikanten) face-wink
Ich dachte an einem Script, welches eine AD-Abfrage macht (Powershell) und die Ordner jeweils rekursiv mit dem Entsprechenden User + Administratoren inkl. Vererbung berechtigt.
Hatte jemand schon so ein Problem und das irgendwie gelöst?

have fun

nother

Content-Key: 273350

Url: https://administrator.de/contentid/273350

Printed on: April 18, 2024 at 14:04 o'clock

Member: Clijsters
Clijsters Jun 01, 2015 at 08:51:40 (UTC)
Goto Top
Hallo nother,

Auf die Schnelle kommt mir soetwas in den Sinn:
cd D:\pc_user
Get-ChildItem "*.V2" | Foreach-Object {  
	Start-Process cmd -ArgumentList "/K", "cacls", ("""" + $_.FullName + """"), "/t", "/g", ($Env:USERDOMAIN + "\" + ($_.Name.Split(".")) + ":f");  
	Start-Process cmd -ArgumentList "/K", "cacls", ("""" + ($_.FullName.Replace(".V2", "")) + """"), "/t", "/g", ($Env:USERDOMAIN + "\" + ($_.Name.Split(".")) + ":f");  
}
Es ersetzt mittels cacls die ACLs aller Ordner und berechtigt den dazugehörigen User mit Vollzugriff.
Es geht sicher deutlich schöner, aber um mal den Anfang zu machen...

Beste Grüße
Dominique
Member: nother
nother Jun 01, 2015 at 09:03:37 (UTC)
Goto Top
Vielen Dank,

werde ich gleich mal in einer Testumgebung ausführlich checken!
Aber wie kommt dort noch der Dom-Admin bzw. Administratoren mit rein?

Lieben Gruß
Nother
Member: Clijsters
Clijsters Jun 01, 2015 at 09:22:00 (UTC)
Goto Top
Du könntest zum Beispiel noch eine weitere Start-Process Anweisung reinsetzen:
Start-Process cmd -ArgumentList "/K", "cacls", ("""" + ($_.FullName.Replace(".V2", "")) + """"), "/t", "/g", ($Env:USERDOMAIN + "\" + """Domain Admins"":f";  

Im Zuge dessen am besten noch nach Besitzer schauen. Schau dir dazu einfach mal die Cacls-Doku an.

Beste Grüße
Dominique
Member: nother
nother Jun 01, 2015 at 09:36:33 (UTC)
Goto Top
Besitzer ist nicht das Problem, da wir für die Profile eine GPO aktiviert haben, nicht den Owner zu überprüfen...
Mir fällt gerade ein, das die Profilordner auch nicht von dem Problem betroffen sind, da diese nicht mit "durchgebügelt" werden konnten...
Also nur die Verzeichnisse ohne .V2 (Homeshare) der einzelnen Nutzer.
Leider habe ich heute noch zwei Termine und kann das erst heute Nachmittag checken...

Vielen lieben Dankschon mal!
Member: nother
nother Jun 01, 2015 updated at 13:17:16 (UTC)
Goto Top
Also, kurzer Test mit Fehlermeldung:
Die Benennung ".\SetUser_Berechtigung.ps1" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern enthalten), und wiederholen Sie den Vorgang.  
Bei Zeile:1 Zeichen:27
+ .\SetUser_Berechtigung.ps1 <<<<
    + CategoryInfo          : ObjectNotFound: (.\SetUser_Berechtigung.ps1:String) , CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
Habe $Env:USERDOMAIN mit dem Namen unserer Domain geändert...
geht das denn jetzt auf .V2 oder auf nicht .V2?

Gruß
nother
Member: Clijsters
Clijsters Jun 01, 2015 updated at 13:46:53 (UTC)
Goto Top
Das geht auf beide. Nacheinander.
Deine Meldung sagt, dass das Script nicht gefunden wurde face-wink
Du kannst den Code auch einfach in die Console pasten. Aber bitte nicht "mal eben" im Produktivsystem...

Edit:
Mein letzer Post geht nur auf die ohne V2. Da sonst einfach das Replace-Statement rausnehmen.
Member: nother
nother Jun 01, 2015 at 18:02:04 (UTC)
Goto Top
N'abend und ersteinmal vielen Dank für den Hoffnungsschimmer...
Hatte nun ein wenig Zeit zum testen.
Das Script funktioniert, aber nur wenn komischerweise beide Verzeichnisse vorhanden sind (also 12345678 und 12345678.V2)?!
Jeder zweite User hat kein Roaming Profile und somit kein .V2 Verzeichnis und da passiert gar nichts.
Außerdem muss für jedes Verzeichnis das cmd Fenster mit J bestätigt werden...
Wir migrieren in kürze auf einen Server auf 2008R2...mit Robocopy Scripten... kann das eventuell helfen bzw. geht dann vielleicht auch etwas leichter?
Habe gelesen, das dort icacls zum Zuge kommt...
Eine Idee warum das Script nicht auf jeden Ordner greift?

cu

Nother
Member: Clijsters
Clijsters Jun 01, 2015 at 20:04:03 (UTC)
Goto Top
Ja, ich suche im äußeren block nur nach Verzeichnissen mit v2, um zu vermeiden, dass die Dinge doppelt durchgeführt werden und auf andere Ordner, die eventuell gar nicht mit einbezogen werden sollen.
Nächster versuch wäre, zu prüfen ob sich der ordnername in einen integer wandeln lässt und daran zu gehen.
Andernfalls einfach alle Ordner abgrasen und für jeden prüfen, ob ein User mit dem Namen existiert.
Member: Clijsters
Clijsters Jun 01, 2015 at 20:05:04 (UTC)
Goto Top
Inwiefern kannst du das Script denn anpassen?
Oder brauchst du da noch Unterstützung?

LG
Member: nother
nother Jun 02, 2015 at 07:14:57 (UTC)
Goto Top
Hilfe!
Ich glaube das übersteigt meine Fähigkeiten...
Also, da die Profilverzeichnisse Gott sei Dank mit Userberechtigungen versehen waren / sind, können die vollständig außen vor bleiben...
Ich hatte mich auch noch ein wenig auf die Suche gemacht und fand im Netz noch folgendes: http://www.anotherlan.com/ultimate-robocopy-icacls-powershell-script-to ...
Diese Scripte arbeiten aber nicht so dynamisch wie das von dir vorgeschlagene... und fügen nur einen vordefinierten User hinzu.
Da wir ja den Fileserver migrieren wollen, dachte ich unter W2K8R2 und icacls wäre die günstigere Option...und vor allem ungefährlicher...
Hilfe...
Wie dem auch sei, kann man nicht,
 Get-ChildItem "*.V2"  
als Filter nutzen, das das Script hier nichts tut?
Hilfe...
Oder doch lieber auf dem neuen Fileserver?!

Gruß

Nother
Member: Clijsters
Clijsters Jun 02, 2015 at 09:01:04 (UTC)
Goto Top
Ja klar, oder
if( -NOT ($_.Name.Split(".")[1] == "V2")){tuh was...}  
Sollte gehen.

Das von dir verlinkte Script macht auch einen guten Eindruck. Du könntest natürlich im Vorhinein eine Liste anfertigen, aus der du die V2-Ordner händisch entfernst und dann soetwas verwenden. Das mit dem Usernamen lässt sich auch anpassen.
Ansonsten nimm einfach die If-Abfrage.


Beste Grüße
Dominique
Member: nother
nother Jun 02, 2015 at 16:46:37 (UTC)
Goto Top
Hallo Dominique,

vielen Dank für deine Unterstützung! Habe nun die Anweisung bekommen, das unter W2K8R2 auf dem neuen Fileserver umzusetzen.
Da muss/sollte es mit icacls Aufgrund der Vererbungsproblematik durchgeführt werden und dient natürlich zum Fallback, falls was schief geht.
Dann werde ich mich mal in die Syntax einlesen und ein wenig testen.

cu

Nother
Member: Clijsters
Clijsters Jun 02, 2015 at 18:14:32 (UTC)
Goto Top
Hallo Nother,
Icacls ist nicht besonders komplex. Andernfalls lässt sich das ganze auch "nativ" in powershell umsetzen. Set-acl ist das Zauberwort.
Die cacls Aktion war ja nur ein schneller vorschlag.
Wenn du Interesse an einem ps script dieser Art hast, kann ich es morgen auch mal angehen. Ist ja kein seltenes vorhaben.

Ansonsten wäre es super, wenn du deine Lösung dann auch mit uns teilst. Das steigert den Mehrwert natürlich ungemein face-smile

Beste Grüße
Dominique
Member: nother
nother Jun 02, 2015 updated at 19:22:46 (UTC)
Goto Top
Hola!
Natürlich werde ich auch eine endgültige Lösung hinterlassen! Habe ich bisher immer getan und gehört sich meiner Meinung nach...!
Set-Acl hört sich auch gut an...Aber ich weiß nicht (nach kurzer recherche) ob das mit der Vererbung so hinhaut...

Also, einen Schritt weiter ich mit auch schon:

Get-ChildItem "*.*" | Foreach-Object {  
	Start-Process cmd -ArgumentList "/K", "icacls", ("""" + ($_.FullName.Replace(".V2", "")) + """"), "/inheritance:e", "/grant:r", ($Env:BXXXDOM01 + "\" + "Domänen-Admins" + ":(OI)(CI)F");  
	Start-Process cmd -ArgumentList "/K", "icacls", ("""" + ($_.FullName.Replace(".V2", "")) + """"), "/inheritance:e", "/grant:r", ($Env:BXXXDOM01 + "\" + ($_.Name.Split(".")) + ":(OI)(CI)F");  
} 
funktioniert in einem Ordner, wo es auch einen .V2 gibt. Aber nicht auf dem .V2 ... muss aber auch nicht...
Irgendwie schnall ich das nicht...
Ein wenig stört mich auch die Dos-Box... wenn ich das nun auf das Echte Verzeichnis los lasse, müsste ich 487 Fenster schliessen... face-wink

Schönen Abend
Nother
EDIT: nach dem ich mal Testweise
Get-ChildItem "*.*" | Foreach-Object  
ersetzt habe mit:
Get-ChildItem  | Foreach-Object
klappte es auf die richtigen Ordner auch super.
Nur starten ja pro Zeile eine Dosbox... uiuiui
Außerdem übernimmt das Script nicht den Parameter /grant:r
Mein Verständnis nach, müsste er doch an dieser Stelle die Berechtigungen dieser Ordner Ersetzen.
Stattdessen fügt das Script den bestehenden Berechtigungen die im Script angegeben hinzu...
Ist da noch ein Fehler?
Member: Clijsters
Clijsters Jun 02, 2015 at 19:33:26 (UTC)
Goto Top
Hi,
Ein wenig stört mich auch die Dos-Box... wenn ich das nun auf das Echte Verzeichnis los lasse, müsste ich 487 Fenster schliessen...
Dann muss der /K Parameter aus dem cmd-Aufruf raus. Der war Absicht. War ja erstmal ein schneller Test.

Also, ich würde wohl eher dazu tendieren...
  • Ein Batch-File mit For Schleife für icacls oder
  • Ein PS-Script mit Set-Acl
  • VBS?
Das Powershell Script wäre wohl am sinnvollsten. Muss auch nicht unbedingt Set-Acl sein, kann auch was höheres sein.
Von den Schnipseln hat man aber länger etwas. Angepasst können die sicher in einigen Situationen hilfreich sein.

Ich schaue morgen mal...

Dito
Member: nother
nother Jun 03, 2015 at 19:24:33 (UTC)
Goto Top
N'abend!

Also für uns hat sich aktuell folgender Workaround als praktikabel erwiesen:
Da wir ja den Fileserver migrieren, werden wir per robocopy die Userverzeichnisse mit dem Parameter /Copy:DAT auf den neuen Server kopieren.
Durch die Vererbten Rechte auf der Share HOMES$ sind alle Berechtigungen schon so, wie es sein soll.
Fehlt nur noch der Berechtigte User. Den kann ich dank des kleinen Script mit folgendem Code
Get-ChildItem  | Foreach-Object {
	Start-Process cmd -ArgumentList "/K", "icacls", ("""" + ($_.FullName.Replace(".V2", "")) + """"), "/inheritance:e", "/grant:r", ($Env:BXXXDOM01 + "\" + ($_.Name.Split(".")) + ":(OI)(CI)F");  
}
hinzufügen. Klappt schon ganz super! Bis auf die Dos Boxen... das mit dem /K Parameter herausnehmen, geht irgendwie nicht...
BTW: kann man das Ergebnis nicht auch irgendwie per Log wegschreiben?
Da ich ja gerne auch ein wenig lerne, könnte mir das jemand etwas erklären?
Also Get-Childitem schnappt sich alle Ordnernamen, Foreach-Objekt ist mir auch klar: mach das für jedes Objekt, welches du vor der Pipe mit get-childitem bekommen hast...
Start-Prozess ist auch klar, in diesem Fall cmd.
Argumentlist definiere ich im Kopf als Programmaufruf mit Parameterliste. Aber das:
("""" + ($_.FullName.Replace(".V2", "")) + """")  
kann glaube ich in unserem Fall weg, da auch keine .V2 Ordner existieren...!?
"/inheritance:e", "/grant:r"  
ist mir klar, gehört zu icacls...
 + ($_.Name.Split(".")  
finde ich toll das es den Ordnernamen ausspuckt, verstehen tu ich das aber nicht wirklich...
Der Rest von icacls ist mir auch klar...
Mag jemand ein wenig Licht ins Dunkel bringen?

have fun

Nother
Member: Clijsters
Clijsters Jun 03, 2015 at 20:52:22 (UTC)
Goto Top
Ja klar!
Die replace Aktion stammt daher, dass ich davon ausging, du hast Ordner mit und ohne v2. Deswegen suchen wir nur nach denen mit v2 im Namen, um doppeltes anwenden zu vermeiden nehmen in der ersten Ausführung (jetzt aber die einzige, da du die andere nicht brauchsr) aber das v2 mit replace raus, um aber aich die anderen uu treffen. Den ordnernamen missbrauchen wir im splitting als usernamen. An sich auch nir ein abschneiden des v2 teils. Es teilt den string 12345.v2 in zwei strings. Einmal vor dem punkt, also 12345 und einmal nach dem Punkt. Also v2.
Dahinter der Index um das erste Element, also 12345 zu verwenden.
Wenn du den /k Parameter wegnimmst schließt sich das dos Fenster nach Ausführung des befehls.

Nochmal zur Notiz:
Foreach fuhoden block nicht für jeden OrdnerNamen aus, sonder. Für das repräsentierende Objekt. $_.Fullname stellt den Pfad des Objekts dar. Das Objekt hat aber auch weitere Eigenschaften.

Hoffe, das hat etwas Licht ins dunkle gebracht. Entschuldige die fehlende Formatierung und eventuelle Tippfehler. Bin mim Handy drin.

Beste Grüße
Dominique
Member: nother
nother Jun 04, 2015 at 09:32:23 (UTC)
Goto Top
Na Mahlzeit!
bin ein wenig weiter, aber das mit dem "/K" Parameter klappt irgendwie nicht...
Aktueller Code:
Get-ChildItem | Foreach-Object {
	Start-Process cmd -ArgumentList "/K", "icacls.exe", ("""" + ($_.FullName) + """"), "/inheritance:e", "/grant", (($Env:BXXXDOM01 + "\" + $_.Name) + ":(OI)(CI)F");  
}
funktioniert, allerdings nur mit Dos-Boxen.
Wenn ich den Parameter weglasse, öffnen sich nur Dos-Boxen und nichts passiert...
Was mache ich Falsch?
Kannst du dabei noch mal helfen...

Gruß
Nother
PS: Vielen Dank für die Mühe mit dem Handy... hat bestimmt ne Weile gebraucht... face-wink
Member: Clijsters
Clijsters Jun 05, 2015 at 18:45:23 (UTC)
Goto Top
Hi,
Ich bin leider noch nicht dszu gekommen.
Schätze mal, morgen schau ich drüber.

Lg
Member: Clijsters
Clijsters Jun 14, 2015 at 17:18:18 (UTC)
Goto Top
Hi Nother,

Entschuldige die Verspätung. War doch mehr zu tun, als erwartet.

Bist du mittlerweile weiter gekommen oder ist das noch der aktuelle Stand?

Beste Grüße
Dominique