Мне нужно проверить, может ли пользователь писать в папку, прежде чем пытаться это сделать.
Я реализовал следующий метод (в C # 2.0), который пытается получить разрешения безопасности для папки с помощью метода Directory.GetAccessControl () .
private bool hasWriteAccessToFolder(string folderPath)
{
try
{
// Attempt to get a list of security permissions from the folder.
// This will raise an exception if the path is read only or do not have access to view the permissions.
System.Security.AccessControl.DirectorySecurity ds = Directory.GetAccessControl(folderPath);
return true;
}
catch (UnauthorizedAccessException)
{
return false;
}
}
Когда я гуглял, как проверить доступ на запись, ничего подобного не возникало, и на самом деле оказалось очень сложно на самом деле проверить разрешения в Windows. Я обеспокоен тем, что я чрезмерно упрощаю вещи и что этот метод не является надежным, хотя, похоже, он работает.
Будет ли мой метод проверки правильности работы текущего пользователя с правами на запись?
c#
permissions
directory
Крис Б
источник
источник
Ответы:
Это совершенно правильный способ проверить доступ к папке в C #. Единственное место, где он может упасть, - это если вам нужно вызвать это в узком цикле, где могут возникнуть проблемы с издержками исключения .
Были и другие подобные вопросы, задаваемые ранее.
источник
Я ценю, что для этого поста немного поздно, но этот фрагмент кода может оказаться полезным.
Перетащите это в консольное приложение и посмотрите, делает ли оно то, что вам нужно.
источник
GetAccessControl
но мое программное обеспечение действительно способно записывать в каталог, на который я смотрю ..?источник
string tempFileName = Path.GetRandomFileName();
видимоЯ пробовал большинство из них, но они дают ложные срабатывания, все по той же причине. Недостаточно проверить каталог на наличие доступных разрешений, вы должны проверить, что вошедший в систему пользователь является членом группы, которая имеет это разрешение. Для этого вы получаете удостоверение пользователя и проверяете, является ли он членом группы, содержащей FileSystemAccessRule IdentityReference. Я проверил это, работает без нареканий ..
источник
(AccessRight & rule.FileSystemRights) > 0
потому, что любой запрещенный тип подчиненного доступаAccessRight
означает, что у вас нет полного доступ кAccessRight
ИМХО, единственный 100% надежный способ проверить, можете ли вы записать в каталог, - это фактически писать в него и в конечном итоге перехватывать исключения.
источник
Например, для всех пользователей (Builtin \ Users) этот метод работает отлично - наслаждайтесь.
источник
Попробуй это:
источник
fsAccessRule.AccessControlType
может бытьAccessControlType.Deny
.Ваш код получает
DirectorySecurity
для данного каталога и обрабатывает исключение (из-за того, что у вас нет доступа к информации о безопасности) правильно. Однако в вашем примере вы на самом деле не запрашиваете возвращенный объект, чтобы увидеть, какой доступ разрешен - и я думаю, что вам нужно добавить это.источник
Вот модифицированная версия ответа CsabaS , которая учитывает явные правила запрета доступа. Функция просматривает все FileSystemAccessRules для каталога и проверяет, находится ли текущий пользователь в роли, которая имеет доступ к каталогу. Если такие роли не найдены или пользователь находится в роли с запрещенным доступом, функция возвращает false. Чтобы проверить права на чтение, передайте FileSystemRights.Read функции; для прав записи передайте FileSystemRights.Write. Если вы хотите проверить произвольные права пользователя, а не права текущего, замените currentUser WindowsIdentity на желаемый WindowsIdentity. Я также не рекомендую полагаться на такие функции, чтобы определить, может ли пользователь безопасно использовать каталог. Этот ответ прекрасно объясняет почему.
источник
Вышеуказанные решения хороши, но для меня этот код прост и выполним. Просто создайте временный файл. Если файл создан, его средний пользователь имеет право на запись.
источник
Create
разрешение , но неDelete
в этом случае это возвращение будет ложным , даже если пользователь делает иметь разрешение на запись.Path.Combine
вместо таких какPath.Combine(tempfilepath, "temp.txt")
.Вы можете попробовать следующий блок кода, чтобы проверить, имеет ли каталог доступ для записи. Он проверяет FileSystemAccessRule.
источник
В вашем коде есть потенциальное состояние гонки - что произойдет, если у пользователя будут права на запись в папку при проверке, но до того, как пользователь действительно запишет в папку, это разрешение будет отозвано? При записи выдается исключение, которое вам нужно будет перехватить и обработать. Так что первоначальная проверка не имеет смысла. Вы также можете просто написать и обработать любые исключения. Это стандартный шаблон для вашей ситуации.
источник
http://www.codeproject.com/KB/files/UserFileAccessRights.aspx
Очень полезный класс, проверьте улучшенную версию в сообщениях ниже.
источник
Простая попытка доступа к рассматриваемому файлу не обязательно достаточна. Тест будет выполняться с разрешениями пользователя, запустившего программу. Это не обязательно те права пользователя, с которыми вы хотите протестировать.
источник
Я согласен с Эшем, это должно быть хорошо. В качестве альтернативы вы можете использовать декларативный CAS и фактически запретить запуск программы, если у них нет доступа.
Я считаю, что некоторые функции CAS могут отсутствовать в C # 4.0 из того, что я слышал, не уверен, что это может быть проблемой или нет.
источник
Я не мог заставить GetAccessControl () выдать исключение в Windows 7, как рекомендовано в принятом ответе.
В итоге я использовал вариант ответа sdds :
Надеюсь это поможет.
источник
Я столкнулся с той же проблемой: как проверить, могу ли я читать / писать в определенном каталоге. Я получил простое решение ... на самом деле проверить его. Вот мое простое, но эффективное решение.
Надеюсь, поможет !
источник
Большинство ответов здесь не проверяет доступ на запись. Он просто проверяет, может ли пользователь / группа «Чтение разрешений» (Чтение списка ACE файла / каталога).
Также итерация ACE и проверка соответствия идентификатора безопасности не работает, поскольку пользователь может быть членом группы, из которой он может получить / потерять привилегию. Хуже, чем вложенные группы.
Я знаю, что это старая тема, но есть способ лучше для любого, кто смотрит сейчас.
При условии, что у пользователя есть права на чтение, можно использовать API-интерфейс Authz для проверки эффективного доступа.
https://docs.microsoft.com/en-us/windows/win32/secauthz/using-authz-api
https://docs.microsoft.com/en-us/windows/win32/secauthz/checking-access-with-authz-api
источник