2015-04-17 6 views
0

Я получаю ошибки на код ниже:Visual Basic и Active Directory

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, "[email protected]") 

    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 (фильтр As String)': Значение типа 'System.DirectoryServices.DirectoryEntries' не может быть преобразовано в 'String'. 'Public Sub New (searchRoot As System.DirectoryServices.DirectoryEntry)': Значение типа 'System.DirectoryServices.DirectoryEntries' не может быть преобразовано в 'System.DirectoryServices.DirectoryEntry'.

и

Ошибка 1 Тип 'System.DirectoryServices.DirectoryEntries' не имеет конструкторов.

Моя цель - проверить подлинность AD, если пользователь является членом определенной группы AD.

Любая помощь была бы принята с благодарностью.

ответ

0

Похоже, вы используете класс 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) 
+0

Это устраняет мои ошибки. Теперь форма входа в систему не запускается после нажатия OK. Возможно ли, что код сканирует активный каталог и занимает много времени для аутентификации? Или, скорее, мой код после действия после правильной кодировки? – Lee

0

Я считаю, что ваше заявление dirEntry должно быть следующим:

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

Вот весь код после изменений

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 

End Class

Теперь форма Логин не происходит один раз нажав кнопку OK. Возможно ли, что код сканирует активный каталог и занимает много времени для аутентификации? Или, скорее, мой код после действия после правильной кодировки? -