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

3

我正在尝试从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; }
}

然后使用以下方法,我能够获取用户名称、显示名称、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**
            }
        }
    }
}

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


这是您要找的内容吗?链接 - jAC
这可能更有用 - https://dev59.com/4nI-5IYBdhLWcg3wlpQM - Syntax Error
1个回答

5

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

我如何获取域控制器的登录/注销历史记录?我想要知道域用户用于登录服务器的IP地址。 - immayankmodi
1
如果您正在使用.Net Core,您需要在NuGet中添加对System.DirectoryServices包的引用-Principal和DirectoryEntry对象来自该包。 - Brett Rigby
还有System.DirectoryServices.AccountManagement NuGet包。 - Brett Rigby

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接