Как проверить, принадлежит ли пользователь группе 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);
}
Ответы
Ответ 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
}
Ответ 3
Вы не можете сделать это таким образом.
Вы должны запросить активный каталог.
Вы можете использовать обертку для AD. Проверьте http://www.codeproject.com/Articles/10301/Wrapper-API-for-using-Microsoft-Active-Directory-S