2012-07-02 66 views

回答

9

S.DS.AM命名空間中的基本UserPrincipal不具有該屬性 - 但您可以擴展用戶主體類並添加所需的其他屬性。

瞭解更多關於在這裏:​​

Managing Directory Security Principals in the .NET Framework 3.5
有朝着製品結束對擴展一節)

下面的代碼:

[DirectoryRdnPrefix("CN")] 
[DirectoryObjectClass("Person")] 
public class UserPrincipalEx : UserPrincipal 
{ 
    // Inplement the constructor using the base class constructor. 
    public UserPrincipalEx(PrincipalContext context) : base(context) 
    { } 

    // Implement the constructor with initialization parameters.  
    public UserPrincipalEx(PrincipalContext context, 
         string samAccountName, 
         string password, 
         bool enabled) : base(context, samAccountName, password, enabled) 
    {} 

    // Create the "Manager" property.  
    [DirectoryProperty("manager")] 
    public string Manager 
    { 
     get 
     { 
      if (ExtensionGet("manager").Length != 1) 
       return string.Empty; 

      return (string)ExtensionGet("manager")[0]; 
     } 
     set { ExtensionSet("manager", value); } 
    } 

    // Implement the overloaded search method FindByIdentity. 
    public static new UserPrincipalEx FindByIdentity(PrincipalContext context, string identityValue) 
    { 
     return (UserPrincipalEx)FindByIdentityWithType(context, typeof(UserPrincipalEx), identityValue); 
    } 

    // Implement the overloaded search method FindByIdentity. 
    public static new UserPrincipalEx FindByIdentity(PrincipalContext context, IdentityType identityType, string identityValue) 
    { 
     return (UserPrincipalEx)FindByIdentityWithType(context, typeof(UserPrincipalEx), identityType, identityValue); 
    } 
} 

現在你可以找到並使用一個UserPrincipalEx類,其中有.Manager物業供您使用:

UserPrincipalEx userEx = UserPrincipalEx.FindByIdentity(ctx, "YourUserName"); 

// the .Manager property contains the DN (distinguished name) for the manager of this user 
var yourManager = userEx.Manager; 
+0

我想我必須爲每一個屬性是不是UserPrincipal類的「標準」部分,如電子郵件地址或自定義屬性,如WorkCellPhone做到這一點? – RatBoyStl

+0

@ user574376:是的 - 但是當然,您可以有一個包含所有這些屬性的UserPrincipalEx'類 - 這就是我所擁有的,上面的代碼只是我真正的類中的一小部分。 –

+0

有沒有更簡單的方法來做到這一點?像我在搜索初始UserPrincipal對象時調用PropertiesToLoad一樣?這似乎需要很多工作才能完成。 – RatBoyStl

3

我喜歡的例子,但完全得到RatBoyStl來自哪裏。有時你只想要一個價值而不是一個新的課程。

如果您有給定用戶的UserPrinciple對象,那麼您可以使用此代碼輕鬆檢索管理器屬性。我向前邁了一步,用經理價值找到他們的UserPrinciple並顯示電子郵件地址。

  //set the principal context to the users domain 
     PrincipalContext pc = new PrincipalContext(ContextType.Domain, userDomain); 

     //lookup the user id on the domain 
     UserPrincipal up = UserPrincipal.FindByIdentity(pc, userId); 
     if (up == null) 
     { 
      Console.WriteLine(string.Format("AD USER NOT FOUND {0}", userGc)); 
      return; 

     } 

     //grab the info we need from the domain 
     Console.WriteLine(up.ToString()); 

     DirectoryEntry d = up.GetUnderlyingObject() as DirectoryEntry; 
     string managerCN = d.Properties["manager"].Value.ToString(); 
     Console.WriteLine(managerCN); 

     UserPrincipal manager = UserPrincipal.FindByIdentity(pc, managerCN); 
     Console.WriteLine(manager.EmailAddress); 
+0

我有可怕的運氣讓PrincipalEx Save實際保存在Active Directory中,但GetUnderlyingObject()方法簡化了使用舊的方式設置屬性[X] ...謝謝。 – Dscoduc

相關問題