回答:
本当に壊れた権限を修正するには、次の2つのコマンドを順番に実行するのが最善です。
takeown /f "C:\path\to\folder" /r
icacls "C:\path\to\folder" /reset /T
最初のファイルはすべてのファイルの所有権を提供しますが、たとえば、すべてのファイルの読み取り/書き込み/実行権限が「拒否」に設定されている場合は、十分ではない場合があります。あなたはファイルを所有していますが、それでも何もできません。
その場合、2番目のコマンドを実行すると、壊れたアクセス許可が修正されます。
/D Y
パラメータを追加して、takeown
「リストディレクトリ」権限を持たない再帰ディレクトリを自動確認するようにしました。
/D Y
フランス語/D O
、おそらくスペイン語/D S
などにローカライズされたパラメーターであるので(十分に)編集を削除しましたが、良いアドバイスですが
パスが非常に長い(256文字を超える)ファイルで問題が発生しました。2つのコマンド
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の/ DYはプロンプトに対してyesと答えます。icaclsでは、/ grantを使用してすべてのユーザーに完全なアクセス権を与えました(デッドPCからハードドライブ上のデータにアクセスしようとしていたため)。/tでサブフォルダーとファイルを処理し、/ qでQuietモードで実行成功)および/ cエラーを表示します。すべてのファイルのアクセス許可が正常に更新されるまで、フォルダーの名前を変更して、プロセスを繰り返しました。
これは、古いハードドライブからデータにアクセスしようとしたときに発生した「コンテナアクセス内のオブジェクトの列挙に失敗しました」エラーに類似したエラーに遭遇した人の助けになることを願っています。
/ resetのヒントをくれた@ this.lau_に感謝します。これは、スクリプトを完成させて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変数をチェックアウトすると、ソースパスの前に「\?\」が追加されていることがわかります。これを先頭に追加すると、より長いファイル名が受け入れられます。これも私が抱えていた問題ですが、これで解決しました!乾杯。
ジョシュ