我正在尝试编写一种方法,通过在代码中嵌入另一个帐户,让服务台人员拥有一个没有足够权限来重置密码的帐户,以做到这一点。
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)
答案 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对象的基本对象(属性和方法)。
DirectoryEntry
和DirectorySearcher
都根据this
实际上,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