在 Active Directory 中轮换密码
用于轮换 Windows Active Directory 密码的工具。
引言
此工具将轮换您的 Active Directory 密码,通常允许您将密码“更改”为相同的密码。
背景
我的公司强制我每 30 天更改一次密码。我喜欢这个策略,但我也喜欢只使用几个密码:我可能能记住 2 或 3 个,但绝对记不住 15 个。不幸的是,我什至无法将密码更改回一个月前使用的值。Active Directory 域规则禁止我这样做。
没有什么小软件不能解决的 :)
使用该工具和 ActiveDirectory 策略
在运行该工具之前,您应该了解几个 Active Directory 策略 (GPO)。它们会强制执行一些限制,这些限制可能会导致您的帐户被锁定,并给您的 IT 部门带来麻烦。您需要知道在被锁定之前可以发出多少密码更改请求、密码复杂性规则是什么,以及 Active Directory “记住”多少个密码。
有一些文章描述了这些策略本身。
实现
更改 Active Directory 密码
Active Directory 函数在 System.DirectoryServices 程序集中公开,并通过 Active DS Type Library(COM 对象 (activeds.dll))在所有 Windows 系统上注册。第一步是添加对两者的引用。第一个将为我们提供 LDAP 功能来定位 Active Directory 用户记录,第二个将更改密码。
更改密码的完整代码如下所示
IADsADSystemInfo sysInfo = new ADSystemInfoClass();
DirectoryEntry currentUser =
new DirectoryEntry(string.Format("LDAP://{0}", sysInfo.UserName));
object[] passwordChangeRequest = new object[]
{
oldPassword,
newPassword
};
currentUser.Invoke("ChangePassword", passwordChangeRequest);
currentUser.CommitChanges();
请注意,由于更改方法是在 COM 中实现的,因此从此代码引发的异常是通用包装器,因此真正的异常位于异常的 InnerException
中。
生成随机密码
因为我们将要轮换密码,所以我们需要许多看似随机的密码,这些密码符合当前 Active Directory 域的安全要求。我发现了一个写得很好且可以随时使用的 Obviex RandomPassword Class 可以做到这一点。
整合起来
还有几件事要做:传递命令行参数并循环以更改实际密码。我使用了 Peter Hallam 的 CommandLine Argument Parser 并公开了包括要轮换的密码数量和模拟模式在内的选项。
源代码和补丁
本文和源代码的最新版本始终可以在 Subversion 的 此链接下找到。您也可以浏览源代码。您可以在 code.dblock.org 找到有关此库的最新信息。我们鼓励您提交补丁以添加功能和修复错误,请将所有内容发送至 dblock at dblock dot org。
历史
- 2009 年 1 月 9 日:初始版本。