Active Directory用户绑定没有Environ(“密码”)?

时间:2010-03-05 17:49:14

标签: authentication vba active-directory

我想重复使用Windows身份验证绑定到Active Directory用户并检查组成员身份。

我可以使用Environ("username")获取Windows用户名,但如何获取密码?我不想要求用户重新输入密码,但没有Environ("password")

如何使此代码生效?

谢谢!

Private Sub ADsAuthenticate()

    Dim objConnection As New ADODB.Connection
    Dim objRecordset As ADODB.Recordset
    Dim objADsUser As IADsUser
    Dim objADsGroup As IADsGroup
    Dim strUsername As String
    Dim strPassword As String

    strUsername = Environ("username")
    strPassword = Environ("password")

    With objConnection
        .Provider = "ADsDSOObject"
        .Properties("User ID") = strUsername
        .Properties("Password") = strPassword
        .Properties("Encrypt Password") = True
        .Open "ADs Provider"
        Set objRecordset = .Execute("<LDAP://<server>/dc=<domain>,dc=com>;" _
        & "(sAMAccountName=" & strUsername & ");ADsPath;Subtree")
    End With

    With objRecordset
        If Not .EOF Then
            Set objADsUser = GetObject("LDAP:").OpenDSObject(.Fields("ADsPath").Value, strUsername, strPassword, ADS_SECURE_AUTHENTICATION)
            Debug.Print objADsUser.ADsPath
            For Each objADsGroup In objADsUser.Groups
                Debug.Print objADsGroup.Name
            Next
        End If
    End With

    objConnection.Close

End Sub

1 个答案:

答案 0 :(得分:2)

是什么让您确信密码可以在任何地方首先阅读?

保留密码的可接受方法是仅存储密码的单向散列(通常使用BCrypt散列算法加上salt / nonce),并且当有人登录时使用相同的散列技术对尝试的密码进行查看如果它与您的存储值匹配。而不是存储诸如password1之类的可读内容(警告:错误的密码示例!),最终存储的内容更像23e598ac098da42==,对于破解者来说更有用。

这就是为什么如果你丢失了密码,大多数系统都要求你重置密码而不是为你恢复旧密码 - 他们甚至没有真正的旧密码副本给你。