2

我有一些代码可以检查Active Directory用户所属的所有组,这在我的开发环境中本地运行良好,但当我发布到测试系统时却不行。

有同事提出,可能是应用程序池所在的账户IIS无法轮询Active Directory。会是这样吗?什么可能导致没有组返回?

当我在本地运行我的代码时,我能够检索列表,但测试返回为空。根本没有抛出任何错误。

示例代码,我将“LIVE”更改为“TEST”,因为我们有一个多域网络,但都不起作用:

UserPrincipal user = UserPrincipal.Current;
if (user != null)
{
    PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, "TEST");
    List<Principal> groupResults = user.GetGroups(principalContext).ToList();
}
4

3 回答 3

2

似乎问题与您用来获取组的用户有关。UserPrincipal.Current 获取其运行所在线程的用户帐户。在 IIS 应用程序中,该帐户是在应用程序的 IIS 应用程序池标识中指定的帐户。如果要查找特定用户帐户的 Active Directory 组以获取组,可以使用此代码(.Net 4):

using (PrincipalContext context = new PrincipalContext(ContextType.Domain, "TEST");)
{
    UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, "A_User_Name");
    foreach (var group in user.GetGroups())
    {
        Console.WriteLine(group.Name);
    }
}

如果您想将此结果与特定域中的用户和组进行比较,可以使用此工具: “Active Directory 用户和计算机”

于 2013-08-21T14:29:19.253 回答
1

如果是 ASP.NET,这应该可以工作:

    public static List<string> GetGroups(string userName)
    {
        RoleProvider roleProvider = new WindowsTokenRoleProvider();
        return roleProvider.GetRolesForUser(userName).ToList();
    }

超级简单

于 2013-08-21T14:02:55.030 回答
1

我不是 100% 确定,但我认为它比你的代码简单得多:

UserPrincipal user = UserPrincipal.Current;

if (user != null)
{
    List<Principal> groupResults = user.GetGroups().ToList();
}
于 2013-08-21T14:08:30.790 回答