読み取りビットをクリアせずにファイルへのリンクを削除します
-
27-09-2019 - |
質問
複数のリンクを備えたファイルのセットがあります。
ファイルはTFSソースコントロールが所有していますが、それらへの他のリンクが作成されます。読み取りビットをクリアせずに追加のリンクを削除するにはどうすればよいですか。
想定するのは安全です:
- ファイルには複数のリンクがあります
- TFSが所有する名前を削除していません
- 潜在的な人種条件はありません
- ファイルのACLフルコントロールがあります
- マシンは電力を失うことはなく、プログラムが時間がかかりすぎない限り、プログラムを殺すこともありません。
想定するのは安全ではありません:
- readonlyビットが設定されます(そうでない場合は設定しないでください)
- エラーが発生した場合、最初に設定された場合、Readonlyを少し明確にしておくことができます
スーパーユーザーに移行しないでください - そこに移住した場合、標準ツールがこれを行うことができないため、答えは不可能です。
ファイルを削除するためにファイルに書き込み許可を必要とする仮想 *nixシステムには、fchmod()を含むソリューションがあります。ただし、この動作を示すシステムはWindowsシステムです。
解決
管理者が多くのセキュリティチェックを緩和できるようにするSebackupprivilegeとSerestorePrivilegeを有効にしてみましたか?
あなたが見つけるかもしれません このニュースグループスレッド 役に立った。
編集:特権なしで、そしてレース条件を作成することなくそれを行うには、Vista以上にトランザクションNTFSサポートが存在する必要があります。ところで、ハンドルを使用して属性を設定することができます。 setfileinformationbyhandle, 、取引することができます、メモを参照してください。または、findFirstFileNameを使用して、削除されていない同じファイルへの別のハードリンクを見つけることができます。
他のヒント
ベン・ヴォイトに感謝:
#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);
}
}
}
これは不可能です。ハードリンクは、ファイルの別の名前にすぎません。多くのハードリンクを持つことができますが、基礎となるファイルオブジェクト(データ、セキュリティ記述子、属性、ファイル時間など)は1つだけです。ファイルオブジェクトに読み取り専用属性セットがある場合、定義によるハードリンクには属性も設定されます。