分享

如何验证我的本地用户帐户没有一个具有空密码?

 星爷 2006-04-28

如何验证我的本地用户帐户没有一个具有空密码?

问:

你好,脚本专家!如何验证我的本地用户帐户没有一个具有空密码?

-- TB

答:

你好,TB。首先,应当指出你们当中至少一部分人不需要对你们域内的计算机做此项检查;因为域中使用了密码策略,该策略禁止使用空密码。(例如,您可能需要长度至少为 7 个字符的密码,这是一项防止任何人使用空密码的策略。)然而,对于没有密码策略的组织(工作组或家庭计算机),您可以使用如下的脚本来检查空密码:

On Error Resume Next
Set objNetwork = CreateObject("Wscript.Network")
strComputer = objNetwork.ComputerName
strPassword = ""
Set colAccounts = GetObject("WinNT://" & strComputer)
colAccounts.Filter = Array("user")
For Each objUser In colAccounts
objUser.ChangePassword strPassword, strPassword
If Err = 0 or Err = -2147023569 Then
Wscript.Echo objUser.Name & " is using a blank password."
End If
Err.Clear
Next

当然,你们当中有些人看到这里可能会想“这真是一个短小精悍的脚本,使用它就没问题了。”但是,为什么您刚才没有运行某种查询来查找具有空密码的用户列表?这样做有一个充分的理由:没有办法运行这样一个查询。即使作为管理员,我们也不能编写一个检索用户密码的脚本;没有办法获得该信息。

因此,我们必须在这方面动动脑筋。然而,我们要做的是尝试使用 ChangePassword 方法更改用户的密码。ChangePassword 要求我们知道用户的当前密码;在此脚本中,我们将尝试使用一个空密码作为用户的当前密码。如果该脚本失败,则意味着该用户没有使用空密码。然而,如果该脚本成功,则只能意味着一件事情:该用户确实使用的是空密码。在该情况下,我们将回显该用户的名称。

若要实现此目的,我们先添加 On Error Resume Next 语句,创建 Wscript.Network 对象的一个实例,然后检索 ComputerName 属性的值;足够幸运的是,ComputerName 恰好是本地计算机的名称。将一个名为 strPassword 的变量设置为空字符串 (“”),然后使用下面这行代码绑定到本地计算机:

Set colAccounts = GetObject("WinNT://" & strComputer)

建立该连接后,接下来将应用一个筛选器以确保我们只处理用户帐户(我们不想在本地安全帐户管理器中发现的打印机、服务器、组或其他对象上浪费时间):

colAccounts.Filter = Array("user")

应用过滤器后,将为我们留下一个仅包含本地用户帐户的集合;接着,我们设置一个 For Each 循环以遍历该集合。对于集合中的每个帐户,调用 ChangePassword 方法,为第一个参数(当前密码)和第二个参数(新密码)都传递变量 strPassword:

objUser.ChangePassword strPassword, strPassword

然后,立即检查 Err 对象的值。如果 ChangePassword 成功,Err 将等于 0;这意味着该用户有一个空密码。或者,Err 可能等于 -2147023569;这意味着该方法将会成功,只是由于本地策略,自上次密码更改以来还未经过足够的时间。但是,因为该方法将会成功,所以我们知道该用户有一个空密码。如果其中一个条件为 True,我们将回显该用户的名称。

注意。是的,从技术上讲,我们也更改密码,尽管只是将其更改为空密码(即其当前值)。这意味着用户仍能够用空密码登录。如果需要,我们可以为传递给 ChangePasswor 的第二个参数输入值(而不是一个空字符串)。在该情况下,运行该脚本将为用户产生一个新密码(而不管第二个参数使用何值)。

然后,清除错误对象 (Err.Clear) 的值,再循环测试下一个帐户。

当然,您可以很容易地将此脚本修改为处理 Active Directory 帐户。这里有一个示例脚本,用于测试域 fabrikam.com 中的所有帐户:

On Error Resume Next
Const ADS_SCOPE_SUBTREE = 2
strPassword = ""
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand =   CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
objCommand.CommandText = _
"SELECT AdsPath FROM ‘LDAP://dc=fabrikam,dc=com‘ WHERE objectCategory=‘user‘"
Set objRecordSet = objCommand.Execute
objRecordSet.MoveFirst
Do Until objRecordSet.EOF
strPath = objRecordSet.Fields("AdsPath").Value
Set strUser= GetObject(strPath)
strUser.ChangePassword strPassword, strPassword
If Err= 0 or Err = -2147023569 Then
Wscript.Echo strUser.CN
End If
Err.Clear
objRecordSet.MoveNext
Loop

如果您使用此脚本,那么请记住,它将尝试更改所有用户帐户的密码。如果您有数百或数千个帐户,则该脚本会花一小时,甚至更长时间才能运行完。那没什么不对的,只要知道就行了。

当然,您也可以将此脚本修改为测试其他密码。想知道是否有人具有一个“password”密码吗?那么,只需相应地设置 strPassword 的值:

strPassword = "password"

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多