Я заметил, что если вы измените настройки безопасности для определенного каталога, вы можете сделать эту папку больше не доступной для просмотра в Windows. В частности, изменение разрешения «Чтение» для администраторов на «Запретить» сделает эту папку недоступной.
Вопрос, который у меня сейчас есть, как мне понять это в коде? Я слежу за мной, но это все равно не так:
/// <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;
}
}
Я близок к вышесказанному, но мне все еще не хватает чего-то огромного. Если щелкнуть правой кнопкой мыши папку, чтобы установить разрешения, я вижу (в моем примере) 3 группы или имена пользователей: «Администраторы, myUserName и SYSTEM». Если я установлю для параметра «Чтение» значение «Запретить» для «Администраторы» или «myUserName», я больше не смогу просматривать каталог. Если я только установлю «Система» на «Запретить», я все равно смогу просмотреть его.
Кажется, что подразумевается какая-то иерархия разрешений, в которой myUserName или Administrator заменяют группу / пользователя SYSTEM.
Приведенный выше код ищет первое «Разрешить» для «Чтение», которое он находит для моей идентификации пользователя и возвращает true. Я также мог бы написать код, который ищет первое «Deny» для Read и возвращает false.
Я могу установить папку «Чтение» - «Запретить» для SYSTEM и «Чтение» - «Разрешить» для двух других учетных записей и при этом читать папку. Если я изменю код для поиска Deny's, и он сначала встретится с идентификатором пользователя SYSTEM, моя функция вернет «false», что ... false. Это вполне может быть прочитано - «Разрешить» для двух других учетных записей.
Проблема, которую я до сих пор не могу понять, заключается в том, как определить, какое разрешение на идентификацию пользователя имеет приоритет над всеми остальными?