【问题标题】:.NET and Active Directory - System.Exception: General access denied error.NET 和 Active Directory - System.Exception:一般访问被拒绝错误
【发布时间】:2011-03-31 13:38:47
【问题描述】:

我在尝试创建新用户时不断收到此错误。

这是我的代码中出现错误的部分:

Public Function CreateAdAccount(ByVal sUserName As String, ByVal sPassword As String, ByVal sFirstName As String, ByVal sLastName As String, ByVal sGroupName As String) As Boolean
   Dim bResult As Boolean = True
   Dim dirEntry As New DirectoryEntry(ADFullPath)

   SetCultureAndIdentity()

   ' 1. Create user account
   Dim adUsers As DirectoryEntries
   Dim newUser As DirectoryEntry

   If Not UserExists(sUserName) Then
      Try
         adUsers = dirEntry.Children
         newUser = adUsers.Add("CN=" & sUserName, "user")

         ' 2. Set properties
         SetProperty(newUser, "givenname", sFirstName)
         SetProperty(newUser, "sn", sLastName)
         SetProperty(newUser, "SAMAccountName", sUserName)
         SetProperty(newUser, "userPrincipalName", sUserName)
         SetProperty(newUser, "displayName", sFirstName & " " & sLastName)

         Try
            newUser.CommitChanges()
         Catch ex As Exception
            Err.Raise(4938, "clsSource", ex.Message)
         End Try

错误发生在这一行:newUser.CommitChanges()

我似乎无法弄清楚它为什么会不断损坏。我试图以管理员身份登录 AD 并创建一个新用户。效果很好……

【问题讨论】:

  • 代码在什么上下文环境下实际运行?这是一个 Web 应用程序/Windows 应用程序吗?如果它作为 web 应用程序运行,则 web 应用程序运行的上下文,即应用程序池可能没有足够的权限来 AD
  • 它是一个网络应用程序。我没有意识到我必须把它放在不同的应用程序池中......我现在看看。在 IIS 或 AD 中设置池权限?
  • 好吧,您必须将它放在不同的应用程序池中,您有几个选择,您可以在拨打电话之前模拟身份并且不更改应用程序池设置,或者您可以创建一个单独的应用程序池并使该应用程序池在具有 AD 权限的域帐户的上下文下运行,无论哪种方式,由于 Web 应用程序将查询广告,调用所在的安全上下文需要拥有适当的权利,有几种不同的方法可以解决这个问题。
  • 我在我的网络配置中添加了“模拟”,看起来它有效:)
  • 另外,您知道,现在整个应用程序将在访问用户的凭据下运行,这在某些情况下可能是不可取的,仅供参考。

标签: .net active-directory


【解决方案1】:

如果您使用的是 .NET 3.5 及更高版本,则应查看 System.DirectoryServices.AccountManagement (S.DS.AM) 命名空间。在此处阅读所有相关信息:

Managing Directory Security Principals in the .NET Framework 3.5

基本上,您可以定义域上下文并轻松创建新用户:

// set up domain context
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

// create a new user
UserPrincipal newUser = new UserPrincipal(ctx);

// define properties
newUser.GivenName = sFirstName;
newUser.Surname = sLastName;
newUser.SamAccountName = sUserName;
newUser.UserPrincipalName = sUserName;
newUser.DisplayName = sFirstName + " " + sLastName;

// save changes
newUser.Save();

我不确定您在 sUserName 中有什么 - 但 .UserPrincipalName 属性应该始终类似于 someuser@somedomain.com - 您的用户名是否包含这样的值?如果不是 - 也许尝试使用这种表示法作为您的用户主体名称。

新的 S.DS.AM 让在 AD 中与用户和组一起玩变得非常容易:

【讨论】:

    猜你喜欢
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    相关资源
    最近更新 更多