J'ai remarqué que si vous modifiez les paramètres de sécurité pour un répertoire particulier, vous pouvez rendre ce dossier non plus "navigable" dans Windows. En particulier, la modification de l'autorisation "Lire" pour les administrateurs à "Refuser" rendra ce dossier inaccessible.Lire Autorisations à un répertoire en C#
La question que j'ai maintenant, est comment puis-je comprendre cela dans le code? Je me suivant se rapproche, mais il est toujours pas droit:
/// <summary>
/// Takes in a directory and determines if the current user has read access to it (doesn't work for network drives)
/// THIS IS VERY HACKY
/// </summary>
/// <param name="dInfo">directoryInfo object to the directory to examine</param>
/// <returns>true if read access is available, false otherwise</returns>
public static bool IsDirectoryReadable(DirectoryInfo dInfo)
{
try
{
System.Security.AccessControl.DirectorySecurity dirSec = dInfo.GetAccessControl();
System.Security.Principal.WindowsIdentity self = System.Security.Principal.WindowsIdentity.GetCurrent();
System.Security.Principal.WindowsPrincipal selfGroup = new System.Security.Principal.WindowsPrincipal(self);
// Go through each access rule found for the directory
foreach (System.Security.AccessControl.FileSystemAccessRule ar in dirSec.GetAccessRules(true, true, typeof(System.Security.Principal.SecurityIdentifier)))
{
if (selfGroup.IsInRole((System.Security.Principal.SecurityIdentifier)ar.IdentityReference))
{
// See if the Read right is included
if ((ar.FileSystemRights & System.Security.AccessControl.FileSystemRights.Read) == System.Security.AccessControl.FileSystemRights.Read)
{
if (ar.AccessControlType == System.Security.AccessControl.AccessControlType.Allow)
{
// If all of the above are true, we do have read access to this directory
return true;
}
else
{
return false;
}
}
}
}
// If we didn't find anything
return false;
}
catch
{
// If anything goes wrong, assume false
return false;
}
}
Je suis étroite avec ce qui précède, mais je manque encore quelque chose d'énorme. Si je fais un clic droit sur un dossier pour définir les permissions, je vois (dans mon exemple) 3 groupes ou noms d'utilisateurs: "Administrators, myUserName et SYSTEM". Si je mets le "Read" à Deny pour "Administrators" ou "myUserName" je ne peux plus parcourir le répertoire. Si je ne mets que "System" à "Deny", je peux toujours le parcourir.
Il semble y avoir une sorte de hiérarchie d'autorisations implicite, où myUserName ou Administrator remplace le groupe/utilisateur SYSTEM.
Le code ci-dessus recherche le premier Autoriser pour "Lire" il trouve pour mon identité d'utilisateur et renvoie true. Je pourrais aussi écrire du code qui cherche le premier "Deny" pour Read et retourne false.
Je peux définir un dossier à lire - "Refuser" pour SYSTEM et Lire - "Autoriser" pour les deux autres comptes et toujours lire le dossier. Si je change le code pour rechercher Deny et qu'il rencontre d'abord l'identité de l'utilisateur SYSTEM, ma fonction retournera "false", qui est ... false. Il pourrait très bien être lu - "Autoriser" pour les deux autres comptes. Le problème que je n'arrive toujours pas à comprendre est, comment puis-je déterminer quelle permission d'identité d'utilisateur a la priorité sur tous les autres?
Le compte SYSTEM est juste un compte normal, ne le traitez pas spécialement. Il est utilisé par les services. –