Traitée Droit d'accés sur un disque dur XP

  • lundi 5 décembre 2011 16:57
    Auteur de réponse
     
      A du code

     

    Bonjour,

    J'ai besoin de rendre accessible à tous les utilisateurs (Groupe TOUT LE MONDE), le contenu complet d'un disque dur amovible, en écriture comme en lecture: Windows XP ne gère pas par défaut les options de sécurité des fichiers.

    Et Windows 7 restreint l’accès aux fichiers, parfois aucun utilisateur hormis l'Administrateur ne peuvent avoir accès à ces fichiers.

     

    Utilisation de fonctions C++ du compilateur Visual Studio PRO (2003 ou 2010) compatibles Windows XP et Windows 7.


    AJOUT QUELQUES PRECISIONS:

    L'architecture du disque dur est basé sur le système de fichiers NTFS: Je créé entièrement l'ensemble des dossiers, dans lesquels je copie des fichiers de données ( aucun executable ). Le disque dur n'est pas un disque bootable.

    J'utilise la fonction:

    BOOL CreateDirectory(
      LPCTSTR lpPathName ,
      LPSECURITY_ATTRIBUTES lpSecurityAttributes 
    );
    

    En faisant appel à cette structure, est-il possible d'attribuer des droits d'accés pour tous hérités et donc transférés à tous les fichiers qui seront mis dans ce dossier ?

Toutes les réponses

  • mardi 6 décembre 2011 09:35
    Modérateur
     
     

    De mémoire, WindowsXP gère les options de sécurité sur des files systems NTFS mais pas sur des files systems FAT.

    Le HD est-il formaté NTFS ?

    C'est con comme question, mais on a souvent la vue base quand on a la tête dans le guidon.


    Paul Bacelar, Ex - MVP VC++
  • mardi 6 décembre 2011 13:04
    Auteur de réponse
     
     
    OUI c'est bien un système de fichiers NTFS.
    Delphine GARRO
  • jeudi 8 décembre 2011 10:28
    Modérateur
     
     

    Cet article m'avait appris beaucoup de choses sur l'héritage des droits.

    http://msdn.microsoft.com/en-us/magazine/cc163885.aspx


    Paul Bacelar, Ex - MVP VC++
  • vendredi 9 décembre 2011 17:24
    Auteur de réponse
     
     
    Merci pour cette documentation détaillée et très complète ( j'ai beaucoup de lecture). Je vais l'étudier et je vous tiens au courant des évolutions
    Delphine GARRO
  • mardi 17 janvier 2012 13:52
    Auteur de réponse
     
     

    En lisant l'article, j'ai écris ces quelques lignes de code tentant de donner les droits d'accés en lecture à TOUS LES UTILISATEURS ( Groupe "Tout le monde" ) au dossier J:\R001-025 : 

     

     

     DirectoryInfo^ dInfo = gcnew DirectoryInfo("J:\R001-025");

     DirectorySecurity^ dSecurity = dInfo->GetAccessControl();

     dSecurity->AddAccessRule( gcnew FileSystemAccessRule("Everyone", FileSystemRights::ReadData, AccessControlType::Allow));

        // Set the new access settings.

        dInfo->SetAccessControl(dSecurity);

    Mais cela ne marche pas? Ni sous XP, ni sous Windows 7 sur un compte administrateur, ou Super Administrateur.
    Compilateur VisualC++ 2010 avec .net Framework 4.0, projet MFC.
    La fonction GetAccessControl échoue. Alors que faire ?

     


    Delphine GARRO


  • mardi 17 janvier 2012 18:10
    Modérateur
     
     

    Attention à la gestion complexe de la sécurité sous .NET.

    L'endroit d'où est lancé, et comment est lancé, le programme influe sur le contexte de sécurité du programme.

    - via un partage ? etc...

    - depuis un service ? dans IIS etc...

     

    Quelle est l'exception levée par GetAccessControl ?


    Paul Bacelar, Ex - MVP VC++
  • mercredi 18 janvier 2012 09:14
    Auteur de réponse
     
     

    Le disque dur est relié au PC par USB, ce n'est pas un disque partagé en réseau: j'y accéde directement comme un disque local.

     

    Sous Windows 7, l'appel à GetAcceesControl semble mettre l'application dans un état tel, qu'en mode débugger sous VisualC++, i lest possible d'arrêter le débogage sans arrêter l'application, qui ne peut pas être non plus "tuée" par le gestionnaire de tâche.

     

    Je suis retournée sous Windows XP PRO SP3 avec .Net Framework 4.0 .

    J'ai modifié le code comme suit:

    DirectoryInfo^ dInfo = gcnew DirectoryInfo("J:\\R001-025");

     

    if( dInfo->Exists )

    {

    DirectorySecurity^ dSecurity = dInfo->GetAccessControl();

     

    dSecurity->AddAccessRule( gcnew FileSystemAccessRule( "Everyone", FileSystemRights::ReadData, AccessControlType::Allow));

     

        // Set the new access settings.

        dInfo->SetAccessControl(dSecurity);

    }

     

    Si je ne fais pas appel à la fonction AddAccessRule, il n'y a aucun message d'erreur.

    L'appel à la fonction AddAccessRule génére l'erreur suivante dans une petite fenêtre qui s'ouvre hors application et hors compilateur:

    Une exception non gérée du type 'System.Security.Principal.IdentityNotMappedException' s'est produite dans mscorlib.dll

    Informations supplémentaires : Impossible de traduire certaines ou toutes les références d'identité.

    Je pense que le compte TOUT LE MONDe ne s'intitule pas "Everyone" ?


    Delphine GARRO
  • mercredi 18 janvier 2012 09:36
    Modérateur
     
     

    Pour les problèmes de sécurité .NET, je parlais de l'emplacement du programme et pas du fichier que le programme utilise.

    Passer par un lecteur mappé, même sur un répertoire local entraîne des restrictions de sécurité.

    Pour le problème de "Everyone"

    http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/dc841874-b71b-4e1c-9052-06eb4a87d08f/

     

    P.S.: attention au \\ et \


    Paul Bacelar, Ex - MVP VC++
  • mercredi 18 janvier 2012 13:48
    Auteur de réponse
     
     Traitée

     

    Les pages cités sont codées en VisualBasic donc difficilement exploitables et ne semblent pas comporter la solution pour du code en C++.

     

    VOICI la solution trouvée, pour autoriser l’accès complet à tous les fichiers d'un dossier pour TOUT LE MONDE .

     

     

     

     DirectoryInfo^ dInfo = gcnew DirectoryInfo(  "J:\\R001-025" );

     

     SecurityIdentifier^ CompteTousLeMonde = gcnew SecurityIdentifier( "WD" ); 

     

     if( dInfo->Exists )

     {

     DirectorySecurity^ dSecurity = dInfo->GetAccessControl();

     

     dSecurity->AddAccessRule( gcnew FileSystemAccessRule( CompteTousLeMonde , FileSystemRights::FullControl /*ReadData */, InheritanceFlags::ObjectInherit , PropagationFlags::None, AccessControlType::Allow));

     

        // Set the new access settings.

        dInfo->SetAccessControl(dSecurity);

     }

     

     

     

    Pour  autoriser l’accès en lecture seule à tous les fichiers d'un dossier pour TOUT LE MONDE: il suffit de remplacer le flag FullControl  par ReadData .

     

     

    Résultat:

    Le dossier "J:\\R001-025" a pour attribut autorisations spéciales. Tous les fichiers qu'il contient, sont "accessibles par TOUT LE MONDE", et les nouveaux fichiers copiés dans ce dossier héritent de cette caractéristique "accessibles par TOUT LE MONDE"

     

     

    Liens utiles:

    Liste des comptes Windows - SID Strings: http://msdn.microsoft.com/en-us/library/windows/desktop/aa379602(v=vs.85).aspx

     

    Control d'accés: http://msdn.microsoft.com/fr-fr/library/w4ds5h86.aspx

    Droits d'accés: http://msdn.microsoft.com/fr-fr/library/system.security.accesscontrol.filesystemrights.aspx

     

     

    FileSystemAccessRule Constructor:

     

    http://msdn.microsoft.com/en-us/library/system.security.accesscontrol.filesystemaccessrule.filesystemaccessrule.aspx