rekurencyjnie zmieniaj okna właściciela 7

93

Jakoś przypadkowo ustawiłem wszystkie pliki w podfolderze na „Brak właściciela” i nie mogę zmienić wszystkich uprawnień. Mogę zmienić jeden ręcznie, zmieniając właściciela, a następnie ustawiając uprawnienia, ale jak mogę zmienić właściciela wszystkich plików w tym katalogu od razu?

Laurent
źródło

Odpowiedzi:

90

Użyj takeownz wiersza polecenia, aby przejąć na własność folder, wszystkie jego podfoldery i pliki rekurencyjnie:

takeown /f "c:\folder\subfolder" /r

Działa to dobrze, ale jeśli nie uruchomisz konsoli wiersza poleceń jako administrator, może się nie powieść w przypadku plików, których nie jesteś właścicielem.

Kez
źródło
104

Aby naprawić naprawdę zepsute uprawnienia, najlepiej uruchomić te dwa polecenia jeden po drugim:

takeown /f "C:\path\to\folder" /r
icacls "C:\path\to\folder" /reset /T

Pierwszy daje prawo własności do wszystkich plików, jednak może to nie wystarczyć, na przykład jeśli wszystkie pliki mają uprawnienia do odczytu / zapisu / wykonania ustawione na „odmowa”. Jesteś właścicielem plików, ale nadal nie możesz nic z nimi zrobić.

W takim przypadku uruchom drugie polecenie, które naprawi zepsute uprawnienia.

Laurent
źródło
3
Doskonałe porady techniczne ... Twoje rozwiązanie było jedynym, które działało. Dzięki jeszcze raz.
carrabino
4
Najlepsza rada, należy użyć zarówno takeown, jak i icacls.
gnac
1
/ Opcja jest przydatna, jeśli chcesz przekazać „własność grupie administratorów zamiast obecnego właściciela”. Aby to zrobić, musisz mieć uprawnienia administratora. Może być konieczne otwarcie okna cmd za pomocą Ctrl-Shift-Enter.
PeterVermont,
4
Dodałem /D Yparametr, aby takeownautomatycznie potwierdzał katalogi cykliczne, w których nie masz uprawnień do listy katalogów.
Jeroen Wiert Pluimers
3
@JeroenWiertPluimers, chociaż to dobra rada, że ​​usunąłem edycję, ponieważ jest (głupio) zlokalizowanym parametrem, więc w angielskim systemie Windows będzie /D Y, w języku francuskim /D O, może w hiszpańskim /D Sitp.
laurent
26

Zauważ, że cacls jest przestarzałe (od Windows Vista?) I zaleca używanie icacls.

To polecenie rekurencyjnie zresetuje uprawnienia do folderu:

icacls "C:\path\to\folder" /reset /T
stamtąd
źródło
5

Możesz użyć caclsz wiersza polecenia:

cacls „C: \ ścieżka \ do \ folderu” / E / T / C / G „Administrator”: F.

/TPrzełącznik pozwala mu funkcjonować rekurencyjnie. Zastąp Administratorużytkownika, któremu chcesz udzielić uprawnień.

John T.
źródło
1

Miałem problemy z plikami o bardzo długich ścieżkach (powyżej 256 znaków). Dwa polecenia

takeown /f "C:\path\to\really_long_folder_name" /r
icacls "C:\path\to\really_long_folder_name" /reset /T

działało oprócz tych plików z naprawdę długimi ścieżkami i nazwami. Skończyło się na zmianie nazwy

"C:\path\to\really_long_folder_name"

do

"C:\path\to\r"

a następnie bieganie

takeown /f "C:\path\to\r" /r /D Y
icacls "C:\path\to\r" /grant Everyone:(F) /t /c /q

po czym mogłem zmienić nazwę folderów na coś bardziej sensownego. takeown / DY odpowiada tak na pytania. W przypadku icacl użyłem / grant, aby dać pełny dostęp wszystkim (ponieważ właśnie próbowałem uzyskać dostęp do danych na dysku twardym z martwego komputera), przy pomocy / t do przetwarzania podfolderów i plików, / q do uruchamiania w trybie cichym (ukryj sukcesy) i / c, aby pokazać błędy. Powtórzyłem ten proces, zmieniając nazwy folderów, aż wszystkie uprawnienia do plików zostały pomyślnie zaktualizowane.

Mam nadzieję, że pomoże to komuś, kto napotkał błędy podobne do „odmowy wyliczenia obiektów w dostępie do kontenera, odmawia się” błędów, które pojawiały się podczas próby uzyskania dostępu do danych ze starego dysku twardego.

Thesle Williams
źródło
0

Dzięki @ this.lau_ za wskazówkę / reset, właśnie tego potrzebowałem, aby ukończyć mój skrypt, aby przejąć CSC na własność i wykonać kopię zapasową. Po przejęciu własności C: \ Windows \ CSC uprawnienia stają się bardzo niespójne w zakresie dziedziczenia - przełącznik / reset naprawił to dla mnie.

Function Copy-CSCData {
    $Datetime = Get-Date -Format yyyyMMdd.hhmmss
    $LogPath = 'PATH TO LOG'
    $CSCSource = 'C:\Windows\CSC\v2.0.6\namespace'
    $Dest = 'DESTINATION PATH'
    $icaclsource = "\\?\" + $CSCSource

    $CSCLogfile = "$LogPath\" + "$Datetime" + "_CSCRobocopy.log"

    icacls.exe $icaclsource /reset /T
    icacls.exe $icaclsource /grant :r "Everyone:(OI)(CI)F"

    Robocopy $CSCSource $Dest /Copy:DATSO /E /XO /Z /LOG+:$CSCLogfile /V /FP /NP /R:2 /W:2 /XF "~$*","*.tmp"
}

@Thesle Williams - jeśli sprawdzisz zmienną $ icaclsource z góry, zauważysz, że dodaję „\? \” Przed ścieżką źródłową. Dodając to z przodu, zaakceptuje dłuższe nazwy plików. Jest to również problem, który miałem, ale to rozwiązało! Twoje zdrowie.

Josh

Joshua Biddle
źródło
Witamy w Super User! Informuję tylko, że użytkownicy „pingujący” działają tylko w komentarzach do postów, a nie w rzeczywistych postach. Niestety nie możesz komentować postów innych niż własne lub odpowiedzi na pytania, dopóki nie uzyskasz reputacji 50+ . Zobacz Jak działają komentarze @ odpowiedzi? . Pamiętaj, że nie możesz po prostu pingować w komentarzu. Tylko autor postu i każdy inny użytkownik, który już skomentował.
robinCTS