Domanda

Ho una serie di file con collegamenti multipli a loro.

I file sono di proprietà di controllo del codice sorgente TFS ma altri collegamenti a loro sono fatti per loro. Come faccio a cancellare i link aggiuntivi senza cancellare il bit di sola lettura.

E 'lecito ritenere:

  • I file hanno più di un link a loro
  • Non si elimina il nome di proprietà di TFS
  • Non ci sono condizioni possibili race
  • Hai il pieno controllo ACL per i file
  • La macchina di alimentazione non perdere, né il programma di essere ucciso a meno che non ci vuole troppo tempo.

Non è lecito ritenere:

  • viene impostato il bit di sola lettura (non impostare, se non la sua)
  • È possibile lasciare la sola lettura po 'chiaro se si verifica un errore ed è stato inizialmente impostato

non migrano a superuser -. Se la migrazione c'è la risposta è impossibile perché nessuno strumento standard può fare questo

In un ipotetico sistema * nix, in cui si ha la necessità di scrittura per un file per eliminarlo, c'è una soluzione che coinvolge fchmod (). Tuttavia, il sistema che presenta questo comportamento è un sistema Windows.

È stato utile?

Soluzione

Hai provato consentendo SeBackupPrivilege e SeRestorePrivilege, che consentono agli amministratori di rilassarsi molti dei controlli di sicurezza?

Si potrebbe trovare questa discussione newsgroup utile.

EDIT: Per farlo senza privilegi, e senza creare una condizione di competizione, è necessario transazionale supporto NTFS presente in Vista e sopra. A proposito, è possibile impostare gli attributi utilizzando una maniglia, passare FILE_BASIC_INFO a SetFileInformationByHandle , che possono essere scambiati, vedere le note. Oppure è possibile utilizzare FindFirstFileName di trovare un altro hard link allo stesso file che non viene cancellato, con il quale insieme di sola lettura.

Altri suggerimenti

Grazie a 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);
        }
    }
}

Questo non è possibile. Un collegamento fisso è solo un altro nome per un file; si può avere molti collegamenti duri, ma c'è solo un oggetto file sottostante (dati, descrittore di protezione, gli attributi, tempi di file, ecc). Se l'oggetto file ha l'attributo di sola lettura impostato, allora qualsiasi hard link per definizione avranno anche il set di attributi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top