Ho notato che se si modificano le impostazioni di sicurezza per una determinata directory, è possibile rendere tale cartella non più "sfogliabile" in Windows. In particolare, la modifica dell'autorizzazione "Lettura" per gli amministratori su "Nega" renderà inaccessibile quella cartella.Leggi autorizzazioni per una directory in C#
La domanda che ho ora, è come faccio a capirlo nel codice? I seguente ottiene me vicino, ma non è ancora quello giusto:
/// <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;
}
}
sono vicino con quanto sopra, ma mi manca ancora qualcosa di enorme. Se faccio clic destro su una cartella per impostare le autorizzazioni, vedo (nel mio esempio) 3 gruppi o nomi utente: "Administrators, myUserName e SYSTEM". Se imposto "Leggi" su Nega per "Amministratori" o "Nomeutente", non riesco più a sfogliare la directory. Se imposto solo "Sistema" su "Nega", posso ancora sfogliarlo.
Sembra esserci una sorta di gerarchia di autorizzazioni implicita, dove myUserName o Administrator sostituisce il gruppo/utente SYSTEM.
Il codice sopra cerca il primo permesso per "lettura" che trova per la mia identità utente e restituisce true. Potrei anche scrivere il codice che cerca il primo "Nega" per Read e restituisce false.
Posso impostare una cartella da leggere - "Nega" per SISTEMA e leggi - "Consenti" per gli altri due conti e leggere ancora la cartella. Se cambio il codice per cercare Deny e incontra prima l'identità dell'utente SYSTEM, la mia funzione restituirà "false", che è ... false. Potrebbe benissimo leggere "Consenti" per gli altri due account.
Il problema che ancora non riesco a capire è, come posso determinare quale autorizzazione di identità utente ha la priorità su tutti gli altri?
L'account SYSTEM è solo un account normale, non trattarlo in modo specifico. È usato dai servizi. –