从 Active Directory 获取用户密码

Posted

技术标签:

【中文标题】从 Active Directory 获取用户密码【英文标题】:Getting user password from Active Directory 【发布时间】:2010-09-27 06:49:12 【问题描述】:

我在我的 ASP.NET 项目中使用活动目录,并且每当用户在站点中注册时,都会在 AD 中创建一个帐户。有一个忘记密码的链接。是否可以从AD获取用户密码。我可以获取姓名或电子邮件,但我不知道我是否可以获取密码。

【问题讨论】:

【参考方案1】:

那是不可能的。我建议您不要实现“忘记密码”功能,而是“重置密码”。您生成一个新密码,在 Active Directory 中重置密码并将新密码发送给用户。

编辑:根据您评论中的信息。首先,以您现在使用的方式使用管理员帐户是一个非常个坏主意,将帐户名和密码作为代码的一部分。您正在运行一个 ASP.NET 站点,因此您应该配置应用程序池以使用此帐户运行。

其次,您应该使用正确的路径创建一个DirectoryEntry 并重置密码。我不确定你的oEntry 是什么:

var userEntry = new DirectoryEntry(
    "LDAP://CN=SomeUser,OU=Users,DC=yourdomain,DC=com");
using (userEntry)

    userEntry.Invoke("SetPassword", new object[]  "NewPassword" );
    userEntry.CommitChanges();

【讨论】:

如果我想以编程方式重置密码,那么我们必须使用旧密码才能从 AD 访问用户?那么我们如何重置密码。除了我选择的方法之外,还有其他方法吗 @Abhimanyu - 您不需要旧用户密码来重置密码。您只需要足够的权限(帐户操作员)。 我正在使用下面的代码进行重置,DirectoryEntry oEntry = new DirectoryEntry("path", "admin", "pwd"); DirectoryEntry uEntry = new DirectoryEntry(Label2.Text); uEntry.Invoke("SetPassword", new object[] newPwd ); uEntry.Properties["LockOutTime"].Value = 0; //解锁账户 uEntry.Close();但它不起作用。我给予足够的权利【参考方案2】:

不可能从活动目录中获取用户的现有密码,因为它是用 sid 散列的。但是您可以获得为 AD 中的用户设置的新密码。为此,您需要在每个域控制器中注册一个密码过滤器。每当密码更改请求来到 dc 时,它都会在前、后向用户调用已注册的密码过滤器。

参考链接https://msdn.microsoft.com/en-us/library/windows/desktop/ms721882(v=vs.85).aspx

【讨论】:

以上是关于从 Active Directory 获取用户密码的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Active Directory 验证最后一个密码?

在不询问用户名和密码的情况下验证 Active Directory 用户

根据 Active Directory 策略检查密码 [重复]

从Active Directory获取用户

将用户从 CSV/Excel 导入 Active Directory

LDAP:如何从 Active Directory 中获取所有用户和组