koehne
Goto Top

Powershell - Zugriffsberechtigungen von Ordnern übertragen

Hallo,

ich möchte gerne die ACL's von einem Ordner mit dem Namen "Personaldaten" auf ca. 100 anderen Ordner übertragen.

Meine Ordnerstruktur:

Mitarbeiterpapiere
Mitarbeitername
Personaldaten
Zertifikate

Mit
$DirectoryPath_org="D:\Mitarbeiterpapiere\__Name_Vorname\Personaldaten"  
$DirectoryPath_dest="D:\Mitarbeiterpapiere\__Name_Vorname1\Personaldaten"  

$ACL=Get-Acl $DirectoryPath_org
Set-Acl -path $DirectoryPath_dest -AclObject $ACL

habe ich erfolgreich von einem Ordner auf einen anderen die ACL's übertrage können. Allerdings hätte ich das jetzt gerne automatisiert für alle Personaldaten-Order in den Mitarbeiterordnern.

Versucht habe ich
$suchordner="D:\Mitarbeiterpapiere"  

$gefunden = Get-ChildItem $suchordner -recursiv | where {$_.psIsConatainer -eq $true -and $_.Name -like 'Personaldaten'}  

$DirectoryPath_org="D:\Mitarbeiterpapiere\__Name_Vorname\Personaldaten"  

$ACL=Get-Acl $DirectoryPath_org
Set-Acl -path $gefunden -AclObject $ACL

was leider nicht funktioniert hat.

Im Grunde muss ich nur jeden Personaldaten-Ordner Pfad herausfinden und die ACL's dann dorthin kopieren, nur wie?!

Ich muss dazu sagen, dass meine Powershellkentnisse gegen Null tendieren. Ich hoffe einer von euch hat einen gescheiten Tipp für mich?!

MfG

Content-ID: 217373

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

Ausgedruckt am: 19.12.2024 um 08:12 Uhr

colinardo
Lösung colinardo 19.09.2013 aktualisiert um 18:55:04 Uhr
Goto Top
Hallo koehne,
kein Problem:
$pathOriginal = "D:\Mitarbeiterpapiere\__Name_Vorname\Personaldaten"   
$destRoot = "D:\Mitarbeiterpapiere"  
$aclOriginal = Get-Acl $pathOriginal
Get-ChildItem $destRoot -Recurse | ?{$_.PSIsContainer -eq $true -And $_.Name -like "Personaldaten"} | %{set-acl -Path $_.FullName -AclObject $aclOriginal}  
Grüße Uwe
koehne
koehne 20.09.2013 aktualisiert um 09:25:37 Uhr
Goto Top
GENIAL! Danke schön! Funktioniert einwandfrei.

Kannste mir evtl. noch kurz erklären für was | und ? und % steht!?
colinardo
colinardo 20.09.2013 um 09:28:57 Uhr
Goto Top
Zitat von @koehne:
GENIAL! Danke schön! Funktioniert einwandfrei.

Kannste mir evtl. noch kurz erklären für was | und ? und % steht!?
| ist eine Pipe damit werden die Objekte an den nachfolgenden Befehl übergeben
?{} ist ein Alias für das CMDLet where-object
%{} ist ein Alias für das CMDLet foreach-object

Grüße Uwe
koehne
koehne 20.09.2013 um 09:37:53 Uhr
Goto Top
Zitat von @colinardo:
> Zitat von @koehne:
> ----
> GENIAL! Danke schön! Funktioniert einwandfrei.
>
> Kannste mir evtl. noch kurz erklären für was | und ? und % steht!?
| ist eine Pipe damit werden die Objekte an den nachfolgenden Befehl übergeben
?{} ist ein Alias für das CMDLet where-object
%{} ist ein Alias für das CMDLet foreach-object

Grüße Uwe

Eine letzte Frage von mir, dann bin ich glücklich:

Was muss ich am Quelltext ändern um z.B. alle Name_Vorname Ordner die Zugriffsberechtigungen zu ändern?
Denn jeder dieser Ordner hat ja den Namen des jeweiligen Mitarbeiters...
Dazu müsste man nur irgendwie die Ordnernamen auslesen.
Geh ich da recht in der Annahme, dass dazu einfach nur die Passage
"-And $_.Name -like "Personaldaten"  
durch
-And $_.Name -like "*_*"  
zu ersetzen oder reicht es einfach nur
Get-ChildItem $destRoot | ?{$_.PSIsContainer -eq $true} | %{set-acl -Path $_.FullName -AclObject $aclOriginal} 
zu nehmen?
colinardo
colinardo 20.09.2013 aktualisiert um 10:03:48 Uhr
Goto Top
Zitat von @koehne:
oder reicht es einfach nur
Get-ChildItem $destRoot | ?{$_.PSIsContainer -eq $true} | %{set-acl -Path $_.FullName -AclObject $aclOriginal} 

das hast du genau richtig erfasst, wenn nur die Namen der Mitarbeiter alle auf der ersten Ebene im Ordner "D:\Mitarbeiterpapiere" liegen ist das die richtige Vorgehensweise.

Wenn es das dann war noch ein gelöst dran.
Grüße Uwe