回答
其實,問題是如何得到兩個屬性的.NET 3.5 (System.DirectoryServices.AccountManagement.)UserPrincipal
-object沒有給出userPrincipalName
。
這裏如何做到這一點與extension method:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.DirectoryServices;
using System.DirectoryServices.AccountManagement;
namespace MyExtensions
{
public static class AccountManagementExtensions
{
public static String GetProperty(this Principal principal, String property)
{
DirectoryEntry directoryEntry = principal.GetUnderlyingObject() as DirectoryEntry;
if (directoryEntry.Properties.Contains(property))
return directoryEntry.Properties[property].Value.ToString();
else
return String.Empty;
}
public static String GetCompany(this Principal principal)
{
return principal.GetProperty("company");
}
public static String GetDepartment(this Principal principal)
{
return principal.GetProperty("department");
}
}
}
上面的代碼將在大多數情況下(也就是將標準文字工作/字符串單值Active Directory屬性)。您需要修改代碼併爲您的環境添加更多錯誤處理代碼。
您可以使用它通過添加「擴展類」到您的項目,然後你可以這樣做:
PrincipalContext domain = new PrincipalContext(ContextType.Domain);
UserPrincipal userPrincipal = UserPrincipal.FindByIdentity(domain, "youruser");
Console.WriteLine(userPrincipal.GetCompany());
Console.WriteLine(userPrincipal.GetDepartment());
Console.WriteLine(userPrincipal.GetProperty("userAccountControl"));
(順便說一句,這本來是爲擴展特性有很大用途 - too bad it won't be in C# 4 either。)
像這樣的東西應該這樣做,如果部門和公司屬性爲用戶存在。
DirectoryEntry de = new DirectoryEntry();
de.Path = "LDAP://dnsNameOfYourDC.my.company.com";
DirectorySearcher deSearch = new DirectorySearcher(de);
deSearch.PropertiesToLoad.Add("department");
deSearch.PropertiesToLoad.Add("company");
deSearch.SearchScope = SearchScope.Subtree;
deSearch.Filter = "(&(objectClass=User)(userPrincipalName=MyPrincipalName))";
SearchResultCollection results = deSearch.FindAll():
foreach (SearchResult result in results)
{
ResultPropertyCollection props = result.Properties;
foreach (string propName in props.PropertyNames)
{
//Loop properties and pick out company,department
string tmp = (string)props[propName][0];
}
}
一個小小的挑剔:在LDAP過濾器中,我寧願使用「objectCategory」而不是objectClass。爲什麼? objectCategory是單值的,並且在Active Directory中被索引,因此搜索者使用objectCategory更快。 – 2009-11-23 22:02:45
實際上,如果您使用的是Windows Server 2008,則objectClass屬性默認會編入索引。如果您使用Windows Server 2000或2003,則不是。 – 2009-11-24 07:40:17
這是一個很好的解決方案,因此非常感謝。我不得不在下面標記爲正確,但是我正在處理System.DirectoryServices.AccountManagement.UserPrincipal。 – wgpubs 2009-11-24 18:18:34
- 1. 獲得從Active Directory(AccountManagement UserPrincipal)EmailAddress的NULL
- 2. UserPrincipal對象,Active Directory查詢:DirectoryServicesCOMException
- 3. 如何獲得Active Directory屬性不被UserPrincipal類表示
- 4. 如何設置在C#在Active Directory中UserPrincipal對象的經理屬性
- 5. 從UserPrincipal對象獲取nETBIOSName
- 6. 將Java UserPrincipal映射到Active Directory用戶
- 7. 如何導出Active Directory對象的CSV?
- 8. 如何從Active Directory
- 9. 從Active Directory獲取
- 10. Active Directory和Active Directory中的字段LDS
- 11. 如何克隆GroupOfNames Active Directory對象?
- 12. 從Azure Active Directory獲取mailNickname
- 13. 如何通過擴展UserPrincipal類在Active Directory中創建聯繫人?
- 14. 如何清除Active Directory中的用戶對象屬性?
- 15. Gerrit和Active Directory
- 16. Active Directory和Firebase
- 17. Active Directory和Powershell
- 18. 如何從C#中的Active Directory中獲取System .__ ComObject值
- 19. 查詢Active Directory以獲得在Android
- 20. MVC獲得Active Directory用戶名
- 21. .NET Active Directory - 獲取特定Active Directory組中的用戶列表
- 22. UserPrincipal對象中的域名在哪裏?
- 23. 如何獲得在Active Directory中的終端服務屬性值從userParameters屬性
- 24. 如何驗證對Active Directory的訪問?
- 25. 我們如何獲得列表的Active Directory用戶信息
- 26. 如何從Sitecore中的Active Directory用戶獲取用戶ID?
- 27. 如何從C#中的Active Directory獲取自定義字段?
- 28. Powershell的獲得對用戶登錄OU在Active Directory
- 29. 將Active Directory對象標記爲「只讀」?
- 30. 從Active Directory獲取更新的數據?
您也可以查看Principal Extensions(http://msdn.microsoft.com/zh-cn/library/bb552835.aspx)以使用您需要的特定屬性創建自定義主體。 – 2009-11-24 09:07:11
你會如何去做一個「設置」方法並保存一個值? – JustinStolle 2011-02-08 23:36:20
@PerNoalt感謝您的代碼,但沒有一個簡短的方法直接從UserPrincipal直接獲取屬性,例如:部門,而不使用擴展? – Rama 2013-02-15 10:31:17