ricson
Goto Top

Icacls u takeown Berechtigungen Besitzer auf Unterordner vererben

Hallo,

ich möchte den Besitz und die Berechtigungen von einem Ordner auf seine Unterordner "kopieren".

mit takeown und icacls.
im Vb Skript sieht das ungefähr so aus:

Process.Start("C:\Windows\System32\cmd.exe", "/k takeown /F """ & pfad & """")
Process.Start("C:\Windows\System32\cmd.exe", "/k icacls " & pfad & " /inheritance:r /grant:r Admin: (IO)(OI)(CI)F /t)

Der Zugriff wird trotzdem verweigert.

Ich habe mich auch noch mal über die cmd Hilfe zu icacls und takeown belesen, aber ich bekomme nicht die Berechtigung, Rechte zu ändern, für die jeweiligen Unterordner.

Hat jemand eine Idee?

Danke

Content-Key: 373250

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

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

Mitglied: 136037
136037 May 07, 2018 updated at 09:28:55 (UTC)
Goto Top
Dann hast du die Hilfe zu den Befehlen nicht vollständig gelesen, erstens brauchst du zusätzlich die Option /D Y (oder bei Deusch ein J) damit Fragen mit Ja beantwortet werden. Zweitens musst du das rekursiv erledigen es fehlt also die Option /R.

Also alles erst mal selbst alles auf der Konsole testen bevor du zu VB übergehst!

Und Grundlagen zu NTFS ACLs wären hier dringend mal nachzuholen!!
Member: Kraemer
Kraemer May 07, 2018 at 09:39:02 (UTC)
Goto Top
Moin,
Zitat von @ricson:
Process.Start("C:\Windows\System32\cmd.exe", "/k takeown /F """ & pfad & """")
Process.Start("C:\Windows\System32\cmd.exe", "/k icacls " & pfad & " /inheritance:r /grant:r Admin: (IO)(OI)(CI)F /t)
warum gehst du hier den Umweg über die cmd.exe?

Gruß
Member: ricson
ricson May 07, 2018 updated at 09:48:33 (UTC)
Goto Top
hi qaboos,

ok mit Deiner Hilfe bin ich jetzt ein Schritt weiter -> /R /D J wird nun ausgeführt und der Administrator ist nun auch Besitzer der Unterordner.
Process.Start("C:\Windows\System32\cmd.exe", "/k takeown /F """ & pfad & ci.Name & """ /R /D J")
Process.Start("C:\Windows\System32\cmd.exe", "/k icacls " & pfad & ci.Name & " /grant Administrator: (CI)(OI)(F)")


System.IO.Directory.Delete(pfad & ci.Name, True) -->Trotzdem wird hier der Zugriff verweigert.
Mitglied: 136037
136037 May 07, 2018 updated at 09:58:30 (UTC)
Goto Top
Wundert mich nicht, wer arbeitet schon als der "Administrator" .-) Lach ...
Pfeif dir erst mal die NTFS Grundlagen rein, dann kannst du wieder kommen.

warum gehst du hier den Umweg über die cmd.exe?
Was anderes scheint er offensichtlich noch nicht zu verstehen.
Member: ricson
ricson May 07, 2018 updated at 11:12:58 (UTC)
Goto Top
...

Process.Start("C:\Windows\System32\cmd.exe", "/k takeown /F """ & pfad & ci.Name & """ /R /D J")
Process.Start("C:\Windows\System32\cmd.exe", "/k icacls " & pfad & ci.Name & " /grant Admin: (CI)(OI)(F)")

bis hier klappt es -> "Admin" bekommt den Besitz.
System.IO.Directory.Delete(pfad & ci.Name, True) --> Löschen funktioniert nicht, obwohl der Besitz und Berechtigung (Vollzugriff) vorhanden sind.

@ Kraemer
mit Deinem Link (MS Hilfeseite) von gestern, hatte ich es nicht hinbekommen - aber ich bin offen für alles, man lernt ja nie aus face-smile
Mitglied: 136037
136037 May 07, 2018 updated at 12:14:09 (UTC)
Goto Top
Nun Process.Start() erstellt einen neuen Prozess aber eben asynchron deswegen führst du beide Prozesse zur selben Zeit aus ohne das sie aufeinander warten! Da ist der Grund warum das so in der Art nicht funktionieren kann da beide Befehle ja aufeinander aufbauen und der andere ohne Abschluss des anderen nicht funktioniert. Mach also hinten dran noch ein .WaitForExit() und es klappt face-wink, vorausgesetzt der gerade angemeldete User ist der User "Admin".

Process.Start("C:\Windows\System32\cmd.exe", "/k takeown /F """ & pfad & ci.Name & """ /R /D J").WaitforExit()  
Process.Start("C:\Windows\System32\cmd.exe", "/k icacls """ & pfad & ci.Name & """ /grant Admin:(CI)(OI)F /t /c").WaitForExit()  
System.IO.Directory.Delete(pfad & ci.Name, True)
Ab und zu die Doku lesen hilft da ungemein wenn man neu in der Materie ist.
Member: ricson
ricson May 08, 2018 at 06:41:45 (UTC)
Goto Top
Hallo qaboos,

die Prozesse werden nun nacheinander ausgeführt - es kommt jeweils die Meldung erfolgreich.
Wenn man sich die Ordner über die Eigenschaften anschaut, sind diese im Besitz des aktuellen Users.

Der Delete Vorgang wird unterbrochen, sobald versucht wird - einen Unterordner aus dem Profilordner zu löschen.

Den Code habe ich noch mal etwas angepasst:

ci.name übergibt den aktuellen User

 
              Process.Start("C:\Windows\System32\cmd.exe", "/k takeown /F """ & pfad & ci.Name & """ /R /D J").WaitForExit()  
              Process.Start("C:\Windows\System32\cmd.exe", "/k icacls " & pfad & ci.Name & " /grant " & ci.name & ":(CI)(OI)(F) /T /C").WaitForExit()  
              System.IO.Directory.Delete(pfad & ci.Name, True)

per Hand Profilordner löschen funktioniert.
Mitglied: 136037
Solution 136037 May 08, 2018 updated at 07:23:27 (UTC)
Goto Top
Der Delete Vorgang wird unterbrochen,
Heißt was???

Funktioniert hier einwandfrei, obwohl ich eher mit /reset /t /c bei icacls arbeite.

Starte die App elevated.
Member: ricson
ricson May 08, 2018 at 08:12:45 (UTC)
Goto Top
irgendetwas mache ich noch falsch ... hier mal die Meldung:

bild1



...
Starte die App elevated.

das hatte ich schon in den Einstellungen gesetzt, falls Du das meintest:
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
Mitglied: 136037
136037 May 08, 2018 updated at 08:51:08 (UTC)
Goto Top
Da fehlen doppelte Anführungszeichen und den Pfad!

Ich bin raus. Keine Ahnung wo das Problem bei dir liegt, hier geht's.
Member: ricson
ricson May 08, 2018 at 09:17:49 (UTC)
Goto Top
Trotzdem Danke für Deine Geduld!