2

我有一个从特定组获取用户的代码。

        PrincipalContext ctx = new PrincipalContext(ContextType.Domain, domainName);
        GroupPrincipal grp = GroupPrincipal.FindByIdentity(ctx, IdentityType.Name, groupName);

        if (grp != null)
        {
            foreach (Principal p in grp.GetMembers(true))
            {
                Console.WriteLine(p.Name);
            }
        }

问题是我无法获取用户手机、家庭电话、部门、国家/地区。有人知道如何使用这种方法来完成吗?

4

2 回答 2

0

尝试在循环中声明以允许您UserPrincipal使用专门为 Active Directory 用户定义的属性。Principalforeach

或者您可以尝试在循环中包含此代码。

Console.WriteLine(p.ExtensionGet("mobile")); // Mobile Phone
Console.WriteLine(p.ExtensionGet("homePhone"));  // Home Phone
Console.WriteLine(p.ExtensionGet("department"));  // Department
Console.WriteLine(p.ExtensionGet("co")); // Country

该方法ExtensionGet不仅允许您从标准 Active Directory 字段中检索数据,而且还允许您从目录中包含的其他自定义数据中检索数据。

于 2014-05-27T06:46:50.507 回答
0

@HuroSwords 答案中的ExtensionGet方法不能直接使用,因为它是受保护的方法。

正如在其他地方提到的,您需要创建自己的子类才能使用它。我在下面提供了一个我过去为获得额外用户属性所做的示例。

[DirectoryRdnPrefix("CN")]
[DirectoryObjectClass("User")]
public class UserPrincipalExtended : UserPrincipal
{
    public UserPrincipalExtended(PrincipalContext context) : base(context)
    {
    }

    // Implement the overloaded search method FindByIdentity to return my extended type
    public static new UserPrincipalExtended FindByIdentity(PrincipalContext context, string identityValue)
    {
        return (UserPrincipalExtended)FindByIdentityWithType(context, typeof(UserPrincipalExtended), identityValue);
    }

    // Implement the overloaded search method FindByIdentity to return my extended type
    public static new UserPrincipalExtended FindByIdentity(PrincipalContext context, IdentityType identityType, string identityValue)
    {
        return (UserPrincipalExtended)FindByIdentityWithType(context, typeof(UserPrincipalExtended), identityType, identityValue);
    }

    [DirectoryProperty("physicalDeliveryOfficeName")]
    public string Department
    {
        get
        {
            if (ExtensionGet("physicalDeliveryOfficeName").Length != 1)
                return null;
            return (string)ExtensionGet("physicalDeliveryOfficeName")[0];
        }
    }
}

然后像使用普通 UserPrincipal 对象一样使用子类。

var domain = new PrincipalContext(ContextType.Domain);
var userPrincipal = UserPrincipalExtended.FindByIdentity(domain, HttpContext.Current.User.Identity.Name);
Console.WriteLine(userPrincipal.Location);

在您的情况下,您可能需要重新获取委托人。

于 2016-04-12T19:48:09.420 回答