Authentication Active Directory用户绑定没有环境(“密码”)吗?

Authentication Active Directory用户绑定没有环境(“密码”)吗?,authentication,vba,active-directory,Authentication,Vba,Active Directory,我想重用Windows身份验证以绑定到Active Directory用户并检查组成员身份 我可以通过环境(“用户名”)获取Windows用户名,但如何获取密码?我不想要求用户重新输入密码,但是没有环境(“密码”) 我如何使这个代码工作 谢谢 Private Sub ADsAuthenticate() Dim objConnection As New ADODB.Connection Dim objRecordset As ADODB.Recordset Dim obj

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

我可以通过
环境(“用户名”)
获取Windows用户名,但如何获取密码?我不想要求用户重新输入密码,但是没有
环境(“密码”)

我如何使这个代码工作

谢谢

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
私有子ADsAuthenticate()
Dim objConnection作为新ADODB.Connection
Dim objRecordset作为ADODB.Recordset
Dim objADsUser作为IADsUser
Dim objADsGroup作为IADsGroup
Dim strUsername作为字符串
将strPassword设置为字符串
strUsername=Environ(“用户名”)
strPassword=Environ(“密码”)
有对象关联
.Provider=“ADsDSOObject”
.Properties(“用户ID”)=strUsername
.Properties(“密码”)=strPassword
.Properties(“加密密码”)=True
.打开“广告提供商”
Set objRecordset=.Execute(“;”_
&“(sAMAccountName=“&strUsername&”;ADsPath;子树)
以
使用objRecordset
如果不是,那么EOF
设置objADsUser=GetObject(“LDAP:”).OpenDSObject(.Fields(“ADsPath”).Value、strUsername、strPassword、ADS\u SECURE\u身份验证)
Debug.Print objADsUser.ADsPath
对于objADsUser.Groups中的每个objADsGroup
Debug.Print objADsGroup.Name
下一个
如果结束
以
对象连接。关闭
端接头

是什么让你如此确信密码在任何地方都可以读取

保存密码的公认方法是只存储密码的单向散列(通常使用BCrypt散列算法加上salt/nonce),当有人登录时,对尝试的密码使用相同的散列技术,以查看它是否与您存储的值匹配。与其存储可读的东西,如
password1
(警告:错误的密码示例!),不如存储像
23e598ac098da42==
这样的东西,这对破解者来说没什么用处


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

我需要密码绑定到用户对象,因此我想在用户启动应用程序时,我必须再次向用户询问密码,尽管这与他们登录Windows时使用的密码相同。谢谢您的反馈,Joel@Kuy-您应该能够在不重新提交用户名和密码的情况下检查Active Directory。只要你登录到windows,它就会知道你是谁。乔尔,你是对的。objConnection不需要用户名和密码,但OpenDSObject需要。是否有其他方法可以绑定到用户对象而不需要用户名和密码?再次感谢!知道了。OpenDSObject适用于域外的情况。在这种情况下,是的,您必须询问用户名和密码。如果它们在域内,您可以设置objADsUser=GetObject(.Fields(“ADsPath”)。再次感谢Joel。我将在发布更新的代码后关闭此项。