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


Сначала я думал, что приведенный ниже код работает, потому что если у меня есть группа как "IT", она работает правильно, потому что мое имя пользователя находится в группе IT в active directory. То, что я узнал, это всегда возвращает true независимо от того, есть ли у меня имя пользователя в группе IT или нет, и если я изменяю его на любую другую группу, я в ней возвращаю всегда возвращает 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);
    }
3 41

3 ответа:

Так как вы находитесь на .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 очень легко играть с пользователями и группами в рекламе!

Небольшое отклонение от примера @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

}

Вы не можете сделать это таким образом. Вы должны запросить active directory. Вы можете использовать обертку для рекламы. Проверить http://www.codeproject.com/Articles/10301/Wrapper-API-for-using-Microsoft-Active-Directory-S