我浏览了其他问题,找不到答案。
当运行应用程序的“当前用户”没有访问权限来添加新用户时,将新用户添加到特定于活动目录的组的合适方法是什么?
我目前正在作为域管理员进行身份验证,但这显然是一项安全性,我不希望将管理员用户的凭据硬编码在我的代码中。
我认为答案不在我的代码本身中,而是我必须在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
答案 0 :(得分:1)
当运行应用程序的“当前用户”没有访问权限来添加新用户时,将新用户添加到特定于活动目录的组的合适方法是什么?
以具有这些权限的用户身份运行应用程序...但是您已经知道这一点:
我认为答案是...在Active Directory中创建具有添加用户特权的用户。
他们有什么办法可以不对该用户的密码进行硬编码?
好问题。通过设置Windows计划任务来执行此操作的一种方法。您可以将任务设置为按需运行,而没有实际时间表,并以所需的任何用户身份运行,包括您的新服务帐户。设置任务时,您将必须输入该用户的密码,但是只有在首次设置任务时,才需要输入该用户的密码,而实际的密码将不会被存储,仅存储身份验证令牌,该令牌不可转让。然后,您的桌面应用程序可以触发任务开始。
另一种方法是将运行您的应用的非特权HR或帮助台用户授予create new users just within your specific OU权限。对于Web应用程序,只要您有适当的日志记录和审核,您也可以为运行该网站的用户帐户执行此操作。
另一个选择是创建一个单独的服务来创建用户,该服务以适当的用户身份运行。这可以是Web服务,特权较低的经过身份验证的用户可以在其中发布新的帐户信息,也可以是Windows服务,例如在观看文件共享时执行此操作,然后您的非特权用户可以使用该功能或写入文件共享。这样,您的程序就可以知道如何调用服务或将正确的文件格式写入共享。