L'introduzione della UAC di Windows Vista ha reso necessaria, tra le altre cose, una maggiore attenzione alla posizione in cui i programmi salvano le proprie impostazioni: questo perché, ad esempio, lo standard user non ha i diritti di scrittura nella cartella C:\Program Files. La seguente routine permette di sapere se l'utente dispone di determinati diritti sul file specificato:
public bool HasPermission(string fileName, FileSystemRights rights)
{
bool deny = false, allow = false;
WindowsIdentity identity = WindowsIdentity.GetCurrent();
FileInfo fi = new FileInfo(fileName);
AuthorizationRuleCollection acl = fi.GetAccessControl().GetAccessRules(true, true, typeof(SecurityIdentifier));
for (int i = 0; i < acl.Count; i++)
{
FileSystemAccessRule rule = (FileSystemAccessRule)acl[i];
if (identity.User.Equals(rule.IdentityReference))
{
if (AccessControlType.Deny.Equals(rule.AccessControlType))
{
if ((rule.FileSystemRights & rights) == rights)
deny = true;
}
else if (AccessControlType.Allow.Equals(rule.AccessControlType))
{
if ((rule.FileSystemRights & rights) == rights)
allow = true;
}
}
}
IdentityReferenceCollection groups = identity.Groups;
for (int j = 0; j < groups.Count; j++)
{
for (int i = 0; i < acl.Count; i++)
{
FileSystemAccessRule rule = (FileSystemAccessRule)acl[i];
if (groups[j].Equals(rule.IdentityReference))
{
if (AccessControlType.Deny.Equals(rule.AccessControlType))
{
if ((rule.FileSystemRights & rights) == rights)
deny = true;
}
else if (AccessControlType.Allow.Equals(rule.AccessControlType))
{
if ((rule.FileSystemRights & rights) == rights)
allow = true;
}
}
}
}
return !deny && allow;
}
Utilizzando questo codice, per sapere se l'utente ha il diritto di scrittura su un file basta scrivere qualcosa del tipo:
bool permesso = HasPermission(fileName, FileSystemRights.Write);
if (permesso)
MessageBox.Show("Hai i diritti di scrittura sul file.");
else
MessageBox.Show("Non hai i diritti di scrittura sul file.");