我可以使用PrincipalContext()从Active Directory获取用户部门吗?

时间:2017-07-13 15:59:29

标签: c# asp.net directoryservices userprincipal

我正在尝试从Active Directory获取用户的部门。我有以下课程:

public class DomainContext
{
        public string DisplayName { get; set; }
        public string Name { get; set; }
        public string SamAccountName { get; set; }
        public string DistinguishedName { get; set; }
        public string UserPrincipalName { get; set; }
        public string Department { get; set; }
}

然后使用以下方法,我可以获得用户名,显示名称,山姆帐号等....

public override void getUserDepts(SPItemEventProperties properties)
{
    base.ItemUpdating(properties);

    string[] offices = new string[] { "OfficeA", "OfficeB", "OfficeC" };

    string ADServerName = "*****";
    string ADusername = "******";
    string ADpassword = "*****";

    using (var context = new PrincipalContext(ContextType.Domain, ADServerName, ADusername, ADpassword))
    using (var searcher = new PrincipalSearcher(new UserPrincipal(context)))
    {
        var searchResults = searcher.FindAll();

        foreach (Principal p in searchResults)
        {
            if (p.DistinguishedName.ToLower().Contains(offices[0].ToLower()) || p.DistinguishedName.ToLower().Contains(offices[1].ToLower()) || p.DistinguishedName.ToLower().Contains(offices[2].ToLower())))
            {
                DomainContext dc = new DomainContext();
                dc.DisplayName = p.DisplayName;
                dc.UserPrincipalName = p.UserPrincipalName;
                dc.Name = p.Name;
                dc.SamAccountName = p.SamAccountName;
                dc.DistinguishedName = p.DistinguishedName;
                // dc.Department = p. **CAN NOT GET THE DEPARTMENT NAME**
            }
        }
    }
}

但我无法找到如何获得部门名称。

1 个答案:

答案 0 :(得分:2)

您可以通过检查其DirectoryEntry

中的基础属性来访问该部门
var property = "department";
var directoryEntry = p.GetUnderlyingObject() as DirectoryEntry;
if (directoryEntry.Properties.Contains(property)) {
    dc.Department = directoryEntry.Properties[property].Value.ToString();
}

您可以考虑将上述内容转换为扩展方法,以减少重复代码。

我将一个用户属性列表编译为一个类作为常量

public static class ADUserProperties
{
    public const String OBJECTCLASS = "objectClass";

    public const String CONTAINERNAME = "cn";

    public const String LASTNAME = "sn";

    public const String COUNTRYNOTATION = "c";

    public const String CITY = "l";

    public const String STATE = "st";

    public const String TITLE = "title";

    public const String POSTALCODE = "postalCode";

    public const String PHYSICALDELIVERYOFFICENAME = "physicalDeliveryOfficeName";

    public const String FIRSTNAME = "givenName";

    public const String MIDDLENAME = "initials";

    public const String DISTINGUISHEDNAME = "distinguishedName";

    public const String INSTANCETYPE = "instanceType";

    public const String WHENCREATED = "whenCreated";

    public const String WHENCHANGED = "whenChanged";

    public const String DISPLAYNAME = "displayName";

    public const String USNCREATED = "uSNCreated";

    public const String MEMBEROF = "memberOf";

    public const String USNCHANGED = "uSNChanged";

    public const String COUNTRY = "co";

    public const String DEPARTMENT = "department";

    public const String COMPANY = "company";

    public const String PROXYADDRESSES = "proxyAddresses";

    public const String STREETADDRESS = "streetAddress";

    public const String DIRECTREPORTS = "directReports";

    public const String NAME = "name";

    public const String OBJECTGUID = "objectGUID";

    public const String USERACCOUNTCONTROL = "userAccountControl";

    public const String BADPWDCOUNT = "badPwdCount";

    public const String CODEPAGE = "codePage";

    public const String COUNTRYCODE = "countryCode";

    public const String BADPASSWORDTIME = "badPasswordTime";

    public const String LASTLOGOFF = "lastLogoff";

    public const String LASTLOGON = "lastLogon";

    public const String PWDLASTSET = "pwdLastSet";

    public const String PRIMARYGROUPID = "primaryGroupID";

    public const String OBJECTSID = "objectSid";

    public const String ADMINCOUNT = "adminCount";

    public const String ACCOUNTEXPIRES = "accountExpires";

    public const String LOGONCOUNT = "logonCount";

    public const String LOGINNAME = "sAMAccountName";

    public const String SAMACCOUNTTYPE = "sAMAccountType";

    public const String SHOWINADDRESSBOOK = "showInAddressBook";

    public const String LEGACYEXCHANGEDN = "legacyExchangeDN";

    public const String USERPRINCIPALNAME = "userPrincipalName";

    public const String EXTENSION = "ipPhone";

    public const String SERVICEPRINCIPALNAME = "servicePrincipalName";

    public const String OBJECTCATEGORY = "objectCategory";

    public const String DSCOREPROPAGATIONDATA = "dSCorePropagationData";

    public const String LASTLOGONTIMESTAMP = "lastLogonTimestamp";

    public const String EMAILADDRESS = "mail";

    public const String MANAGER = "manager";

    public const String MOBILE = "mobile";

    public const String PAGER = "pager";

    public const String FAX = "facsimileTelephoneNumber";

    public const String HOMEPHONE = "homePhone";

    public const String MSEXCHUSERACCOUNTCONTROL = "msExchUserAccountControl";

    public const String MDBUSEDEFAULTS = "mDBUseDefaults";

    public const String MSEXCHMAILBOXSECURITYDESCRIPTOR = "msExchMailboxSecurityDescriptor";

    public const String HOMEMDB = "homeMDB";

    public const String MSEXCHPOLICIESINCLUDED = "msExchPoliciesIncluded";

    public const String HOMEMTA = "homeMTA";

    public const String MSEXCHRECIPIENTTYPEDETAILS = "msExchRecipientTypeDetails";

    public const String MAILNICKNAME = "mailNickname";

    public const String MSEXCHHOMESERVERNAME = "msExchHomeServerName";

    public const String MSEXCHVERSION = "msExchVersion";

    public const String MSEXCHRECIPIENTDISPLAYTYPE = "msExchRecipientDisplayType";

    public const String MSEXCHMAILBOXGUID = "msExchMailboxGuid";

    public const String NTSECURITYDESCRIPTOR = "nTSecurityDescriptor";

}

并创建了一个访问它的扩展方法

public static string GetProperty(this DirectoryEntry directoryEntry , string propertyName, int index = 0) {
    if (directoryEntry.Properties.Contains(propertyName) && index > -1 && index < directoryEntry.Properties[propertyName].Count) {
        return directoryEntry.Properties[propertyName][index].ToString();
    } else {
        return string.Empty;
    }
}

public static string GetProperty(this Principal principal, string property) {
    var directoryEntry = principal.GetUnderlyingObject() as DirectoryEntry;
    return directoryEntry.GetProperty(property);
}

这样就可以将代码更新为

dc.Department = p.GetProperty(ADUserProperties.DEPARTMENT);