Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

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

Mitglied: Lockjaw

Lockjaw (Level 1) - Jetzt verbinden

23.04.2019 um 17:55 Uhr, 388 Aufrufe, 28 Kommentare

Hallo,



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

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:


01.
########################################################################################################################
02.
##########################################################################################################################
03.
#
04.
# Author:    Name
05.
#
06.
# Date:        23.04.2019
07.
#
08.
# Version:    1.00    
09.
#
10.
# Comment:    .\FolderScript.ps1     Searches for folders in the specifies filesystem and modifies the NTFS accessrights.
11.
#                
12.
#
13.
##########################################################################################################################
14.

15.
##########################################################################################################################
16.
#
17.
# Constants and variables
18.
#
19.
##########################################################################################################################
20.

21.

22.

23.
$StartPath = "\\Pfad des Ordners"
24.

25.
##########################################################################################################################
26.
#
27.
# Functions
28.
#
29.
##########################################################################################################################
30.

31.
function Process-ACL ($Folder)
32.
{
33.
        #read current acl
34.
        $acl = Get-Acl $Folder
35.
        #disable inheritance
36.
        $acl.SetAccessRuleProtection($True, $False)
37.
        #set-owner -needed for altering the access rights
38.
        $acl.SetOwner([System.Security.Principal.NTAccount] "Lokaler Admin")
39.
        #build the new permissions
40.
        #default permissions
41.
    
42.
        $rule = New-Object System.Security.AccessControl.FileSystemAccessRule("Administrators","FullControl", "ContainerInherit, ObjectInherit", "None", "Allow")
43.
        $acl.AddAccessRule($rule)
44.
            Set-ACL Folder $acl
45.
        $rule = New-Object System.Security.AccessControl.FileSystemAccessRule("System","FullControl", "ContainerInherit, ObjectInherit", "None", "Allow")
46.
        $acl.AddAccessRule($rule)
47.
           Set-ACL $Folder $acl
48.
        $rule = New-Object System.Security.AccessControl.FileSystemAccessRule("Domäne\Domain Admins","FullControl", "ContainerInherit, ObjectInherit", "None", "Allow")
49.
        $acl.AddAccessRule($rule)    
50.
        Set-ACL $Folder $acl
51.
        $rule = New-Object System.Security.AccessControl.FileSystemAccessRule("Domäne\user-test","ReadAndExecute", "ContainerInherit, ObjectInherit", "None", "Allow")
52.
        $acl.AddAccessRule($rule)    
53.
        Set-ACL $Folder $acl
54.
        
55.

56.
}
57.
    
58.
    
59.
    
60.
##########################################################################################################################
61.
#
62.
# Main code
63.
#
64.
##########################################################################################################################
65.

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

68.

69.
    ##################################################################################################
70.
    # main loop 
71.
        foreach ($Folder in $Folders.Fullname) {
72.
    
73.
        Process-ACL ($Folder)            
74.
    }
75.
    # End main loop
76.
    ##################################################################################################
77.
    ##################################################################################################[


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.
28 Antworten
Mitglied: Pjordorf
23.04.2019 um 20:11 Uhr
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
Bitte warten ..
Mitglied: emeriks
24.04.2019, aktualisiert um 08:35 Uhr
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.
Bitte warten ..
Mitglied: erikro
24.04.2019 um 08:29 Uhr
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
Bitte warten ..
Mitglied: mayho33
25.04.2019, aktualisiert 26.04.2019
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
Bitte warten ..
Mitglied: Lockjaw
26.04.2019, aktualisiert um 12:08 Uhr
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

01.
if {($Folder -eq $Folder.EndsWith("_00"))
02.
Load-ACL ($Folder)}
03.
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?
Bitte warten ..
Mitglied: erikro
26.04.2019 um 12:10 Uhr
Moin,

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

hth

Erik
Bitte warten ..
Mitglied: Pjordorf
26.04.2019 um 12:14 Uhr
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

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

Gruß,
Peter
Bitte warten ..
Mitglied: Lockjaw
26.04.2019 um 12:34 Uhr
Danke für die Links.
Ich habe die Vererbung durchgehend deaktiviert, damit ich bei den bestimmten Ordnern die ACLs anders setzen kann.

01.
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.
Bitte warten ..
Mitglied: Lockjaw
26.04.2019, aktualisiert um 12:38 Uhr
@eriko

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

Zum Testen habe ich jetzt vorerst Ausgabe-Strings statt die Funktion geschrieben.
Jedes mal bekomme ich den Text von dem Else-Fall :/
Bitte warten ..
Mitglied: Pjordorf
26.04.2019 um 12:39 Uhr
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
Bitte warten ..
Mitglied: erikro
26.04.2019 um 12:44 Uhr
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
Bitte warten ..
Mitglied: Lockjaw
26.04.2019 um 13:12 Uhr
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?
Bitte warten ..
Mitglied: Lockjaw
26.04.2019 um 13:23 Uhr
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.
Bitte warten ..
Mitglied: Pjordorf
26.04.2019 um 13:32 Uhr
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
Bitte warten ..
Mitglied: erikro
26.04.2019 um 13:47 Uhr
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. 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:

01.
if ($folder.fullname.endswith("_00")) { ... }
Die Eigenschaft fullname ist vom Typ String und darauf lässt sich die Methode wieder anwenden.

hth

Erik
Bitte warten ..
Mitglied: Lockjaw
26.04.2019 um 13:48 Uhr
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.
Bitte warten ..
Mitglied: erikro
26.04.2019 um 13:54 Uhr
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.
Bitte warten ..
Mitglied: mayho33
26.04.2019, aktualisiert um 14:00 Uhr
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 - Klicke auf das Bild, um es zu vergrößern

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

03.
$i = 0
04.
foreach ($folder in $destinationFolders)
05.
{
06.
    Write-Host -"Folder: $folder"
07.
    if($i -gt 1) #in der Hirarchie der 3te Ordner
08.
    {
09.
        Get-Acl -Path "<my prepared folder path>" | Set-Acl $folder
10.
    }
11.
    $i++
12.
}

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. ...
Bitte warten ..
Mitglied: Lockjaw
26.04.2019 um 14:24 Uhr
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. 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:

01.
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
01.
if ($folder.fullname.endswith("_00")) { ... }
eingebe, bekomme ich folgende Meldung:

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

Soll dass heißen, dass dieser Pfad nicht gefunden wird? NULL steht ja für gewöhnlich "kein Wert" bzw. "Leer".
Bitte warten ..
Mitglied: mayho33
26.04.2019 um 14:29 Uhr
Zitat von Lockjaw:

01.
Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.
02.
> In D:\Script2.0.ps1:148 Zeichen:9
03.
> +                 if ($Folder.FullName.EndsWith("_00")){
04.
> +                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
05.
>     + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
06.
>     + 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.
Bitte warten ..
Mitglied: Lockjaw
26.04.2019 um 14:35 Uhr
Zitat von mayho33:

Zitat von Lockjaw:

01.
Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.
02.
>> In D:\Script2.0.ps1:148 Zeichen:9
03.
>> +                 if ($Folder.FullName.EndsWith("_00")){
04.
>> +                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
05.
>>     + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
06.
>>     + 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
01.
$Folder.EndsWith( )
klappt die Ausgabe der IF-Abfrage

Dann setze ich mich mal mit der Vergabe der Berechtigung auseinander und melde mich wieder, falls es irgendwo wieder hängen sollte
Bitte warten ..
Mitglied: mayho33
26.04.2019, aktualisiert um 14:50 Uhr
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:
01.
[Regex]::Split($myVar,",")}
02.

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

05.
$destinationFolders = [System.IO.Directory]::GetDirectories("<destination folder path>", '*.*' , [System.IO.SearchOption]::AllDirectories)
06.
usw. Siehe auch: https://docs.microsoft.com/en-us/dotnet/api/system?view=netframework-4.7 ...
Bitte warten ..
Mitglied: erikro
26.04.2019 um 15:38 Uhr
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:

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

03.

04.
        foreach ($Folder in $Folders.Fullname) {
05.

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

09.
            write-host "Endet mit 04"
10.
        }
11.

12.
    }
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
Bitte warten ..
Mitglied: erikro
26.04.2019 um 15:44 Uhr
Zitat von Lockjaw:
Mit
01.
$Folder.EndsWith( )
klappt die Ausgabe der IF-Abfrage

Und woran lag's, dass es erst nicht funktioniert hat?
Bitte warten ..
Mitglied: Lockjaw
07.05.2019 um 13:31 Uhr
Zitat von erikro:

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

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




Zitat von erikro:

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

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

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

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

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:

01.
$FolderList = @("Auflistung aller Ordner")
02.
$a = 0  #items from FolderList
03.

04.
	while($true){
05.
		$item = $FolderList[$a]
06.
		$a++
07.
		
08.
		foreach ($Folder in $Folders.FullName){
09.
				ResetAllDomainACL ($Folder)
10.
				
11.
				if($Folder.EndsWith($item)){
12.
					Load-ACL($Folder)
13.
					write-host "Ordner wird geändert:" $item}
14.
				else{ Protect-ACL($Folder)}
15.
		}
16.
		
17.
	if ($a -eq 27) {break}
18.
	}
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?
Bitte warten ..
Mitglied: Lockjaw
07.05.2019 um 14:59 Uhr
Ich habe jetzt ResetAllDomainACL ($Folder) über die While-Schleife gepackt. So funktioniert die Vergabe der Berechtigungen

Jetzt muss ich nur noch die Berechtigungen der User so anpassen, dass die nur Lesen, ausführen und Daten ablegen dürfen....
Bitte warten ..
Mitglied: Lockjaw
07.05.2019 um 17:31 Uhr
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
Bitte warten ..
Mitglied: erikro
07.05.2019 um 18:34 Uhr
Moin,

Zitat von Lockjaw:

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

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

01.
> 	while($true){ 

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

>
01.
 		$item = $FolderList[$a]
02.
> 		$a++
OK, hier liest Du also die einzelnen Ordner in die Variable $item ein.

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

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

>
01.
 				ResetAllDomainACL ($Folder)
02.
> 				
03.
> 				if($Folder.EndsWith($item)){
04.
> 					Load-ACL($Folder)
05.
> 					write-host "Ordner wird geändert:" $item}
06.
> 				else{ Protect-ACL($Folder)}
07.
> 		}
08.
> 		
09.
> 	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
Bitte warten ..
Ähnliche Inhalte
Windows Server

Mit welchem Programm wurde auf einem Datensicherungsband LTO DAT gesichert

Frage von arohwedderWindows Server1 Kommentar

Hallo Leute, ich habe hier ein paar Sicherungsbänder, wo nicht bekannt ist, mit welchem Programm ursprünglich gesichert wurde unter ...

Microsoft Office

Excel Pdf Datei als Icon Symbol in Word einfügen per Drag and drop?

gelöst Frage von GeforceMicrosoft Office4 Kommentare

Moin zusammen, ich habe hier Win 7 mit Office 2013. Leider kann ich seit dem Update von 2010 auf ...

Windows Server

Manage open files and sessions

gelöst Frage von thatsrightWindows Server10 Kommentare

Hola liebe Gemeinde, Ich hab mal ne frage Habe neu einen Filserver 2012r2, jetzt wollte/musste/sollte ich ein File schliesen, ...

Windows Userverwaltung

Identity and Access Management Programme

Frage von PulliWindows Userverwaltung1 Kommentar

Hallo, sind auf der Suche nach einem Marktführenden Produkt für Identity & Access Management. Folgendes Szenario möchten wir abbilden. ...

Neue Wissensbeiträge
Windows Tools
How to log in my Norton
Anleitung von nortonexpert vor 1 StundeWindows Tools

Norton products are quite advanced to keep your devices protected against the virus and malware threats. It is quite ...

Google Android

Heise: Google sperrt Android-Updates und den Play Store für Huawei

Information von Deepsys vor 19 StundenGoogle Android7 Kommentare

Das finde ich schon ein starkes Stück, Trump der Welt Diktator. So kann man mit einem Dekret mal eben ...

Windows 7

Südkoreas Regierung setzt auf Linux, um Windows 7 Clients abzulösen

Information von kgborn vor 1 TagWindows 74 Kommentare

Kleiner Infosplitter zum Wochenanfang: Während München (LiMux) und die niedersächsische Finanzverwaltung von Linux auf einen Windows 10-Client (und Office) ...

Internet
Big Brother is Watching You
Information von transocean vor 1 TagInternet1 Kommentar

Moin, die Datenkrake Google fischt Informationen über Einkäufe ab, die GMail Nutzer im Netz tätigen. Gruß Uwe

Heiß diskutierte Inhalte
Linux Userverwaltung
Ist sudo auf Servern Pflicht?
gelöst Frage von lcer00Linux Userverwaltung13 Kommentare

Hallo zusammen, wir haben für einige Netzwerkdienste einige Debian Server. Auf diesen Servern arbeiten keine Benutzer im eigentlichen sinne. ...

Humor (lol)
Mitarbeiter meldet: VPN funktioniert nicht
gelöst Frage von Epixc0reHumor (lol)13 Kommentare

Servus, einer unserer Mitarbeiter meldete heute, sein VPN funktioniert Zuhause nicht, im LTE Netz aber schon. Per Teamviewer hin ...

Windows 10
Windows am MAC
Frage von LeeX01Windows 1013 Kommentare

Guten Abend zusammen, ich habe gerade ein Macbook Pro vor mir welches ich mit einem Windows 10 to go ...

Batch & Shell
Powershell Datum der zuletzt eingespielten Patche bei remote Servern ermitteln
Frage von bensonhedgesBatch & Shell12 Kommentare

Hallo, ich möchte gerne anhand einer Serverliste (bsp. computers.txt) via PS ermitteln, wann derjeweilige Server zuletzt gepatcht wurde (Liste ...