Как проверить, есть ли у конкретного пользователя доступ к общей папке с помощью C#
У нас есть сценарий в нашем клиентском проекте, где клиентское приложение сохраняет и пытается извлечь файлы из общей папки, которая является виртуальной общей папкой. Но мы столкнулись с проблемами, когда конкретный идентификатор пользователя приложения терял доступ к этой общей папке. Поэтому нам нужна помощь в предварительной проверке наличия доступа к этому идентификатору пользователя в этой папке общего доступа. Так что подумайте о приложении, которое будет разработано на C# или vb.net для проверки доступа этого пользователя.
1 ответ
Я считаю, что лучше всего проверить разрешение, попробуйте получить доступ к каталогу (чтение / запись / список) и перехватить исключение UnauthorizedAccessException.
Если вы хотите проверить разрешения, следующий код должен удовлетворить ваши потребности. Вам нужно прочитать Access Rules
для каталога.
private bool DirectoryCanListFiles(string folder)
{
bool hasAccess = false;
//Step 1. Get the userName for which, this app domain code has been executing
string executingUser = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
NTAccount acc = new NTAccount(executingUser);
SecurityIdentifier secId = acc.Translate(typeof(SecurityIdentifier)) as SecurityIdentifier;
DirectorySecurity dirSec = Directory.GetAccessControl(folder);
//Step 2. Get directory permission details for each user/group
AuthorizationRuleCollection authRules = dirSec.GetAccessRules(true, true, typeof(SecurityIdentifier));
foreach (FileSystemAccessRule ar in authRules)
{
if (secId.CompareTo(ar.IdentityReference as SecurityIdentifier) == 0)
{
var fileSystemRights = ar.FileSystemRights;
Console.WriteLine(fileSystemRights);
//Step 3. Check file system rights here, read / write as required
if (fileSystemRights == FileSystemRights.Read ||
fileSystemRights == FileSystemRights.ReadAndExecute ||
fileSystemRights == FileSystemRights.ReadData ||
fileSystemRights == FileSystemRights.ListDirectory)
{
hasAccess = true;
}
}
}
return hasAccess;
}