[C#] : Tester les droits d'accès d'un répertoire
Bonjour,
je souhaiterais tester les droits d'accès et d'écriture dans un répertoire.
Je n'y parviens pas. Pouvez-vous m'aider ?
Dans mes tentatives j'ai essayé d'utiliser
Code:
DirectorySecurity dSecurity = new DirectoryInfo("myPath").GetAccessControl()
mais je ne sais pas quoi faire après.
Merci et bonne journée.
je n'ai pas été très bon sur les deux messages précédents
Alors oubiez-les et excusez un débutant sur ce forum
Le code suivant fontionne bien pour le logiciel dont j'avais besoin, mais soyez critiques et adaptez à vos situations.
moiMeme doit être accessible à la métohode appelée. Dans mon cas, moiMeme est dans un classe renfermant les paramètres principaux du logiciel.
fullname a été initialisé avec le nom du fichier ou dossier obtenu par un
Directory.GetFileSystemEntries
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| //récupération de mon compte utilisateur actuel
System.Security.Principal.WindowsIdentity moiMeme=System.Security.Principal.WindowsIdentity.GetCurrent();
//appel de la méthode
if (!IsAutorise(fullname, FileSystemRights.Read|FileSystemRights.ListDirectory))
public static bool IsAutorise(string fullName, FileSystemRights droitMini)
{//si moi-même ou un groupe auquel j'appartiens a les autoriastions demandées sans qu'elles soient explicitement refusées c'est OK
//mais si l'un deux refuse explicitement une des autorisations c'est refusé
bool accorde=false;
try
{ //extraire les droits ou refus explicitement donnés pour moi-même en extrayant par WindowsIdentity.User (S-1-5-21-1824....) et non par WindowsIdentity.Name (PCTOTO\MACHIN)
FileSystemSecurity accessControlList=File.GetAccessControl(fullName);
AuthorizationRuleCollection rules=accessControlList.GetAccessRules(true, true, typeof(SecurityIdentifier));//typeof S-1-5-21-1824....
//examen des droits d'accès explicitement donnés à moi-même
foreach (FileSystemAccessRule rule in rules)
{
if (rule.IdentityReference.Value.Equals(moiMeme.User.Value, StringComparison.CurrentCultureIgnoreCase))
{//j'ai des autoriastions ou refus explicitement donnés
if (rule.AccessControlType==AccessControlType.Allow&&rule.FileSystemRights.HasFlag(droitMini)) { accorde=true; } //dispose des permissions demandées
if (rule.AccessControlType==AccessControlType.Deny&&rule.FileSystemRights.HasFlag(droitMini)) { return false; } //permissions demandées refusées
}
}
//exament des groupes auxquels j'appartiens
foreach (IdentityReference groupe in ParamSession.principal.Groups)
{
foreach (FileSystemAccessRule rule in rules)
{
if (groupe.Equals(rule.IdentityReference))
{
if (rule.AccessControlType==AccessControlType.Allow&&rule.FileSystemRights.HasFlag(droitMini)) { accorde=true; } //dispose des permissions demandées
if (rule.AccessControlType==AccessControlType.Deny&&rule.FileSystemRights.HasFlag(droitMini)) { return false; } //permissions demandées refusées
}
}
}
return accorde;
}
catch (UnauthorizedAccessException) { return false; }//interdiction totale y compris le regard sur les droits d'accès
} |