4

複数のリンクを含む一連のファイルがあります。

ファイルは TFS ソース管理によって所有されていますが、それらへの他のリンクが作成されています。読み取り専用ビットをクリアせずに追加のリンクを削除するにはどうすればよいですか。

仮定するのは安全です:

  • ファイルには複数のリンクがあります
  • TFSが所有する名前を削除していません
  • 潜在的な競合状態はありません
  • ファイルに対する ACL の完全な制御権を持っている
  • 時間がかかりすぎない限り、マシンの電源が失われることはなく、プログラムが強制終了されることもありません。

仮定するのは安全ではありません:

  • 読み取り専用ビットが設定されている (設定されていない場合は設定しないでください)
  • エラーが発生し、最初に設定されていた場合は、読み取り専用ビットをクリアのままにしておくことができます

スーパーユーザーに移行しないでください。そこに移行した場合、これを実行できる標準ツールがないため、答えは不可能です。

ファイルを削除するためにファイルへの書き込み許可が必要な架空の *nix システムでは、fchmod() を使用した解決策があります。ただし、この動作を示すシステムは Windows システムです。

4

3 に答える 3

4

Ben Voigt に感謝:

#include <windows.h>

int main(int argc, char **argv)
{
    while (*++argv) {
        HANDLE h;
        DWORD attrs;

        attrs = GetFileAttributes(*argv);
        SetFileAttributes(*argv, attrs & ~FILE_ATTRIBUTE_READONLY);
        h = CreateFile(*argv, GENERIC_READ|GENERIC_WRITE, 7, NULL, OPEN_EXISTING,
                    FILE_FLAG_DELETE_ON_CLOSE, NULL);
        SetFileAttributes(*argv, attrs);
        if (h != INVALID_HANDLE_VALUE) {
            CloseHandle(h);
        }
    }
}
于 2010-06-28T23:27:28.607 に答える
4

SeBackupPrivilege と SeRestorePrivilege を有効にしてみましたか?これにより、管理者は多くのセキュリティ チェックを緩和できますか?

このニュースグループのスレッドが役に立つかもしれません。

編集:特権なしで競合状態を作成せずにそれを行うには、Vista 以降に存在するトランザクション NTFS サポートが必要です。ところで、ハンドルを使用して属性を設定し、処理できる FILE_BASIC_INFO をSetFileInformationByHandleに渡すことができます。注を参照してください。または、FindFirstFileName を使用して、削除されていない同じファイルへの別のハード リンクを見つけて、読み取り専用に設定することもできます。

于 2010-06-18T04:11:33.137 に答える
2

これは不可能です。ハードリンクはファイルの単なる別名です。多くのハードリンクを持つことができますが、基礎となるファイルオブジェクト(データ、セキュリティ記述子、属性、ファイル時間など)は1つだけです。ファイルオブジェクトに読み取り専用の属性が設定されている場合、定義上、ハードリンクにも属性が設定されます。

于 2010-06-18T03:14:21.687 に答える