2014-07-22 106 views
0

我想在AD创建一个新用户。我使用以下代码:调用的目标引发了异常。引发UserPrincipal

 using (var context = new PrincipalContext(ContextType.Domain, this.DomainName, userWithWMIAccessRights, userWithWMIAccessrightsPassword)) 
     { 
      UserPrincipal user = new UserPrincipal(context); 
      user.DisplayName = Newusername; 
      user.Name = Newusername; 
      user.Enabled = true; 
      user.SetPassword(passwordOfThenewUser); 
      user.Save(); //<-- throws exception InnerException = {"Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))"} 
      return user; 
     } 

我设置的userWithWMIAccessrightsPassword那样:

  • userWithWMIAccessrightsPassword是Enterpirse管理员,域管理员和域用户
  • 的构件冉从命令提示DCOMCNFG 。
  • 从服务列表中选择Windows Management Instrumentation。
  • 通过从安全选项卡添加userWithWMIAccessrightsPassword帐户更新了自定义权限,并授予他完全的权限。

该web应用程序与AD运行在同一台机器上。当我使用Visual Studio调试Web应用程序时,用户和密码设置没有问题。

当在AD机器上部署Web应用程序时,创建用户的函数会在设置密码的代码行中抛出{“Access is denied。(Exception from HRESULT:0x80070005(E_ACCESSDENIED))”}。用户被创建并且没有被启用并且没有密码。

当PrincipalContext使用完全权限的AD用户时,为什么我会得到Access拒绝?

回答

0

好吧,似乎PrincipalContext是!= impersionating。

我可以解决这个问题有:

1)设置PrincipalContext的容器,并调用ValidateCredentials(this.UserName,this.Password,ContextOptions.Negotiate)。

2)

using (new Impersonator(this.UserName, this.DomainName, this.Password, LogonType.LOGON32_LOGON_SERVICE, LogonProvider.LOGON32_PROVIDER_WINNT40)) 
     { 
      using (var context = CreatePrincipalContext()) 
      { 
       UserPrincipal user = new UserPrincipal(context); 
       user.DisplayName = username; 
       user.Name = username; 
       user.Enabled = true; 
       user.SetPassword(password); 
       user.Save(); 
       return user; 
      } 
     } 

但我还是感到困惑,需要与Principalcontext冒领类的。我认为PrincipalContext取代了impersionate类。

相关问题