【问题标题】:Visual Basic and Active DirectoryVisual Basic 和 Active Directory
【发布时间】:2015-04-17 17:16:58
【问题描述】:

我在以下代码中遇到错误:

  Private Function AuthenticateUser() As Boolean
    Dim username As String = txtbok_login_username.Text
    Dim password As String = txtbox_login_password.Text
    Dim domain As String = "domain.local"

    Dim isAuthenticated As Boolean = ValidateActiveDirectoryLogin(domain, username, password, "Admins@WokasCustomer.com")

    Return isAuthenticated
End Function




Public Function ValidateActiveDirectoryLogin(ByVal domainName As String, ByVal userName As String, ByVal userPassword As String, ByVal groupName As String) As Boolean
    Dim isValidated As Boolean = False

    Try

        Dim ldapPath As String = "LDAP://domain.local"
        Dim dirEntry As New DirectoryServices.DirectoryEntries(ldapPath, userName, password, authenticationtypes.secure)
        Dim dirSearcher As New DirectoryServices.DirectorySearcher(dirEntry)

        dirSearcher.Filter = "(userPrincipalName=" & userName & ")"
        dirSearcher.PropertiesToLoad.Add("memberOf")

        Dim result As DirectoryServices.SearchResult = dirSearcher.FindOne()

        If Not result Is Nothing Then

            If groupName.Length = 0 Then
                isValidated = True
            Else
                Dim groupCount As Integer = result.Properties("Fiserv Processing - MIS").Count
                Dim isInGroup As Boolean = False

                For index As Integer = 0 To groupCount - 1
                    Dim groupDN As String = result.Properties("Fiserv Processing - MIS").Item(index)

                    Dim equalsIndex As Integer = groupDN.IndexOf("=")
                    Dim commaIndex As Integer = groupDN.IndexOf(",")

                    Dim group As String = groupDN.Substring((equalsIndex + 1), (commaIndex - equalsIndex) - 1).ToLower
                    If group.Equals(groupName.ToLower) Then
                        isInGroup = True
                        Exit For
                    End If
                Next index

                isValidated = isInGroup
            End If
        End If
    Catch ex As Exception
        Throw New Exception(ex.Message)
    End Try

    Return isValidated

End Function

错误码如下:

错误 2 重载解析失败,因为无法使用以下参数调用可访问的“新”: 'Public Sub New(filter As String)':'System.DirectoryServices.DirectoryEntries' 类型的值无法转换为 '细绳'。 'Public Sub New(searchRoot As System.DirectoryServices.DirectoryEntry)':类型的值 'System.DirectoryServices.DirectoryEntries' 无法转换为 'System.DirectoryServices.DirectoryEntry'。

和

错误 1 ​​类型“System.DirectoryServices.DirectoryEntries”没有构造函数。

我的目标是让 AD 身份验证检查用户是否是特定 AD 组的成员。

任何帮助将不胜感激。

【问题讨论】:

    标签: vb.net active-directory directoryservices


    【解决方案1】:

    看起来您正在使用DirectoryEntries 类而不是DirectoryEntry 作为dirEntries 变量。 DirectorySearcher 没有构造函数允许它获取DirectoryEntries 对象(这是DirectoryEntry 对象的集合)。

    查看您正在使用的类的文档。

    https://msdn.microsoft.com/en-us/library/system.directoryservices.directorysearcher(v=vs.110).aspx

    https://msdn.microsoft.com/en-us/library/system.directoryservices.directoryentries(v=vs.110).aspx

    https://msdn.microsoft.com/en-us/library/system.directoryservices.directoryentry(v=vs.110).aspx

    Dim dirEntry As New DirectoryServices.DirectoryEntries(ldapPath, userName, password, authenticationtypes.secure)
    Dim dirSearcher As New DirectoryServices.DirectorySearcher(dirEntry)
    

    应该是

    Dim dirEntry As New DirectoryServices.DirectoryEntry(ldapPath, userName, password, authenticationtypes.secure)
    Dim dirSearcher As New DirectoryServices.DirectorySearcher(dirEntry)
    

    【讨论】:

    • 这消除了我的错误。现在,单击“确定”后登录表单不会继续。代码是否可能正在扫描活动目录并需要很长时间才能进行身份验证?还是更有可能我的身份验证后的操作后代码编码不正确?
    【解决方案2】:

    我相信你的 dirEntry 声明应该如下:

    Dim dirEntry As New DirectoryServices.DirectoryEntry(ldapPath, userName, userPassword, DirectoryServices.AuthenticationTypes.Secure)
    

    【讨论】:

      【解决方案3】:

      修改后的代码如下

      Public Class form_login
      
      
      
      Private Function AuthenticateUser() As Boolean
          Dim username As String = txtbok_login_username.Text
          Dim password As String = txtbox_login_password.Text
          Dim domain As String = "patten.local"
      
          Dim isAuthenticated As Boolean = ValidateActiveDirectoryLogin(domain, username, password)
      
          Return isAuthenticated
      End Function
      
      
      
      
      Public Function ValidateActiveDirectoryLogin(ByVal domainName As String, ByVal userName As String, ByVal userPassword As String, ByVal groupName As String) As Boolean
          Dim isValidated As Boolean = False
      
          Try
      
              Dim ldapPath As String = "LDAP://patten.local"
              Dim dirEntry As New DirectoryServices.DirectoryEntry(ldapPath, userName, userPassword, DirectoryServices.AuthenticationTypes.Secure)
              Dim dirSearcher As New DirectoryServices.DirectorySearcher(dirEntry)
      
      
              dirSearcher.Filter = "(userPrincipalName=" & userName & ")"
              dirSearcher.PropertiesToLoad.Add("memberOf")
      
              Dim result As DirectoryServices.SearchResult = dirSearcher.FindOne()
      
              If Not result Is Nothing Then
      
                  If groupName.Length = 0 Then
                      isValidated = True
                  Else
                      Dim groupCount As Integer = result.Properties("Fiserv Processing - MIS").Count
                      Dim isInGroup As Boolean = False
      
                      For index As Integer = 0 To groupCount - 1
                          Dim groupDN As String = result.Properties("Fiserv Processing - MIS").Item(index)
      
                          Dim equalsIndex As Integer = groupDN.IndexOf("=")
                          Dim commaIndex As Integer = groupDN.IndexOf(",")
      
                          Dim group As String = groupDN.Substring((equalsIndex + 1), (commaIndex - equalsIndex) - 1).ToLower
                          If group.Equals(groupName.ToLower) Then
                              isInGroup = True
                              Exit For
                          End If
                      Next index
      
                      isValidated = isInGroup
                  End If
              End If
          Catch ex As Exception
              Throw New Exception(ex.Message)
          End Try
      
          Return isValidated
      
      End Function
      
      
      
      Private Sub Cancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cancel.Click
          Me.Close()
      End Sub
      
      Private Sub UsernameLabel_Click(sender As Object, e As EventArgs) Handles UsernameLabel.Click
      
      End Sub
      
      Private Sub form_login_Load(sender As Object, e As EventArgs) Handles MyBase.Load
      
      End Sub
      

      结束类

      现在登录表单在单击“确定”后不会继续。代码是否可能正在扫描活动目录并需要很长时间才能进行身份验证?还是更有可能我的身份验证后的操作后代码编码不正确? ——

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-25
        • 1970-01-01
        相关资源
        最近更新 更多