lockjaw
Goto Top

Ordner und Dateien nicht ändern und löschen. Abspeichern und Lesen von Daten erlauben

Hallo,


ich bin neu hier und hoffe, dass ihr mir bei meinem Anliegen helfen könnt face-smile

Ich habe vor, die Berechtigungen für Ordner und Unterordner per PowerShell Skript zu vergeben. Dabei sollen alle (bis auf die Admins) nur Daten in die (Unter)Ordnern ablegen können und diese öffnen. In diesem Ordner dürfen die Dateien (Inhalt und Name) nicht geändert oder gelöscht werden. Das selbe gilt auch für die Ordner.


Da ich noch in der Schreib bzw. Test-Phase bin, reduziere ich das ganze natürlich auf ein Test-Ordner, worauf ein Test-User folgende Berechtigungen bekommen soll:


########################################################################################################################
##########################################################################################################################
#
# Author:    Name
#
# Date:        23.04.2019
#
# Version:    1.00    
#
# Comment:    .\FolderScript.ps1     Searches for folders in the specifies filesystem and modifies the NTFS accessrights.
#                
#
##########################################################################################################################

##########################################################################################################################
#
# Constants and variables
#
##########################################################################################################################



$StartPath = "\\Pfad des Ordners"  

##########################################################################################################################
#
# Functions
#
##########################################################################################################################

function Process-ACL ($Folder)
{
        #read current acl
        $acl = Get-Acl $Folder
        #disable inheritance
        $acl.SetAccessRuleProtection($True, $False)
        #set-owner -needed for altering the access rights
        $acl.SetOwner([System.Security.Principal.NTAccount] "Lokaler Admin")  
        #build the new permissions
        #default permissions
    
        $rule = New-Object System.Security.AccessControl.FileSystemAccessRule("Administrators","FullControl", "ContainerInherit, ObjectInherit", "None", "Allow")  
        $acl.AddAccessRule($rule)
            Set-ACL Folder $acl
        $rule = New-Object System.Security.AccessControl.FileSystemAccessRule("System","FullControl", "ContainerInherit, ObjectInherit", "None", "Allow")  
        $acl.AddAccessRule($rule)
           Set-ACL $Folder $acl
        $rule = New-Object System.Security.AccessControl.FileSystemAccessRule("Domäne\Domain Admins","FullControl", "ContainerInherit, ObjectInherit", "None", "Allow")  
        $acl.AddAccessRule($rule)    
        Set-ACL $Folder $acl
        $rule = New-Object System.Security.AccessControl.FileSystemAccessRule("Domäne\user-test","ReadAndExecute", "ContainerInherit, ObjectInherit", "None", "Allow")  
        $acl.AddAccessRule($rule)    
        Set-ACL $Folder $acl
        

}
    
    
    
##########################################################################################################################
#
# Main code
#
##########################################################################################################################

$Folders = Get-ChildItem $StartPath  -recurse | ? {($_.psiscontainer)}


    ##################################################################################################
    # main loop 
        foreach ($Folder in $Folders.Fullname) {
    
        Process-ACL ($Folder)            
    }
    # End main loop
    ##################################################################################################
    ##################################################################################################[



Das setzen der Berechtigung zum änder/löschen funktioniert soweit, auch wenn ich im PowerShell relativ viele rote Meldungen bekomme.

Im File-System wurden alle User/Gruppen hinzugefügt mit den entsprechenden Berechtigungen.

Das Problem ist jetzt, dass ich auch keine Berechtigung habe, Dateien in den Haupt- und Unterordner zu abzuspeichern.


Gibt es hier eine Möglichkeit dies umzusetzen, ohne dem User Schreibrechte zu geben? Denn mit Schreibrechten könnte der User die Inhalte oder Namen der Order/Dateien ändern.

Content-Key: 443574

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

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

Member: Pjordorf
Pjordorf Apr 23, 2019 at 18:11:45 (UTC)
Goto Top
Hallo,

Zitat von @Lockjaw:
Ich habe vor, die Berechtigungen für Ordner und Unterordner per PowerShell Skript zu vergeben. Dabei sollen alle (bis auf die Admins) nur Daten in die (Unter)Ordnern ablegen können und diese öffnen. In diesem Ordner dürfen die Dateien (Inhalt und Name) nicht geändert oder gelöscht werden. Das selbe gilt auch für die Ordner.
OK

Das setzen der Berechtigung zum änder/löschen funktioniert soweit, auch wenn ich im PowerShell relativ viele rote Meldungen bekomme.
OK

Im File-System wurden alle User/Gruppen hinzugefügt mit den entsprechenden Berechtigungen.
OK

Das Problem ist jetzt, dass ich auch keine Berechtigung habe, Dateien in den Haupt- und Unterordner zu abzuspeichern.
Hast du nicht oben anderes gesagt?

Gibt es hier eine Möglichkeit dies umzusetzen, ohne dem User Schreibrechte zu geben? Denn mit Schreibrechten könnte der User die Inhalte oder Namen der Order/Dateien ändern.
OK.
Jetzt überlege mal was bei einen Ändern einer Datei und beim abschließenden Speichern dieser Datei ablaufen will und tut. Ohne das du also Schreibrechte hast, wird es auch mit den speichern deiner Änderung nichts. Nimm einen Testuser unbd spiele erstmal auf Dateiebene mit den Rechten deines unbekannten Wndows rum, danach kannst du es in Powershell gießen.

Gruß,
Peter
Member: emeriks
emeriks Apr 24, 2019 updated at 06:35:03 (UTC)
Goto Top
Hi,
Zitat von @Lockjaw:
Ich habe vor, die Berechtigungen für Ordner und Unterordner per PowerShell Skript zu vergeben. Dabei sollen alle (bis auf die Admins) nur Daten in die (Unter)Ordnern ablegen können und diese öffnen. In diesem Ordner dürfen die Dateien (Inhalt und Name) nicht geändert oder gelöscht werden. Das selbe gilt auch für die Ordner.
Dafür sind die "Ersteller-Besitzer" da.

Admins --> Vollzugriff
Ersteller-Besitzer --> Lesen

nichts weiter.

Damit sollte jeder in diesem Ordner Dateien ablegen können. Anschließend hat der Benutzer für diese Datei nur noch Lese-Rechte.
Bedenke aber, dass jeder Ersteller einer Datei auch deren Besitzer ist und deshalb auch deren ACL jederzeit bearbeiten kann, sprich z.B. sich selbst Rechte dafür erteilen kann. Sowas müsste man mit einem nachgeorderten Prozess kompensieren, indem man dabei den Besitzer aller Dateien ändert.

E.

Edit:
Bzw. könnte man in der Freigabe den "Vollzugriff" auf "Schreiben" reduzieren. Dann kann der Besitzer auch sein Recht zum Bearbeiten der ACL nicht in Anspruch nehmen, wenn er über diese Freigabe zugreift.
Member: erikro
erikro Apr 24, 2019 at 06:29:08 (UTC)
Goto Top
Moin,

ich würde folgenden Lösungsansatz verfolgen:

1. Die User bekommen Schreib-/Leserechte auf den Ordner. Damit können sie Dateien ablegen.
2. Überwachung des Ordners aktivieren, so dass mitgeloggt wird, wenn eine Datei angelegt wird.
3. In der Aufgabenplanung eine Aufgabe erstellen, die auf diesen Logeintrag triggert und die dann per Skript die Rechte der neuen Datei auf "Nur lesen" für alle und den Besitzer auf z. B. "Administrator" ändert.

Anders sehe ich keine Möglichkeit, dass so zu realisieren, dass die User auf keinen Fall mehr die Datei ändern/löschen können. Ansonsten gibt es für das revisionssichere Speichern Spezialsoftware, die auch von den entsprechenden Behörden, die das verlangen, abgenommen ist.

hth

Erik
Member: mayho33
mayho33 Apr 25, 2019, updated at Apr 26, 2019 at 11:20:54 (UTC)
Goto Top
Ziemlich umfangreiches Script. Die einfachere Variante wäre einen Dummy-Ordner anzulegen, darauf manuell die Rechte zu vergeben und mit Get-ACL Set-ACL den Zielordner zu konfigurieren.

Wäre mit einem Einzeiler möglich... Ginge sogar recursiv
Member: Lockjaw
Lockjaw Apr 26, 2019 updated at 10:08:01 (UTC)
Goto Top
Vielen Dank für eure Antworten.
Ich denke mal, dass ich vorerst den Usern auch Schreibrechte gebe, bis ich eine bessere Lösung gefunden habe. Doch stellt sich mir die Frage, wie ich bestimmten Unterordner andere Berechtigungen vergebe, da es Ordner gibt, die eine weitere Ebene haben, die nicht geändert werden darf.
Das Filesystem ist bei uns wie folgt gebaut:

1) HauptOrdner --> Ordner1 -->Ordner --> Ordner
2) HauptOrdder --> Ordner2 --> Ordner -->Daten

Die Namensstrucktur in den Ordnern1,2 etc. ist identisch, weshalb ich nur "Ordner" geschrieben habe.
HauptOrdner --> OrdnerX darf nicht geändert werden
Erst in den Unterordnern von OrdnerX darf, falls sich keine weitere Ebene befindet wie bei 1), Daten abgelegt werden.

Ich dachte da an eine if-Abfrage wie

if {($Folder -eq $Folder.EndsWith("_00"))  
Load-ACL ($Folder)}
else {Process-ACL ($Folder)}


Aber beim Ausführen wird nur der Else-Teil ausgeführt, da die if-Abfrage irgendwie nicht abgefragt wird.
Woran kann das liegen?
Member: erikro
erikro Apr 26, 2019 at 10:10:26 (UTC)
Goto Top
Moin,

mach mal die öffnende geschweifte Klammer hinter die Bedingung. Dann geht's vielleicht. face-wink

hth

Erik
Member: Pjordorf
Pjordorf Apr 26, 2019 at 10:14:56 (UTC)
Goto Top
Hallo,

Zitat von @Lockjaw:
Doch stellt sich mir die Frage, wie ich bestimmten Unterordner andere Berechtigungen vergebe, da es Ordner gibt, die eine weitere Ebene haben, die nicht geändert werden darf.
Vererbung der Ordner und somit deren Rechte
https://social.technet.microsoft.com/Forums/ie/de-DE/52494e91-76bc-435e- ...
https://social.technet.microsoft.com/Forums/windowsserver/de-DE/b43558a1 ...
https://www.msxfaq.de/windows/vererbung.htm

if {($Folder -eq $Folder.EndsWith("_00"))  
Was liefert dir dies?

Gruß,
Peter
Member: Lockjaw
Lockjaw Apr 26, 2019 at 10:34:11 (UTC)
Goto Top
Danke für die Links.
Ich habe die Vererbung durchgehend deaktiviert, damit ich bei den bestimmten Ordnern die ACLs anders setzen kann.

if {($Folder -eq $Folder.EndsWith("_00"))  

liefert mir gar nichts zurück. Auch kein Fehler. Ein Tippfehler ist es auch nicht, habe ich bereits geprüft.
Member: Lockjaw
Lockjaw Apr 26, 2019 updated at 10:38:45 (UTC)
Goto Top
@eriko

Habe es geändert gehabt, nur hier nicht korrigiert.
Weiterhin gibt es keine Ausgabe für den If-Fall face-sad

Zum Testen habe ich jetzt vorerst Ausgabe-Strings statt die Funktion geschrieben.
Jedes mal bekomme ich den Text von dem Else-Fall :/
Member: Pjordorf
Pjordorf Apr 26, 2019 at 10:39:10 (UTC)
Goto Top
Hallo,

Zitat von @Lockjaw:
liefert mir gar nichts zurück.
Und? Prüfst du ob Nichts auch wirklich zurück gegeben wird? Was soll dein IF denn prüfen bzw. auswerten? Nichts?

Gruß,
Peter
Member: erikro
erikro Apr 26, 2019 at 10:44:52 (UTC)
Goto Top
Moin,

wo kommt denn $folder her? Aus einem get-childitem? Dann hat die Variable keine Methode endswith, da es ein Sytem.IO.fileinfo ist.

hth

Erik
Member: Lockjaw
Lockjaw Apr 26, 2019 at 11:12:02 (UTC)
Goto Top
Hallo,

Nein. Es gibt zwar eine Variable Namens $Folders, die aus einem get-childitem kommt, nicht aber $Folder.
Könnte es sein, dass $Folder die Daten von $Folders bekommt bei der foreach-Schleife?
Member: Lockjaw
Lockjaw Apr 26, 2019 at 11:23:48 (UTC)
Goto Top
Bei jedem Durchlauf der Schleife wird der aktuelle Name eines Ordners ausgegeben.
Mit der If-Bedingung möchte ich prüfen, ob die Schleife an einem bestimmten Ordner angekommen ist, der die Endung "_00" hat. Wenn dem so ist, soll er ein anderen String ausgeben.
Member: Pjordorf
Pjordorf Apr 26, 2019 at 11:32:36 (UTC)
Goto Top
Hallo,

Zitat von @Lockjaw:
Mit der If-Bedingung möchte ich prüfen, ob die Schleife an einem bestimmten Ordner angekommen ist, der die Endung "_00" hat. Wenn dem so ist, soll er ein anderen String ausgeben.
Ordner haben in der Regel keine Endung, eine Datei aber schon. Sicher das dein $Folder.EndsWith richtig ist? Gibt es denn diesen Ordner mit _00 am Ordnernamenende oder erwartet er dort auch eine Punkt vorher?
https://www.pythonforbeginners.com/code-snippets-source-code/python-os-l ...

Gruß,
Peter
Member: erikro
erikro Apr 26, 2019 at 11:47:17 (UTC)
Goto Top
Moin,

Zitat von @Lockjaw:

Hallo,

Nein. Es gibt zwar eine Variable Namens $Folders, die aus einem get-childitem kommt, nicht aber $Folder.
Könnte es sein, dass $Folder die Daten von $Folders bekommt bei der foreach-Schleife?

Woher soll ich das wissen. Ist Dein Skript. face-wink Aber wenn es so ist, dann hast Du eben ein System.IO.Fileinfo-Objekt in der Variablen. Und darauf kannst du direkt die Methode endswith nicht anwenden. Aber so sollte es gehen:

if ($folder.fullname.endswith("_00")) { ... }  

Die Eigenschaft fullname ist vom Typ String und darauf lässt sich die Methode wieder anwenden.

hth

Erik
Member: Lockjaw
Lockjaw Apr 26, 2019 at 11:48:47 (UTC)
Goto Top
Hallo,

Der Pfad des Ordners lautet:
D:\Hauptordner\Ordner\Ordner1\abc_00


Da ich mit der foreach Schleife auch alle Unterordner aufrufe, muss auch der angegeben Pfad abgefragt werden.
Daher meine Idee mit der If-Abfrage.
Member: erikro
erikro Apr 26, 2019 at 11:54:49 (UTC)
Goto Top
Zitat von @Pjordorf:

Hallo,

Zitat von @Lockjaw:
Mit der If-Bedingung möchte ich prüfen, ob die Schleife an einem bestimmten Ordner angekommen ist, der die Endung "_00" hat. Wenn dem so ist, soll er ein anderen String ausgeben.
Ordner haben in der Regel keine Endung, eine Datei aber schon. Sicher das dein $Folder.EndsWith richtig ist? Gibt es denn diesen Ordner mit _00 am Ordnernamenende oder erwartet er dort auch eine Punkt vorher?
https://www.pythonforbeginners.com/code-snippets-source-code/python-os-l ...

Nee, die Methode endswith liefert true, wenn ein String mit der angegebenen Zeichenkette endet. Das hat nichts mit Dateiendungen zu tun, auch wenn man das gerne dafür nimmt. Das Problem ist mit ziemlicher Sicherheit, dass die Variable $folder kein String-Objekt ist, sondern ein System.IO.File-Objekt. Darauf lässt sich die Methode nicht anwenden. Deshalb ist das dann immer false und das Skript macht weiter bei else.
Member: mayho33
mayho33 Apr 26, 2019 updated at 12:00:48 (UTC)
Goto Top
Zitat von @Lockjaw:
Ich habe vor, die Berechtigungen für Ordner und Unterordner per PowerShell Skript zu vergeben. Dabei sollen alle (bis auf die Admins) nur Daten
in die (Unter)Ordnern ablegen können und diese öffnen. In diesem Ordner dürfen die Dateien (Inhalt und Name) nicht geändert oder gelöscht
werden. Das selbe gilt auch für die Ordner.

Das setzen der Berechtigung zum änder/löschen funktioniert soweit, auch wenn ich im PowerShell relativ viele rote Meldungen bekomme.

Im File-System wurden alle User/Gruppen hinzugefügt mit den entsprechenden Berechtigungen.

Das Problem ist jetzt, dass ich auch keine Berechtigung habe, Dateien in den Haupt- und Unterordner zu abzuspeichern.

Gibt es hier eine Möglichkeit dies umzusetzen, ohne dem User Schreibrechte zu geben? Denn mit Schreibrechten könnte der User die Inhalte oder
Namen der Order/Dateien ändern.

Hier so wie ich es machen würde. Dann brauchst du kein umfangreiches Konstrukt:

  • Dummy-Ordner erstellen und die Rechte entsprechend anpassen. Da kannst du auch die Vererbung brechen, wenn du willst obwohl ich damit vorsichtig sein würde.
rights

  • Die Rechte des Dummy-Ordners auf das Ziel übertragen. Das Script dazu:
$destinationFolders = [System.IO.Directory]::GetDirectories("<destination folder path>", '*.*' , [System.IO.SearchOption]::AllDirectories)  

$i = 0
foreach ($folder in $destinationFolders)
{
    Write-Host -"Folder: $folder"  
    if($i -gt 1) #in der Hirarchie der 3te Ordner
    {
        Get-Acl -Path "<my prepared folder path>" | Set-Acl $folder  
    }
    $i++
}


Wenn du das ganze nun auf eine andere Maschine kopierst (Also auch den Dummy-Ordner) sollten in einem NTFS-System die Rechte beibehalten werden. Das geht aber nur, wenn auf der Ziel-Maschine die gleichen Benutzer usw. vorhanden sind wie auf der Quelle. Darum empfiehlt es sich mit Domain-Prinzipals bzw Built-In-Prinzipals zu arbeiten und nicht mit lokalen Benutzern oder mit Benutzern aus der Gruppe Benutzer.

In meinem test Funktioniert das einwandfrei.
siehe dazu auch:
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell. ...
Member: Lockjaw
Lockjaw Apr 26, 2019 at 12:24:16 (UTC)
Goto Top
Zitat von @erikro:

Moin,

Zitat von @Lockjaw:

Hallo,

Nein. Es gibt zwar eine Variable Namens $Folders, die aus einem get-childitem kommt, nicht aber $Folder.
Könnte es sein, dass $Folder die Daten von $Folders bekommt bei der foreach-Schleife?

Woher soll ich das wissen. Ist Dein Skript. face-wink Aber wenn es so ist, dann hast Du eben ein System.IO.Fileinfo-Objekt in der Variablen. Und darauf kannst du direkt die Methode endswith nicht anwenden. Aber so sollte es gehen:

if ($folder.fullname.endswith("_00")) { ... }  

Die Eigenschaft fullname ist vom Typ String und darauf lässt sich die Methode wieder anwenden.

hth

Erik


Hatte Anfangs ja mein Script hier reinkopiert gehabt^^ An der Foreach Bedinung habe ich bisher nichts geändert gehabt.

Wenn ich
if ($folder.fullname.endswith("_00")) { ... }  
eingebe, bekomme ich folgende Meldung:

Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.
In D:\Script2.0.ps1:148 Zeichen:9
+                 if ($Folder.FullName.EndsWith("_00")){  
+                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) , RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull


Soll dass heißen, dass dieser Pfad nicht gefunden wird? NULL steht ja für gewöhnlich "kein Wert" bzw. "Leer".
Member: mayho33
mayho33 Apr 26, 2019 at 12:29:36 (UTC)
Goto Top
Zitat von @Lockjaw:

Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.
> In D:\Script2.0.ps1:148 Zeichen:9
> +                 if ($Folder.FullName.EndsWith("_00")){  
> +                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>     + CategoryInfo          : InvalidOperation: (:) , RuntimeException
>     + FullyQualifiedErrorId : InvokeMethodOnNull


Soll dass heißen, dass dieser Pfad nicht gefunden wird? NULL steht ja für gewöhnlich "kein Wert" bzw. "Leer".

Ich glaube eher dass ".FullName" nicht gefunden wird. Je nachdem wie du dir das Objekt holst kann $Folder ein String oder ein Objekt sein.
Member: Lockjaw
Lockjaw Apr 26, 2019 at 12:35:39 (UTC)
Goto Top
Zitat von @mayho33:

Zitat von @Lockjaw:

Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.
>> In D:\Script2.0.ps1:148 Zeichen:9
>> +                 if ($Folder.FullName.EndsWith("_00")){  
>> +                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>     + CategoryInfo          : InvalidOperation: (:) , RuntimeException
>>     + FullyQualifiedErrorId : InvokeMethodOnNull


Soll dass heißen, dass dieser Pfad nicht gefunden wird? NULL steht ja für gewöhnlich "kein Wert" bzw. "Leer".

Ich glaube eher dass ".FullName" nicht gefunden wird. Je nachdem wie du dir das Objekt holst kann $Folder ein String oder ein Objekt sein.

Ok. ich habe FullName weggelassen, da die Ausgabe mit FullName tatsächlich leer ist.
Mit
$Folder.EndsWith( )
klappt die Ausgabe der IF-Abfrage face-smile

Dann setze ich mich mal mit der Vergabe der Berechtigung auseinander und melde mich wieder, falls es irgendwo wieder hängen sollte face-smile
Member: mayho33
mayho33 Apr 26, 2019 updated at 12:50:28 (UTC)
Goto Top
Ein kleiner Tipp falls du das so nicht machst:

Verwende die Powershell ISE. Da kannst du Haltepunkte setzen und mit Mouse-Over direkt den Wert im Object prüfen oder schnell mal in den Console-Teil der ISE wechseln und das Object vorm Haltepunkt weiter bearbeiten/analysieren. Sehr praktisch!

und da Powershell zwar super praktisch ist und zudem noch das .Net Framework versteht, aber manchmal echt GAGA ist, enpfielt es sich mache Methoden aus dem Framework direkt zu nutzen

Bsp:
[Regex]::Split($myVar,",")}  

if([regex]::Match($myVar, "(\*)", [System.Text.RegularExpressions.RegexOptions]::IgnoreCase).Success)  

$destinationFolders = [System.IO.Directory]::GetDirectories("<destination folder path>", '*.*' , [System.IO.SearchOption]::AllDirectories)  

usw. Siehe auch: https://docs.microsoft.com/en-us/dotnet/api/system?view=netframework-4.7 ...
Member: erikro
erikro Apr 26, 2019 at 13:38:10 (UTC)
Goto Top
Moin,

Zitat von @Lockjaw:
Hatte Anfangs ja mein Script hier reinkopiert gehabt^^ An der Foreach Bedinung habe ich bisher nichts geändert gehabt.

Jo, jetzt habe ich die Zeile gefunden. Das müsste einfach so gehen. Ich habe das mal nachgebaut:

$Folders = Get-ChildItem -recurse | ? {($_.psiscontainer)}


        foreach ($Folder in $Folders.Fullname) {

        write-host $Folder
        if($folder.endswith("04")) {  

            write-host "Endet mit 04"  
        }

    }

und das geht ohne Probleme. Meine Vermutung war falsch. Die Foreach-Schleife kopiert nur fullname in die Laufvariable. Also steht da ein String drin und der kennt die Methode Endswith. Das klappt auch ohne Probleme hier bei mir.

Soll dass heißen, dass dieser Pfad nicht gefunden wird? NULL steht ja für gewöhnlich "kein Wert" bzw. "Leer".

Nicht ganz. Das steht für "Ist nicht vorhanden". Und da hat die Shell wie immer recht. Da ja schon Fullname als String in der Variablen steht, hat die Variable keine Eigenschaft "fullname" mehr.

Liebe Grüße

Erik
Member: erikro
erikro Apr 26, 2019 at 13:44:16 (UTC)
Goto Top
Zitat von @Lockjaw:
Mit
$Folder.EndsWith( )
klappt die Ausgabe der IF-Abfrage face-smile

Und woran lag's, dass es erst nicht funktioniert hat?
Member: Lockjaw
Lockjaw May 07, 2019 at 11:31:17 (UTC)
Goto Top
Zitat von @erikro:

Zitat von @Lockjaw:
Mit
$Folder.EndsWith( )
klappt die Ausgabe der IF-Abfrage face-smile

Und woran lag's, dass es erst nicht funktioniert hat?



Zitat von @erikro:

Zitat von @Lockjaw:
Mit
$Folder.EndsWith( )
klappt die Ausgabe der IF-Abfrage face-smile

Und woran lag's, dass es erst nicht funktioniert hat?

Davor hatte ich ja noch das "Fullname" gehabt, sprich
if ($Folder.FullName.EndsWith("_00")){  
.

Ohne funktioniert es soweit, so wie du es ja auch gepostet hast face-smile

Da sich jetzt die Anzahl der Ordner deutlich erhöht hat, und diese sich auf unterschiedlichen Ebenen befinden, hatte ich vor die betroffenen Namen der Ordner in ein Array zu packen und diesen Array dann abzufragen. Mein Code sieht wie folgt aus:

$FolderList = @("Auflistung aller Ordner")  
$a = 0  #items from FolderList

	while($true){
		$item = $FolderList[$a]
		$a++
		
		foreach ($Folder in $Folders.FullName){
				ResetAllDomainACL ($Folder)
				
				if($Folder.EndsWith($item)){
					Load-ACL($Folder)
					write-host "Ordner wird geändert:" $item}  
				else{ Protect-ACL($Folder)}
		}
		
	if ($a -eq 27) {break}
	}

Beim Ausführen bekomme ich kein Fehler ausgespuckt aber die Ordner haben weiterhin die Berechtigung aus der Funktion Protect-ACL.
Die Ausgabe write-host wird ausgeführt. Also sieht das für mich so aus, als ob das Skript zwar den abgefragten Ordner findet, die Berechtigungen darauf aber nicht ändert. Woran kann es liegen? bzw. was mache ich hier falsch?
Member: Lockjaw
Lockjaw May 07, 2019 at 12:59:30 (UTC)
Goto Top
Ich habe jetzt ResetAllDomainACL ($Folder) über die While-Schleife gepackt. So funktioniert die Vergabe der Berechtigungen face-smile

Jetzt muss ich nur noch die Berechtigungen der User so anpassen, dass die nur Lesen, ausführen und Daten ablegen dürfen....
Member: Lockjaw
Lockjaw May 07, 2019 at 15:31:21 (UTC)
Goto Top
habe jetzt wieder das selbe Problem wie vorher beschrieben, obwohl ich am Code nichts geändert habe :/
Da scheint etwas mit dem Code nicht zu stimmen. Wenn mir hierbei jemand behilflich sein kann, wäre ich ihm sehr dankbar face-smile
Member: erikro
erikro May 07, 2019 at 16:34:57 (UTC)
Goto Top
Moin,

Zitat von @Lockjaw:

> $FolderList = @("Auflistung aller Ordner")  
> $a = 0  #items from FolderList
> 

Hier liest Du also wie auch immer die Liste der Folder in die Variable $FolderList ein. Was soll das $a?

> 	while($true){ 

$true ist immer wahr. Daher gibt while($true) eine Endlosschleife. Was soll die?

 		$item = $FolderList[$a]
> 		$a++

OK, hier liest Du also die einzelnen Ordner in die Variable $item ein.

 		
> 		foreach ($Folder in $Folders.FullName){

Und wo kommt nun plötzlich das Objekt $folders her? Das gibt es in diesem Skript nicht.

 				ResetAllDomainACL ($Folder)
> 				
> 				if($Folder.EndsWith($item)){
> 					Load-ACL($Folder)
> 					write-host "Ordner wird geändert:" $item}  
> 				else{ Protect-ACL($Folder)}
> 		}
> 		
> 	if ($a -eq 27) {break}

Ernshaft?

Beim Ausführen bekomme ich kein Fehler ausgespuckt aber die Ordner haben weiterhin die Berechtigung aus der Funktion Protect-ACL.
Die Ausgabe write-host wird ausgeführt. Also sieht das für mich so aus, als ob das Skript zwar den abgefragten Ordner findet, die Berechtigungen darauf aber nicht ändert. Woran kann es liegen? bzw. was mache ich hier falsch?

Du machst so ziemlich alles falsch, was man nur falsch machen kann. Du solltest Dich mal mit den Grundlagen der Schleifenprogrammierung beschäftigen.

https://www.windowspro.de/script/schleifen-powershell-foreach-while-do-u ...

Du kannst nicht einfach die Namen der Variablen und Objekte hier mal so und da mal anders benennen. Das muss schon Sinn machen und zusammenpassen.

Liebe Grüße

Erik