Pregunta

Tengo un conjunto de archivos con múltiples enlaces a ellos.

Los archivos son propiedad de control de la fuente de TFS, pero otros enlaces a los mismos están hechos para ellos. ¿Cómo puedo eliminar los enlaces adicionales sin borrar el bit de sólo lectura.

Es seguro asumir:

  • Los archivos tienen más de un enlace a ellos
  • No está borrando el nombre de propiedad de TFS
  • No hay condiciones de carrera potenciales
  • Usted tiene el control total de ACL de los archivos
  • La máquina va a poder no perder, ni su programa de matar a no ser que se tarda demasiado tiempo.

No es seguro asumir:

  • El bit de sólo lectura se establece (no la coloque si su no)
  • Se puede dejar el sólo lectura poco claro si se produce un error y se fijó inicialmente

No migre a superusuario -. Si emigrado allí la respuesta es imposible porque ninguna herramienta estándar puede hacer esto

En un sistema * nix hipotético en el que uno necesita permiso de escritura en un archivo para eliminarlo, hay una solución que implica fchmod (). Sin embargo, el sistema que exhiben este comportamiento es un sistema de Windows.

¿Fue útil?

Solución

¿Usted ha intentado que permite SeBackupPrivilege y SeRestorePrivilege, que permiten a los administradores para relajarse muchos de los controles de seguridad?

este hilo grupo de noticias útiles.

EDIT: Para hacerlo sin privilegios y sin crear una condición de carrera, tendrá que soporte NTFS transaccional presente en Vista y superiores. Por cierto, se puede establecer atributos usando un mango, pase a FILE_BASIC_INFO SetFileInformationByHandle , que puede ser tramitado, consulte las notas. O puede utilizar FindFirstFileName encontrar otro enlace duro en el mismo archivo que no está siendo borrado, con el que conjunto de sólo lectura.

Otros consejos

Gracias 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);
        }
    }
}

Esto no es posible. Un vínculo físico es sólo otro nombre para un archivo; usted puede tener muchos enlaces duros, pero sólo hay un objeto de archivos subyacente (datos, descriptor de seguridad, atributos, tiempos de archivo, etc). Si el objeto de archivo tiene el atributo de sólo lectura conjunto, a continuación, los enlaces duros, por definición, también tendrán el conjunto de atributos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top