themadimon
Goto Top

Powershell - über ACL einen Benutzer für einen Ordner herausfinden und Ordner löschen

Hallo Administrator-Community.

Seit Februar mache ich meine Ausbildung zum Anwendungsentwickler und soll mich jetzt in Powershell einarbeiten.
Dazu bekam ich folgende Aufgabe:

Behalte alle Ordner, die unter acl einen Benutzer mit *@xyz.de haben, ansonsten lösche diesen Ordner.

Habe mehrere Foren durchsucht, aber immer nur was zum Ändern oder Löschen des Gruppen- oder Benutzernamens gefunden.
Was ich bis jetzt heraus gefunden und erarbeitet habe ist:
(get-acl ,pfad').Access und Remove-Item pfad.

Mit get-acl konnte ich bis dato das bauen :


$items = Get-ChildItem -Path $Path
foreach ($item in $items)
{
$itemPfad = $item.FullName
$itemName = $item.Name

write-Host("`r`n~~~ Bearbeiten Unterordner '$itemName'")

$ACL=Get-ACL $itemPfad
$owner=$ACL.Access ## $ACL.Access


}

Ich hoffe, ich finde gerade nur nicht die Kombination aus get-acl und remove-item.

Und fyi: Nein, ich möchte nicht, dass man mir den ganzen Code fertig schreibt.
(Da ich schon viel von Leuten gelesen habe, die ihr ganzes Script von anderen machen lassen wollten)

Hoffentlich könnt ihr mir ein paar Tipps geben.

Grüße.

Content-Key: 341740

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

Printed on: April 24, 2024 at 22:04 o'clock

Member: AndreasHoster
Solution AndreasHoster Jun 27, 2017 at 10:23:11 (UTC)
Goto Top
Da $ACL.Access einen Array mit lauter Berechtigungsobjekten ausgibt, muß man das Objekt, das man haben will raussuchen.
Das kann man direkt über eine Pipeline machen.
$UserInACL = $ACL.Access |  where {$_.IdentityReference -like "*@xyz.de*"}  
Achtung: Windows nimmt auch gerne die Darstellung domain\username statt username@domain, also möglicherweise beides abprüfen.

Dann muß nur geschaut werden, ob in $UserInACL ein Objekt steht oder nicht (wenn nicht gibts den User in der ACL nicht) und dann Löschen:
if($UserInACL) {
	Remove-Item -Path $itemPfad 
}

Wenn man die anderen Berechtigungen für Logging Zwecke braucht, dann kann man das auch in einer Schleife machen:
$UserInACL = $ACL.Access |  where {$_.IdentityReference -like "*@xyz.de*"}  
$UserVorhanden = $False
ForEach($UserACL in $UserInACL) {
    if($UserACL.IdentityReference -like "*@xyz.de*") {  
		' User wird gefunden, also nicht löschen  
		$UserVorhanden = $True
		' Irgendwelches Logging  
	} else {
		' Irgendwelches Logging  
	}
}
If($UserVorhanden -eq $False) {
	Remove-Item -Path $itemPfad
}
Member: TheMaDimon
TheMaDimon Jun 27, 2017 at 11:58:33 (UTC)
Goto Top
Lieben Dank AndreasHoster.

Habe wegen dem Tipp mal die Darstellung mit username@domain gecheckt und tatsächlich ist es domain/username.
Einige Stellen, die im Quelltext angegeben sind, habe ich erst gar nicht in Betracht gezogen, aber jetzt macht es Sinn, das so umzusetzen...

Danke für Deine/Ihre ausführliche Antwort.