您好,MG。很久以前,一个脚本专家在一所地方大学工作。在那个学校的某个部门中,很容易确定用户上次更改密码的时间:这是因为其行政助理持有一份列表,其中列出该部门中的所有用户及其密码,以及这些密码的更改日期和时间。更好的是,她将该列表保存在书桌上文件夹中;这样,如果有人忘记自己密码,只需取出文件夹查找密码。
当然,也能看见其他人的密码。
因此,这是确定用户上次更改密码的时间的一种方式。但这里有另外一种方式:
Set objUser = GetObject("LDAP://CN=myerken,OU=management,DC=Fabrikam,DC=com")
Wscript.Echo "Password last changed: " & objUser.PasswordLastChanged
是的,这是整个脚本;这可不象有些网站,只向您展示内容的开始部分,然后要求您付费才能看到其余部分。(虽然现在我们正在考虑这样做……。)如果要知道 Ken Myer 上次更改密码的时间,只需完成以下两个任务:
| • |
绑定到 Active Directory 中 Ken 的用户帐户。 |
| • |
在屏幕上回显 PasswordLastChanged 属性值。 |
这就是您需要做的一切。真的。
当然,我们假定您是在指 Active Directory 用户帐户;也很有可能您是指 Windows NT 4.0 用户帐户甚至是本地用户帐户。如果是那样,我们似乎有一点问题;毕竟您需要使用 WinNT 提供程序访问 NT 4.0 或本地用户帐户而 WinNT 提供程序不支持 PasswordLastChanged 属性。
因而,这是否意味着使用 NT 4.0 或本地用户帐户时我们运气不好呢?啊,你们应该更了解我们呐:
strComputer = "atl-ws-01"
Set objUser = GetObject("WinNT://" & strComputer & "/kenmyer")
intPasswordAge = objUser.PasswordAge
intPasswordAge = intPasswordAge * -1
dtmChangeDate = DateAdd("s", intPasswordAge, Now)
WScript.Echo "Password last changed: " & dtmChangeDate
正如您看到的,这个脚本稍微有点长,但仍然相当简单。我们首先连接到计算机 atl-ws-01 上的 Ken Myer 帐户(用户名 kenmyer)。(如果要连接到 NT 4.0 域怎么办?没问题,只需使用该域名替换值 atl-ws-01。)然后,我们取出 PasswordAge 属性值,将其存储在名为 intPasswordAge 的变量中。
我们不回显 PasswordAge 值会怎么样?嗯,PasswordAge 实际上表示自上次更改密码后过去的时间(秒数)。假定返回如下所示的答案:
50725249
您能马上从当前日期和时间减去 50725249 秒并计算出上次更改密码的时间吗?
真的?哇,真了不起。但是我们自己可做不到。因此,我们让脚本来做。首先取 intPasswordAge 值,然后将其乘上 -1:
intPasswordAge = intPasswordAge * -1
为什么?因为在紧接着的下一行代码中,我们将使用 DateAdd 函数确定上次设置密码的日期。要完成此任务,我们需要向 DateAdd 传送三个参数:
| • |
正在处理的时间间隔。因为 PasswordAge 按秒数存储,所以我们使用“s”作为第一个参数。 |
| • |
添加到当前日期的秒数。这是我们将 intPasswordAge 乘以 -1 的原因。实际上,我们不是要使用当前日期加上 intPasswordAge 进行计算;这会得到未来的某个时间。而是要从当前日期减去 intPasswordAge 进行计算;毕竟 intPasswordAge 是指从上次更改密码后过去的秒数。因为加上一个负数与减去一个正数作用相同,所以我们将 intPasswordAge 乘以 -1。 |
| • |
当前日期和时间。对于此参数,我们使用 VBScript 函数 Now。 |
任务完成;等式的结果存储在变量 dtmChangeDate 中,然后在最后一行代码中我们回显该变量的值。我们创建和测试此脚本时,它告诉我们上次更改密码的时间是 2003 年 11 月 22 日下午 12:02:10。(它也告诉我们,我们没有及时更新本地用户帐户密码。)