2009-11-23 2 views

ответ

79

На самом деле, вопрос заключается в том, чтобы получить два свойства для .NET 3.5 (System.DirectoryServices.AccountManagement.)UserPrincipal не -объект дали 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"); 
     } 

    } 
} 

Приведенный выше код будет работать в большинстве случаев (то есть он будет работать для стандартного текста/String Single-Value Active Directory атрибуты). Вам нужно будет изменить код и добавить код обработки ошибок для вашей среды.

Вы можете использовать его добавить «Extension Class» для вашего проекта, а затем вы можете сделать это:

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")); 

(BTW, это была бы большая польза для свойства Extension - too bad it won't be in C# 4 either.)

+1

Также вы можете ознакомиться с Основными расширениями (http://msdn.microsoft.com/en-us/library/bb552835.aspx), чтобы создать пользовательские принципы, соответствующие требуемым вам свойствам. –

+0

как вы собираетесь делать метод «Установить» и сохранить значение? – JustinStolle

+0

@PerNoalt Спасибо за код, но не существует более короткого способа напрямую получить свойство, например: department из UserPrincipal, без использования расширений? – Rama

13

Что-то вроде этого должно делать это, если для пользователя существуют свойства отдела и компании.

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]; 
    } 
} 
+2

один маленький nitpick: в LDAP-фильтре я бы предпочел использовать «objectCategory» вместо objectClass. Зачем? Объектная категория является однозначной и индексируется в Active Directory, поэтому поисковик быстрее использует objectCategory. –

+2

Фактически атрибут objectClass индексируется по умолчанию, если вы находитесь на Windows Server 2008. Это не так, если вы на Windows Server 2000 или 2003. –

+0

Это отличное решение и работает так, спасибо. Я должен был отметить один ниже, как правильный, хотя я имею дело с System.DirectoryServices.AccountManagement.UserPrincipal. – wgpubs

Смежные вопросы