显示AD中账户密码过期时间

有俩个脚本,
一本脚本用户搜索AD中所有的账户,生成一个alluser.txt作为后一个脚本的输入:

'本脚本调用dsquery user命令获得AD中所有的用户账户名称
'将结果写入e:\allusers.txt文件中
'如果需要改变结果保存位置和名称,用新的文件名和路径替换e:\allusers.txt
'bob.xu@serviceit.com.cn


Set objShell = CreateObject("Wscript.Shell")
objShell.Run("%comspec% /k dsquery user -limit 500 >e:\allusers.txt")


第二个脚本检测所有用户账户的密码修改时间,判断密码是否过期,是否设置为密码永不过期,
结果生成一个csv,用excel直接打开就是一个完整的表格,具体如下:

'本脚本用于检查AD中所有用户账户密码过期状态
'可以判断密码设置为“永不过期”,最近一次修改密码时间,密码已经过期等状态
'结果保存为e:\passstate.csv,用户可以按需要自行改变结果位置、名称
'本脚本的运行是以ALLUsers.vbs的结果为依据
'如果改变了ALLUsers.vbs的默认输出结果,请修改InFile后面的信息
'bob.xu@serviceit.com.cn

On Error Resume Next

Const SEC_IN_DAY = 86400
Const ADS_UF_DONT_EXPIRE_PASSWD = &h10000
Const ForAppending = 8
Const E_ADS_Property_Not_Found = &h8000500D

Set fso = CreateObject("Scripting.FileSystemObject")

'如果用户改变了ALLUsers.vbs的默认输出结果,请修改InFile后面的信息
InFile = "e:\allusers.txt"       

'------------------- line 20 ----------------------------
'判断用户列表文件是否存在,该文件是由ALLUsers.vbs脚本生成
'如果文件不存在,给出提示并推出脚本运行
If not fso.FileExists(InFile) Then
    msgbox "No allusers.txt! Please run All Users.vbs first! ",48
    Wscript.quit
End If


'设置输出结果,用户可以自行修改文件名称和路径
OutFile = "e:\passstate.csv"
Set txtStreamOut = fso.OpenTextFile(OutFile,ForAppending,true)
'结果集的表头信息
txtStreamOut.WriteLine "帐户名称,上次修改时间,上次修改时间距今几天,下一次修改时间,密码有效时间,账户状态"

'---------------------line 35 ------------------------------
Set objArgs = WScript.Arguments
If objArgs.Count > 0 Then      
    file = objArgs(0)          
End If

'按行读取用户列表
Set txtStream = fso.OpenTextFile(InFile)
Do While Not (txtStream.atEndOfStream)
    username = txtStream.ReadLine
'-------------------------line 45-----------------------
Dim oReg
    Set oReg = New RegExp       
    oReg.Global = True          
    oReg.IgnoreCase = True      

'将用户列表信息中的“号去除,便于后续的处理   
    oReg.Pattern = """"          
    username = oReg.Replace(username,"")
  
    LDAPUser="LDAP://" +username

'获得用户帐号信息
 Set objUserLDAP = GetObject(LDAPUser)
intCurrentValue = objUserLDAP.Get("userAccountControl")
'根据控制位最后两位判断,如果最后两位是二进制10,说明账户被禁用
if (intCurrentValue and 3)=2 then
   AccountControl = "账户被禁用"
else  
   AccountControl = "账户已启用"
end if
'------------------------line 65---------------------------
'判断用户密码是否设置为永不过期
If intCurrentValue and ADS_UF_DONT_EXPIRE_PASSWD Then
  OutText=objUserLDAP.Get("sAMAccountName") & ",密码永不过期,,,," & AccountControl
  txtStreamOut.WriteLine OutText
Else
'如果用户密码没有设置为永不过期,
'获得最后一次修改密码的时间,并计算最后一次修改密码距今的时间
  dtmValue = objUserLDAP.Passwordlastchanged
  if err.number = E_ADS_Property_Not_Found then
    intTimeInterval = -1
  else
    intTimeInterval = int(now - dtmValue)
  
  end if
   err.number = 0
'--------------------------line 81---------------------------
 
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'                              注意!!!
'用户需要将sha改成自己AD的NetBIOS名称
 
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'获得密码最长时间
  Set objDomainNT = GetObject("WinNT://sha")
  intMaxPwdAge = objDomainNT.Get("MaxPasswordAge")
'-----------------------------line 90--------------------------------
'如果密码最长时间没有设置,提示用户并退出脚本运行
  If intMaxPwdAge < 0 Then
    WScript.Echo "The Maximum Password Age is set to 0 in the " & _
      "domain. Therefore, the password does not expire."
    Wscript.quit
  Else
'否则,如果用户账户最后一次修改密码距今时间超过密码最长期限,
'显示上次密码已过期 
    intMaxPwdAge = (intMaxPwdAge/SEC_IN_DAY)
    If intTimeInterval >= intMaxPwdAge Then
    OutText=objUserLDAP.Get("sAMAccountName") & "," & DateValue(dtmValue) & " " & _
    TimeValue(dtmValue) & "," & int(now - dtmValue) & ",密码过期!,," & AccountControl
    txtStreamOut.WriteLine OutText
    Else
     If intTimeInterval = -1 Then
       OutText=objUserLDAP.Get("sAMAccountName") & ",下次登陆修改密码,,,," & AccountControl
       txtStreamOut.WriteLine OutText
     Else
'否则,显示密码有效时间 
       OutText=objUserLDAP.Get("sAMAccountName") & "," & DateValue(dtmValue) & " " & _
       TimeValue(dtmValue) & "," & int(now - dtmValue) & "," & _
       DateValue(dtmValue + intMaxPwdAge) & "," & int((dtmValue + intMaxPwdAge) - now) & "," & _
       AccountControl
       txtStreamOut.WriteLine OutText
     End If
    End If
  End If
End If
Loop
'-------------------------------------line 120-------------------------------------

WScript.Echo "Please open " & OutFile & " to check user account password state."
 


 

posted on 2007-07-23 15:44  大智弱驴  阅读(3490)  评论(1编辑  收藏  举报

导航