Подтвердить что ты не робот

Как проверить, принадлежит ли пользователь группе AD?

Сначала я подумал, что код ниже работает, потому что, если у меня есть группа как "ИТ", он функционирует правильно, потому что мое имя пользователя находится в группе ИТ в активном каталоге. То, что я узнал, всегда возвращает true, имеет ли я свое имя пользователя в группе ИТ или нет, и если я изменю его на любую другую группу, в которой я нахожусь, возвращается всегда возвращает false. Любая помощь будет оценена.

    private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
    {
        // tab control security for admin tab
        bool admin = checkGroup("IT");

        if ((admin == true) && (tabControl1.SelectedTab == tpHistory))
        {
            tabControl1.SelectedTab = tpHistory;
        }
        else if ((admin == false) && (tabControl1.SelectedTab == tpHistory))
        {
            tabControl1.SelectedTab = tpRequests;
            MessageBox.Show("Unable to load tab. You have insufficient privileges.",
                "Access Denied", MessageBoxButtons.OK, MessageBoxIcon.Stop);
        }
    }

    // check active directory to see if user is in Marketing department group
    private static bool checkGroup(string group)
    {
        WindowsIdentity identity = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(identity);
        return principal.IsInRole(group);
    }
4b9b3361

Ответ 1

Поскольку вы используете .NET 3.5 и выше, вы должны проверить пространство имен System.DirectoryServices.AccountManagement (S.DS.AM). Подробнее читайте здесь:

В принципе, вы можете определить контекст домена и легко найти пользователей и/или группы в AD:

// set up domain context
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "DOMAINNAME");

// find a user
UserPrincipal user = UserPrincipal.FindByIdentity(ctx, "SomeUserName");

// find the group in question
GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, "YourGroupNameHere");

if(user != null)
{
   // check if user is member of that group
   if (user.IsMemberOf(group))
   {
     // do something.....
   } 
}

Новый S.DS.AM позволяет очень легко играть с пользователями и группами в AD!

Ответ 2

Небольшое отклонение от примера @marc_s, реализованного в методе static void Main() в Program:

DomainCtx = new PrincipalContext( ContextType.Domain , Environment.UserDomainName );
if ( DomainCtx != null ) {
    User = UserPrincipal.FindByIdentity( DomainCtx , Environment.UserName );
}

DomainCtx и User являются статическими свойствами, объявленными в Program

Тогда в других формах я просто делаю что-то вроде этого:

if ( Program.User.IsMemberOf(GroupPrincipal.FindByIdentity(Program.DomainCtx, "IT-All") )) {
    //Enable certain Form Buttons and objects for IT Users

}