使用特权帐户重置AD用户帐户密码

时间:2018-08-22 20:25:30

标签: vb.net active-directory ldap impersonation

我正在尝试编写一种方法,通过在代码中嵌入另一个帐户,让服务台人员拥有一个没有足够权限来重置密码的帐户,以做到这一点。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim RootDSE As New DirectoryServices.DirectoryEntry("LDAP://something.com/OU=COW,DC=spmething,DC=com")
    Dim DomainDN As String = RootDSE.Properties("DefaultNamingContext").Value
    Dim ADEntry As New DirectoryServices.DirectoryEntry("LDAP://" & "DC=something,DC=com")
    Dim ADSearch As New System.DirectoryServices.DirectorySearcher(ADEntry)

    If RadioButton1.Checked = True Then
        ADSearch.Filter = ("(samAccountName=" & Loginnames.Text & ")")
        ADSearch.SearchScope = SearchScope.Subtree
        Dim UserFound As SearchResult = ADSearch.FindOne()
        If Not IsNothing(UserFound) Then
            Dim UserDirectoryEntry As DirectoryEntry = UserFound.GetDirectoryEntry
            UserDirectoryEntry.Invoke("SetPassword", New Object() {TextBox2.Text})
            '...
            email = UserFound.GetDirectoryEntry.Properties("userPrincipalName").Value
            MsgBox("Password has been rest!")

        End If
    End If

我需要使用除服务台以外的其他用户来执行此操作,因为服务台用户无权执行此操作。而且我们不想将任何东西都委派给他。

他现在遇到的错误是:0x80070005 (E_ACCESSDENIED)

1 个答案:

答案 0 :(得分:0)

我很久以前在VB6中使用过一次

Dim objDSO     As IADsOpenDSObject
Dim objUser    As IADsUser

Set objDSO = GetObject("LDAP:")
Set objUser = objDSO.OpenDSObject("LDAP://" & strUser, DELEGATE_ACCOUNTNAME, DELEGATE_PASSWORD, ADS_SECURE_AUTHENTICATION)

因此它也必须在VB.Net中可用,因为IADs接口定义了任何ADSI对象的基本对象(属性和方法)。 DirectoryEntryDirectorySearcher都根据this

使用Active Directory服务接口(ADSI)技术。

实际上,DirectoryEntry构造函数可以使用用于绑定的用户名和密码扩展,而不是当前正在运行脚本或应用程序的用户。所以代替

Dim ADEntry As New DirectoryServices.DirectoryEntry("LDAP://" & "DC=something,DC=com")

尝试

Dim ADEntry As New DirectoryServices.DirectoryEntry("LDAP://" & "DC=something,DC=com", DELEGATE_ACCOUNTNAME, DELEGATE_PASSWORD, 1)

,其中“ 1”是System.DirectoryServices身份验证类型“安全”的值。

此DELEGATE是您在您的域中设置的用户,请确保该用户具有重置密码和解锁用户帐户的权限(请参见下面的注释)。

DELEGATE_PASSWORD以纯文本给出,因此您需要某种方式将其隐藏在帮助台用户面前! 现在,Button1_Click子目录中的其余代码应使用该委托人的凭据来查找和设置密码。

注意:用户通常仅在尝试了太多次并且帐户被锁定后才致电帮助台,询问密码。因此,您的功能还应该在设置新密码之前解锁帐户。您可以通过检查用户的(int64)lockoutTime ldap属性来检查帐户是否被锁定。要解锁帐户,只需将此值设置为0L