Active Directory:添加新用户C#/ VB

时间:2018-12-06 14:51:50

标签: vb.net active-directory user-permissions

我浏览了其他问题,找不到答案。

当运行应用程序的“当前用户”没有访问权限来添加新用户时,将新用户添加到特定于活动目录的组的合适方法是什么?

我目前正在作为域管理员进行身份验证,但这显然是一项安全性,我不希望将管理员用户的凭据硬编码在我的代码中。

我认为答案不在我的代码本身中,而是我必须在Active Directory中创建一个具有添加用户特权的用户。

所以我的问题是AD和编码问题的组合:

1)如何创建仅具有访问权限的AD用户,才能将用户添加到特定的OU和CN安全组?

2)他们有什么办法可以不对该用户的密码进行硬编码?

或者...我要完全解决这个问题吗?

这是我当前的VB.NET代码:

 Public Function CreateUser(ByVal UserName As String, ByVal Password As String, ByVal DisplayName As String) As Boolean
    Try

        'Dim catalog As Catalog = New Catalog()
        Dim de As DirectoryEntry = New DirectoryEntry()

        de.Path = "LDAP://OU=TS2xUsers,DC=dc,DC=example,DC=com"
        de.AuthenticationType = AuthenticationTypes.Secure
        de.Username = "Administrator"
        de.Password = "foopassword"

        '1. Create user accountd
        Dim users As DirectoryEntries = de.Children
        Dim newuser As DirectoryEntry = users.Add("CN=" & DisplayName, "user")
        newuser.Properties("givenname").Value = DisplayName
        newuser.Properties("name").Value = DisplayName
        newuser.Properties("displayName").Value = DisplayName
        newuser.Properties("SAMAccountName").Value = UserName
        newuser.Properties("userPrincipalName").Value = UserName & "@dc.example.com"
        'newuser.Properties("OU").Value = "TS2xUsers"

        newuser.CommitChanges()


        Dim ret As Object = newuser.Invoke("SetPassword", Password)
        newuser.CommitChanges()

        Dim exp As Integer = CInt(newuser.Properties("userAccountControl").Value)
        exp = exp And Not &H2 'enable acccount
        exp = exp Or &H10000 'dont expire password
        newuser.Properties("userAccountControl").Value = exp
        newuser.CommitChanges()
        ''' 5. Add user account to groups
        If MakeTSUser(newuser) = False Then
            Return False
            newuser.Close()
            de.Close()
        End If

        newuser.Close()
        de.Close()
        Return True


    Catch ex As Exception
        MsgBox("Failed to create user due to the following reason: " & ex.Message, MsgBoxStyle.Critical)
        Return False
    End Try

End Function

Private Function MakeTSUser(ByVal deUser As DirectoryEntry) As Boolean
    Try


        Dim deRBGroup As New DirectoryEntry
        deRBGroup.Path = "LDAP://CN=TSUsers,CN=Builtin,DC=dc,DC=example,DC=com"
        deRBGroup.AuthenticationType = AuthenticationTypes.Secure
        deRBGroup.Username = "Administrator"
        deRBGroup.Password = "foopassword"

        Dim deDomainUsers As New DirectoryEntry
        deDomainUsers.Path = "LDAP://CN=Domain Users,CN=Users,DC=dc,DC=example,DC=com"
        deDomainUsers.AuthenticationType = AuthenticationTypes.Secure
        deDomainUsers.Username = "Administrator"
        deDomainUsers.Password = "foopassword"

        Dim primaryGroupToken As Object = Nothing

        deRBGroup.Invoke("Add", New Object() {deUser.Path.ToString()})
        deRBGroup.CommitChanges()

        'Get Primary Group Token of MYGROUP

        deRBGroup.Invoke("GetInfoEx", New Object() {New Object() {"primaryGroupToken"}, 0})

        primaryGroupToken = deRBGroup.Properties("primaryGroupToken").Value


        'Assign Primary Group Token value of MYROUP to the User's PrimaryGroupID

        deUser.Properties("primaryGroupID").Value = primaryGroupToken

        deUser.CommitChanges()


        'Remove the User from "Domain Users" group
        deDomainUsers.Invoke("Remove", New Object() {deUser.Path.ToString()})
        deDomainUsers.CommitChanges()

        Return True
    Catch ex As Exception
        Return False
    End Try


End Function

1 个答案:

答案 0 :(得分:1)

  

当运行应用程序的“当前用户”没有访问权限来添加新用户时,将新用户添加到特定于活动目录的组的合适方法是什么?

以具有这些权限的用户身份运行应用程序...但是您已经知道这一点:

  

我认为答案是...在Active Directory中创建具有添加用户特权的用户。

     

他们有什么办法可以不对该用户的密码进行硬编码?

好问题。通过设置Windows计划任务来执行此操作的一种方法。您可以将任务设置为按需运行,而没有实际时间表,并以所需的任何用户身份运行,包括您的新服务帐户。设置任务时,您将必须输入该用户的密码,但是只有在首次设置任务时,才需要输入该用户的密码,而实际的密码将不会被存储,仅存储身份验证令牌,该令牌不可转让。然后,您的桌面应用程序可以触发任务开始。

另一种方法是将运行您的应用的非特权HR或帮助台用户授予create new users just within your specific OU权限。对于Web应用程序,只要您有适当的日志记录和审核,您也可以为运行该网站的用户帐户执行此操作。

另一个选择是创建一个单独的服务来创建用户,该服务以适当的用户身份运行。这可以是Web服务,特权较低的经过身份验证的用户可以在其中发布新的帐户信息,也可以是Windows服务,例如在观看文件共享时执行此操作,然后您的非特权用户可以使用该功能或​​写入文件共享。这样,您的程序就可以知道如何调用服务或将正确的文件格式写入共享。