2010-03-05 54 views
1

我想重新使用Windows身份验证来绑定到Active Directory用户并检查组成员资格。用于Active Directory用户绑定的No Environ(“密码”)?

我可以得到Windows用户名为Environ("username"),但是如何获取密码?我不想要求用户重新输入密码,但没有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 

回答

2

是什么让你如此确信密码是在任何地方读取第一个地方?

保持密码的可接受方式是仅存储密码的单向散列(通常使用BCrypt散列算法加上salt/nonce),并且当有人登录时,对尝试的密码使用相同的散列技术看看它是否符合你的储值。而不是像password1(警告:错误的密码示例!)那样存储可读的东西,而最终存储的东西更像23e598ac098da42==,这对饼干来说不太有用。

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

+0

我需要密码才能绑定到用户对象,所以我想我将不得不在用户启动应用程序时再次询问用户密码,尽管它与登录Windows时使用的密码相同。感谢Joel的反馈。 – Kuyenda 2010-03-05 18:32:15

+1

@Kuy - 你应该能够在不重新提交用户名和密码的情况下检查Active Directory。一个你登录到窗口,它知道你是谁。 – 2010-03-05 18:44:55

+0

乔尔,你是对的。 objConnection不需要用户名和密码,但OpenDSObject可以。是否有另一种方法绑定到用户对象而不需要用户名和密码?再次感谢! – Kuyenda 2010-03-05 18:56:01

相关问题