2013-07-03 58 views
3

我想創建一個新的AD用戶使用此代碼:在C#創建AD用戶

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "Domain", "ou=some_ou, dc=Mydomain"); 
UserPrincipal user = new UserPrincipal(ctx, account, passwd, true); 
user.GivenName = Givenname; 
user.Surname = Surname; 
user.DisplayName = Displayname; 
user.UserPrincipalName = account + "@Domain";     
user.Save(); 

用戶沒有錯誤產生。但我也必須設置如地址等方面的性能,所以代碼繼續:

string distname = user.DistinguishedName; 
DirectoryEntry duser = new DirectoryEntry(distname); 
try 
{ 
    duser.Properties["company"].Value = "Company"; 
} 
catch (Exception e) 
{ 
} 

現在我越來越

Error: System.Exception._COMPlusExceptionCode -532459699

字符串distname顯示正確的專有名稱。

+0

能不能請你[這](http://thekindofme.wordpress.com/2009/07/10/complusexceptions-在網/)?它應該給你另一個正在拋出異常的看法。它可能比代碼更具信息性。 – Caramiriel

+1

異常發生在哪一行,並且這個新的目錄條目代碼發生在你調用'user.Save()'之前還是之後? –

回答

2

我不是100%確定是什麼原因導致你的問題,但有一兩件事,可能使事情變得更容易對你和可以澄清一些錯誤,因爲你不恰當地使用這兩種DirectoryServicesDirectoryServices.AccountManagement在同一時間爲creating a new class that includes the company attribute

其實並不難。

[DirectoryObjectClass("user")] 
[DirectoryRdnPrefix("CN")] 
public class UserPrincipalEx : UserPrincipal 
{ 
    public UserPrincipalEx(PrincipalContext context) : base(context) { } 

    public UserPrincipalEx(PrincipalContext context, string samAccountName, string password, bool enabled) 
     : base(context, samAccountName, password, enabled) 
    { 
    } 

    [DirectoryProperty("company")] 
    public string Company 
    { 
     get 
     { 
      if (ExtensionGet("company").Length != 1) 
       return null; 

      return (string)ExtensionGet("company")[0]; 

     } 
     set { this.ExtensionSet("company", value); } 
    } 
} 

然後,您可以只修改代碼以

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "Domain", "ou=some_ou, dc=Mydomain"); 
UserPrincipalEx user = new UserPrincipalEx(ctx, account, passwd, true); 
user.GivenName = Givenname; 
user.Surname = Surname; 
user.DisplayName = Displayname; 
user.UserPrincipalName = account + "@Domain"; 
user.Company = "Company"; 
user.Save(); 

我的直覺是你有某種形式的互動與活動目錄交互的兩種方法,如果切換到一個單一界面對問題可能會消失。

0

對於DirectoryEntry,您必須指定協議(LDAP,GC,WinNT,...)。所以,你必須做的:

DirectoryEntry duser = new DirectoryEntry("LDAP://" + distname); 

注意,該協議是大小寫敏感的,LDAP必須是全部大寫。

0

我看到你正在使用的UserPrincipal憑證,

難道你忘了創建DirectoryEntry的時候使用它們? 此外,您還需要添加 「LDAP://」 您的服務器名稱前

試着這麼做:

DirectoryEntry duser = new DirectoryEntry("LDAP://" + distname); 
duser.Username = account; 
duser.Password = passwd; 
duser.AuthenticationType = AuthenticationTypes.Secure; 
相關問題