Droit d'accés sur un disque dur XP
-
lundi 5 décembre 2011 16:57Auteur de réponse
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 ?
- Modifié GARRO DelphineEditor mardi 6 décembre 2011 14:09 Ajout QUELQUES PRECISIONS
Toutes les réponses
-
mardi 6 décembre 2011 09:35Modé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:04Auteur de réponseOUI c'est bien un système de fichiers NTFS.
Delphine GARRO -
jeudi 8 décembre 2011 10:28Modé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++- Proposé comme réponse Ciprian Duduiala jeudi 8 décembre 2011 14:49
- Marqué comme réponse Ciprian Duduiala lundi 12 décembre 2011 07:14
- Non marqué comme réponse GARRO DelphineEditor mardi 17 janvier 2012 13:46
- Non proposé comme réponse GARRO DelphineEditor mardi 17 janvier 2012 13:52
-
vendredi 9 décembre 2011 17:24Auteur de réponseMerci 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:52Auteur 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
- Modifié GARRO DelphineEditor mardi 17 janvier 2012 13:54
- Modifié GARRO DelphineEditor mardi 17 janvier 2012 16:42
- Modifié GARRO DelphineEditor mardi 17 janvier 2012 17:41
-
mardi 17 janvier 2012 18:10Modé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:14Auteur 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:36Modé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:48Auteur de réponse
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- Modifié GARRO DelphineEditor mercredi 18 janvier 2012 14:33
- Modifié GARRO DelphineEditor mercredi 18 janvier 2012 14:50
- Modifié GARRO DelphineEditor mercredi 18 janvier 2012 15:00
- Modifié GARRO DelphineEditor mercredi 18 janvier 2012 15:34 Ajout case AUTORISATION SPECIALE cochée
- Modifié GARRO DelphineEditor mercredi 18 janvier 2012 15:35
- Modifié GARRO DelphineEditor mercredi 18 janvier 2012 15:35 case AUTORISATION SPECIALE cochée
- Modifié GARRO DelphineEditor mercredi 18 janvier 2012 17:22 LA SOLUTION
- Marqué comme réponse GARRO DelphineEditor mercredi 18 janvier 2012 17:22
- Modifié GARRO DelphineEditor vendredi 20 janvier 2012 10:14 Ajout liens utiles...
- Modifié GARRO DelphineEditor vendredi 20 janvier 2012 10:15 Ajout liens utiles...

