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

标签 c# asp.net directoryservices userprincipal

我正在尝试从 Active Directory 中获取用户的部门。我有以下类(class):

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; }
}

然后使用下面的方法,我可以获得用户名、显示名称、sam 帐户等....

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**
            }
        }
    }
}

但我找不到如何获取部门名称。

最佳答案

您可以通过检查其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);

关于c# - 我可以使用 PrincipalContext() 从 Active Directory 获取用户部门吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45085818/

相关文章:

c# - 如何将 SpecFlow 表转换为字符串数组

c# - Context.Items 在页面刷新/传输期间清除

.net - 如何在 .net 网站中创建一个始终在后台运行的线程?

c# - 如何列出所有计算机及其最后一次登录 AD 的时间?

c# - 使用 DirectoryServices.AccountManagement 从 OU 获取组

c# - 下拉列表回发到默认选定值?

c# - 是否有编译为机器代码的 C C++ C# 编译器

asp.net - linux dnx(.net执行环境): HTTP 200s with no body content

java - JNDI:命名服务与目录服务

c# DrawString - 测量每个字符的边界框