Каким-то образом я случайно установил все файлы в подпапке «Нет владельца», и я не могу изменить все разрешения. Я могу изменить один вручную, изменив владельца, а затем установив разрешения, но как я могу изменить владельца всех файлов в этом каталоге одновременно?
6 ответов
Чтобы исправить действительно нарушенные права доступа, лучше всего запускать эти две команды одну за другой:
takeown /f "C:\path\to\folder" /r
icacls "C:\path\to\folder" /reset /T
Первый даст вам право владения всеми файлами, однако этого может быть недостаточно, например, если все файлы имеют разрешения на чтение / запись / выполнение, установленные на "Запретить". У вас есть файлы, но вы ничего не можете с ними сделать.
В этом случае запустите вторую команду, которая исправит нарушенные права доступа.
Используйте takeown
из командной строки, чтобы получить право собственности на папку, все ее подпапки и файлы рекурсивно:
takeown /f "c:\folder\subfolder" /r
Это хорошо работает, но если вы не запускаете консоль командной строки от имени администратора, это может привести к сбою файлов, которыми вы не владеете.
Обратите внимание, что cacls устарела (начиная с Windows Vista?) и он советует вам использовать icacls
.
Эта команда рекурсивно сбросит разрешения для папки:
icacls "C:\path\to\folder" /reset /T
Вы можете использовать cacls
из командной строки:
cacls "C:\path\to\folder" /E /T /C /G "Administrator":F
Переключатель /T
позволяет ему функционировать рекурсивно. Замените Administrator
тем пользователем, которому вы хотите дать разрешения.
У меня были проблемы с файлами с очень длинными путями (больше 256 символов). Две команды
takeown /f "C:\path\to\really_long_folder_name" /r
icacls "C:\path\to\really_long_folder_name" /reset /T
работал за исключением этих файлов с очень длинными путями и именами. Я переименовал
"C:\path\to\really_long_folder_name"
в
"C:\path\to\r"
а затем работает
takeown /f "C:\path\to\r" /r /D Y
icacls "C:\path\to\r" /grant Everyone:(F) /t /c /q
после чего я мог бы переименовать папки во что-то более разумное. takeown's / DY отвечает да на запросы. Для icacls я использовал / grant, чтобы дать полный доступ всем (так как я просто пытался получить доступ к данным на жестком диске с мертвого ПК), с / t для обработки подпапок и файлов, / q для запуска в тихом режиме (скрыть успехи) и / с, чтобы показать ошибки. Я повторил процесс, переименовывая папки, пока все права доступа к файлам не были успешно обновлены.
Надеюсь, это поможет кому-то, кто сталкивался с ошибками, похожими на ошибки "не удалось перечислить объекты в доступе к контейнеру", которые я получал при попытке получить доступ к данным со старого жесткого диска.
Спасибо @ this.lau_ за подсказку /reset, это именно то, что мне нужно для завершения моего скрипта, чтобы стать владельцем CSC и сделать его резервную копию. После вступления во владение C:\Windows\CSC разрешения имеют тенденцию становиться очень противоречивыми в отношении наследования - переключатель /reset исправил это прямо для меня.
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 - если вы посмотрите на переменную $ icaclsource сверху, вы заметите, что я добавляю "\?\"перед исходным путем. Добавив это в начало, он примет более длинные имена файлов. Это тоже проблема, которая у меня была, но это исправило! Приветствия.
мистифицировать