Я хочу написать код, который проверяет наличие разрешений для общего каталога, я проверяю несколько решений, но он работает хорошо при попытке получить разрешение локального каталога, но когда я делаю тестовые примеры для общих каталогов, выходит из строя.Проверка разрешения для общего доступа к каталогу - C#
Я пытаюсь примеры в этом вопросы: SOF: checking-for-directory-and-file-write-permissions-in-net
, но он работает только в локальных каталогах.
Например, я использовал этот класс:
public class CurrentUserSecurity
{
WindowsIdentity _currentUser;
WindowsPrincipal _currentPrincipal;
public CurrentUserSecurity()
{
_currentUser = WindowsIdentity.GetCurrent();
_currentPrincipal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
}
public bool HasAccess(DirectoryInfo directory, FileSystemRights right)
{
// Get the collection of authorization rules that apply to the directory.
AuthorizationRuleCollection acl = directory.GetAccessControl()
.GetAccessRules(true, true, typeof(SecurityIdentifier));
return HasFileOrDirectoryAccess(right, acl);
}
public bool HasAccess(FileInfo file, FileSystemRights right)
{
// Get the collection of authorization rules that apply to the file.
AuthorizationRuleCollection acl = file.GetAccessControl()
.GetAccessRules(true, true, typeof(SecurityIdentifier));
return HasFileOrDirectoryAccess(right, acl);
}
private bool HasFileOrDirectoryAccess(FileSystemRights right,
AuthorizationRuleCollection acl)
{
bool allow = false;
bool inheritedAllow = false;
bool inheritedDeny = false;
for (int i = 0; i < acl.Count; i++)
{
FileSystemAccessRule currentRule = (FileSystemAccessRule)acl[i];
// If the current rule applies to the current user.
if (_currentUser.User.Equals(currentRule.IdentityReference) ||
_currentPrincipal.IsInRole(
(SecurityIdentifier)currentRule.IdentityReference))
{
if (currentRule.AccessControlType.Equals(AccessControlType.Deny))
{
if ((currentRule.FileSystemRights & right) == right)
{
if (currentRule.IsInherited)
{
inheritedDeny = true;
}
else
{ // Non inherited "deny" takes overall precedence.
return false;
}
}
}
else if (currentRule.AccessControlType
.Equals(AccessControlType.Allow))
{
if ((currentRule.FileSystemRights & right) == right)
{
if (currentRule.IsInherited)
{
inheritedAllow = true;
}
else
{
allow = true;
}
}
}
}
}
if (allow)
{ // Non inherited "allow" takes precedence over inherited rules.
return true;
}
return inheritedAllow && !inheritedDeny;
}
}
Это проверить разрешение текущего олицетворения на директории или файла. Все тестовые примеры проходят правильно при проверке локального каталога, но некоторые из них терпят неудачу в общем каталоге, который является проблемой, которую я хочу решить, так ли какое-либо решение для этого?
Ниже тест не удается, хотя этот каталог не имеет разрешения на запись:
[TestMethod]
public void HasAccess_NotHaveAccess_ReturnsFalse()
{
CurrentUserSecurity cus = new CurrentUserSecurity();
bool result = cus.HasAccess(new DirectoryInfo(@"\\sharedpc\readonly"), System.Security.AccessControl.FileSystemRights.Write);
Assert.AreEqual(result, false);
}
Привет, дезертир, я попробовал ваш код, и все здесь прекрасно работает. Вы уверены, что правильно настроили разрешения для текущего пользователя в папке «\\ sharedpc \ readonly»? –
Привет, я поставил ответ ниже, но думаю, что это вещь окружающей среды или просто немного путаницы. Я понимаю, что ваш TestMethod возвращает True, указывающий, что пользователь * имеет * разрешение, но это * неверно *? 1. Можете ли вы отредактировать свой вопрос и предоставить снимок экрана с разрешениями папок и 2. указать имя учетной записи пользователя, на котором выполняется код 'WindowsIdentity.GetCurrent'. 3. Пожалуйста, подтвердите, что вы протестировали с помощью другой WindowIdentity у себя, самый простой способ сделать это http://stackoverflow.com/questions/125341/how-do-you-do-impersonation-in-net/7250145#7250145 Спасибо , –
Вы пробовали это, https://msdn.microsoft.com/en-us/library/system.security.accesscontrol.filesystemsecurity.accessrulefactory(v=vs.110).aspx? Метод Get, вероятно, не разрешит вложенные правила или зависимые правила, такие как правило, применяемое к группе и т. Д., Этот метод может дать вам фактическое правило доступа для проверки. –