istudent Ответов: 1

Ошибка : группа, соответствующая указанным параметрам, не найдена. Источник ошибки : system.directoryservices.accountmanagement


In my console application, I am trying to find out if the user is in group that has security permission to folder. But my code is throwing exception.

Error : No group matching the specified parameters was found. Source of error : System.DirectoryServices.AccountManagement


Что я уже пробовал:

static void Main(string[] args)
  {
    string userDomainName = Environment.UserDomainName;
    string authUserName = Environment.UserName;
    string dirPath = ConfigurationManager.AppSettings["FilePath"];
    DirectorySecurity dSecurity = Directory.GetAccessControl(dirPath);
    foreach (FileSystemAccessRule rule in dSecurity.GetAccessRules(true, true, typeof(NTAccount)))
        {
            string userGroupName = rule.IdentityReference.Value;
            bool flag = IsInGroup(, authUserName, userGroupName);
            if(flag)
            {
                Console.WriteLine( authUserName + " can open file from " + dirPath);
                Console.WriteLine("=========================================");
            }
            else
            {
                Console.WriteLine( authUserName + " do not have access to " + dirPath);
                Console.WriteLine("=========================================");
            }
        }
  }

   private static bool IsInGroup(string domain, string username, string ingroup)
        {
            bool isMember = false;
            try
            {
                PrincipalContext domainctx = new PrincipalContext(ContextType.Domain, domain, "DC=testdomain,DC=net");
                UserPrincipal userPrincipal = UserPrincipal.FindByIdentity(domainctx, IdentityType.SamAccountName, username);
                isMember = userPrincipal.IsMemberOf(domainctx, IdentityType.Name, ingroup);
                return isMember;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return false;
            }
        }

1 Ответов

Рейтинг:
5

Dave Kreskowiak

Контекст вашего домена просто нуждается в доменном имени, а не в пути объявления:

PrincipalContext domainctx = new PrincipalContext(ContextType.Domain, "testdomain");

Это версия IsInGroup, которая просто берет текущего пользователя (кто бы ни запускал код) и возвращает, если он находится в указанной группе в текущем домене:
static bool IsCurrentUserInGroup(string groupName)
{
    bool returnValue = false;

    PrincipalContext context = new PrincipalContext(ContextType.Domain, Environment.UserDomainName);

    if (context != null)
    {
        UserPrincipal user = UserPrincipal.Current;

        if (user != null)
        {
            GroupPrincipal group = GroupPrincipal.FindByIdentity(context, groupName);

            if (group != null)
            {
                returnValue = user.IsMemberOf(group);
                group.Dispose();
            }

            user.Dispose();
        }

        context.Dispose();
    }

    return returnValue;
}

Вызвать его очень просто:
if (IsCurrentUserInGroup("testdomain"))
{
    Debug.WriteLine($"Current user is in the group.");
}

У меня нет diea, почему у вас есть мусор правила FileSystemAccess там. Вам это не нужно, если все, что вы делаете, - это проверяете членство в группе и предполагаете, что у группы уже есть правильные разрешения.


istudent

Как мне узнать имя группы, связанное с той папкой, на которую я смотрю, чтобы передать этот метод IsCurrentUserInGroup(string groupName) ?

Я использовал правило FileSystemAccess для получения имени группы
строки имя_группы_или_пользователя = правило.Отождествление личности.Ценность;

есть ли лучший способ сделать это?

Dave Kreskowiak

Итак, вы пытаетесь получить ACL из папки, пройти через них, чтобы получить имена любых групп, а затем проверить, является ли текущий пользователь членом одной из этих групп?

ПОЧЕМУ? Какой в этом смысл?

istudent

Мы перемещаем все наши файлы на выделенный файловый сервер с нашего веб-сервера. Поэтому мне нужно создать обработчик файлов, который загружает файл с файлового сервера. В целях безопасности мне нужно проверить, есть ли у пользователя разрешение на доступ к файлу или нет.

istudent

- Спасибо, сэр. Пожалуйста, дайте мне знать, если есть лучший способ достичь этого.

Dave Kreskowiak

Итак, вы пытаетесь переместить все папки и файлы на веб-сервере на выделенный файловый сервер, и вам нужно убедиться, что все разрешения перемещены вместе с ними?

Разрешения обычно применяются к папкам, а не к файлам.

istudent

Сэр, поможет ли это вышеприведенное решение мне получить разрешение, применяемое только в папке? Я в замешательстве.

Dave Kreskowiak

Нет, обычно разрешения NTFS применяются к папкам, а не к файлам. Приложения, как и любое офисное приложение, сохраняют свои файлы, создавая новый и удаляя старую копию файла. Это убивает все разрешения, которые были применены непосредственно к файлу, а не к папке, содержащей файл.

istudent

Если я дам путь к папке, содержащей файлы, например, \\ip-fileServer-101\ParentFolder\Myfolder\ insted of \\ip-fileServer-101\ParentFolder\Myfolder\MyFile.pdf, будет ли он проверять группу в безопасности MyFolder?

Dave Kreskowiak

Что произошло, когда вы попробовали его и перешагнули через код с помощью отладчика?

istudent

это сработало, сэр. Что я сделал , так это удалил одну из унаследованных групп из файлов, но сохранил в папке и запустил программу. Большое вам спасибо, сэр.