web-dev-qa-db-ja.com

再帰的にオーナーウィンドウを変更する7

どういうわけか私は誤ってサブフォルダ内のすべてのファイルを "所有者なし"に設定していて、すべてのアクセス許可を変更できないようです。すぐにこのディレクトリに?

92
user3109

コマンドPromptから takeown を使用して、所有権をフォルダ、そのすべてのサブフォルダとファイルに再帰的に割り当てます。

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

これはうまく機能しますが、管理者としてコマンドラインコンソールを実行しないと、所有していないファイルでは失敗する可能性があります。

89
Kez

本当に壊れた権限を修正するには、次の2つのコマンドを順番に実行するのが最善です。

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

最初のものはあなたにすべてのファイルの所有権を与えるでしょう、しかし、それは十分でないかもしれません、例えば、すべてのファイルが "deny"に設定されたread/write/execパーミッションを持っているなら。あなたはファイルを所有していますが、それでもそれを使って何かをすることはできません。

その場合は、2番目のコマンドを実行して、壊れた権限を修正します。

102
laurent

Caclsは(Windows Vista以降では)廃止予定であり、 icacls を使用することをお勧めします。

このコマンドはフォルダのアクセス権を再帰的にリセットします。

icacls "C:\path\to\folder" /reset /T
26
therefromhere

コマンドプロンプトから cacls を使用できます。

cacls "C:¥path¥to¥folder"/E/T/C/G "管理者":F

/Tスイッチは再帰的に機能することを可能にします。 Administratorを、許可を与えたいユーザーに置き換えます。

5
John T

パスが非常に長い(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's/D Yプロンプトにyesと答えます。 icaclsのために/ grantを使って全員にフルアクセスを与えました(死んだPCからハードドライブ上のデータにアクセスしようとしていたので)、/ tでサブフォルダとファイルを処理し、/ qでクワイエットモードで実行(hide)成功)と/ cエラーを表示します。このプロセスを繰り返し、すべてのファイルのアクセス許可が正常に更新されるまでフォルダーの名前を変更しました。

うまくいけば、これは古いハードドライブからデータにアクセスしようとしたときに私が得ていた「コンテナアクセスのオブジェクトを列挙できなかったことは拒否されました」エラーのようなエラーに遭遇した誰かに役立ちます。

1
Thesle Williams

/ 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変数をチェックアウトすると、ソースパスの前に "\?\"を追加したことに気付くでしょう。先頭にこれを追加することで、より長いファイル名を受け入れます。これも私が抱えていた問題ですが、これで解決しました!乾杯。

ジョシュ

0
Joshua Biddle