如何用VBS获取本地用户最后密码设置日期?现有代码无法获取数据
获取本地用户最后密码设置日期的VBS脚本修正方案
原代码的核心问题是没有调用Win32_UserAccount类的PasswordLastSet属性,同时该属性返回的是WMI格式的时间戳,需要转换为可读的日期格式。以下是修正后的脚本:
On Error Resume Next strComputer = "." Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") ' 明确查询需要的字段,提升执行效率 Set colItems = objWMIService.ExecQuery("Select Name, PasswordChangeable, PasswordLastSet from Win32_UserAccount Where LocalAccount = True") Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.CreateTextFile("D:\users.txt", True) For Each objItem in colItems ' 跳过指定系统用户和不可修改密码的用户 If objItem.Name = "Administrator" Or _ objItem.Name = "Guest" Or _ objItem.Name = "Admin" Or _ objItem.PasswordChangeable = False Then Continue For End If ' 写入基础用户信息 objFile.Write "用户名: " & objItem.Name & vbCrlf objFile.Write "密码可修改: " & objItem.PasswordChangeable & vbCrlf ' 处理并写入最后密码设置日期 If Not IsNull(objItem.PasswordLastSet) Then ' 将WMI时间戳转换为本地可读的日期时间格式 dtPasswordLastSet = WMIDateStringToDate(objItem.PasswordLastSet) objFile.Write "最后密码设置日期: " & Day(dtPasswordLastSet) & "/" & Month(dtPasswordLastSet) & "/" & Year(dtPasswordLastSet) & " " & Time(dtPasswordLastSet) & vbCrlf Else objFile.Write "最后密码设置日期: 无记录" & vbCrlf End If objFile.Write "-------------------------" & vbCrlf Next objFile.Close WScript.Echo "数据已导出到D:\users.txt" ' 转换WMI标准日期时间格式为本地日期的工具函数 Function WMIDateStringToDate(dtmDate) WMIDateStringToDate = CDate(Mid(dtmDate, 5, 2) & "/" & _ Mid(dtmDate, 7, 2) & "/" & _ Left(dtmDate, 4) & " " & _ Mid(dtmDate, 9, 2) & ":" & _ Mid(dtmDate, 11, 2) & ":" & _ Mid(dtmDate, 13, 2)) End Function
关键修正说明:
- 新增
PasswordLastSet属性的查询与转换逻辑,通过自定义函数将WMI返回的UTC时间戳转为本地可读的日期时间 - 简化用户过滤逻辑,用
Continue For替代冗余的Do While循环结构 - 优化输出格式,增加分隔线提升文件可读性
- 处理
PasswordLastSet为空的边界情况(部分特殊账户可能无此记录)
内容的提问来源于stack exchange,提问作者Alberto Alonso García
相关产品推荐
相关产品推荐

