2012-08-27 22 views
5

Tengo una Aplicación de acceso que requiere que el usuario ingrese su usuario y contraseña del dominio de Windows para ingresar. He utilizado el siguiente código VBA para lograr esto:VBA: Iniciar sesión usando la Autenticación de Windows

Function WindowsLogin(ByVal strUserName As String, ByVal strpassword As String, ByVal strDomain As String) As Boolean 
    'Authenticates user and password entered with Active Directory. 

    On Error GoTo IncorrectPassword 

    Dim oADsObject, oADsNamespace As Object 
    Dim strADsPath As String 

    strADsPath = "WinNT://" & strDomain 
    Set oADsObject = GetObject(strADsPath) 
    Set oADsNamespace = GetObject("WinNT:") 
    Set oADsObject = oADsNamespace.OpenDSObject(strADsPath, strDomain & "\" & strUserName, strpassword, 0) 

    WindowsLogin = True 'ACCESS GRANTED 

ExitSub: 
    Exit Function 

IncorrectPassword: 
    WindowsLogin = False 'ACCESS DENIED 
    Resume ExitSub 
End Function 

noto que a veces cuando se introduce correctamente la información, el acceso es denegado. Intenté depurar una vez y me dio el error: "La ruta de red no se encontró. " en la línea Set oADsObject = oADsNamespace.OpenDSObject).

No estoy seguro de por qué esto ocurre a veces. ¿Es mejor convertir a LDAP en su lugar? He intentado pero no puedo construir la URL de LDAP correctamente.

+1

No sé cómo responder a su pregunta, pero jugando con su código parece que obtengo un VERDADERO en su función siempre y cuando pase un nombre de usuario y un dominioStan válidos aunque la contraseña sea "" –

+0

Es como un acertar o fallar. Comportamiento extraño. – Rick

+0

Terminé usando 'opción comparar binario' en lugar de' opción comparar base de datos' razonamiento es que 'opción comparar base de datos' no le da un buen control de los CASOS –

Respuesta

3

Si el usuario ya está autenticado mediante su inicio de sesión de Windows, ¿por qué hacer que ingrese los detalles nuevamente?

Si lo que necesita saber qué usuario está conectado, se puede obtener el nombre de usuario muy fácilmente por la siguiente función:

 
Declare Function IGetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal sBuffer As String, lSize As Long) As Long 

Function GetUserName() As String 

    On Error Resume Next 

    Dim sBuffer As String 
    Dim lSize As Long 
    Dim x As Long 

    sBuffer = Space$(32) 
    lSize = Len(sBuffer) 
    x = IGetUserName(sBuffer, lSize) 
    GetUserName = left$(sBuffer, lSize - 1) 

End Function 

+0

+1 muchas gracias por compartir este tipo de enfoque. –

0

En el entorno GxP que es, además, necesario para entrar al menos una contraseña. No importa si está conectado a Windows, debe confirmarlo nuevamente.

Cuestiones relacionadas