2012-08-27 91 views
5

我有一個Access應用程序,需要用戶輸入他們的Windows域用戶名和密碼才能進入。我用下面的VBA代碼來實現:VBA:使用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 

我注意到,有時當輸入正確的信息,訪問被拒絕。我試圖調試一次,並在Set oADsObject = oADsNamespace.OpenDSObject)行發出錯誤:「網絡路徑未找到。」 「。

不知道爲什麼有時會出現這種情況。轉換爲LDAP更好嗎?我嘗試過但無法正確構建LDAP URL。

+1

我不知道如何回答你的問題,但玩弄你的代碼,它看起來像我得到一個真正的函數,只要傳遞一個有效的strUserName和strDomain即使密碼是「」 –

+0

這就像一擊或錯過。奇怪的行爲。 – Rick

+0

我最終使用'選擇比較二進制'而不是'選項比較數據庫'推理是'選項比較數據庫'不能給你很好的控制CASES –

回答

3

如果用戶已通過他們的Windows登錄進行身份驗證,爲什麼要讓他們再次輸入詳細信息?

如果您需要知道哪些用戶登錄,就可以非常容易地通過下面的函數獲取用戶名:

 
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非常感謝你分享這種方法。 –

0

在良好規範的環境是另外需要至少輸入密碼。無論您是否登錄Windows,都無關緊要,您需要再次確認。