我知道加入域的计算机在 AD 中拥有机器帐户,这些帐户的密码会过期(默认情况下每 30 天过期一次),并且这些密码会在无需用户干预的情况下自动更改。
鉴于已知这会在恢复加入域的虚拟机的快照时导致问题,是否可以查询加入域的计算机或 AD 以确定下次更改机器帐户密码的时间?
答案1
可以查询域,下面的脚本将告诉您特定机器的域密码上次重置的时间。
'Replace "yourdom.com" with your domain name.
DomainName = "yourdom.com"
querymachine = UCase(inputbox("Enter full machine name"))
lngBias = 2
'****************Setup Log file******************************************************
Set fso = CreateObject("Scripting.FileSystemObject")
'The 8 in this line will append to an existing file, replace with a 2 to override
set txtStream = fso.OpenTextFile("System.txt", 8, True)
txtStream.WriteLine "Ran on " & Date & " *******************************"
'****************Setup ADSI connection and populate ADSI Collection******************
Set objADOconnADSI = CreateObject("ADODB.Connection")
objADOconnADSI.Open "Provider=ADsDSOObject;"
Set objCommandADSI = CreateObject("ADODB.Command")
objCommandADSI.ActiveConnection = objADOconnADSI
'there is a 1000 object default if these next 2 lines are omited.
objCommandADSI.Properties("Size Limit")= 100000
objCommandADSI.Properties("Page Size")= 100000
objCommandADSI.Properties("Sort on") = "sAMAccountName"
objCommandADSI.CommandText = "<LDAP://" & DomainName & ">;(objectClass=computer);sAMAccountName,pwdLastSet,name,distinguishedname,operatingSystem;subtree"
Set objRSADSI = objCommandADSI.Execute
'Loop through record set and compare machine name*************************************
do while NOT objRSADSI.EOF
if not isnull(objRSADSI.Fields("distinguishedname")) and objRSADSI.Fields("distinguishedname") <> "" then
objDate = objRSADSI.Fields("PwdLastSet")
'Go to function to make sense of the PwdLastSet value from AD for the machine account.
dtmPwdLastSet = Integer8Date(objDate, lngBias)
'calculate the current age of the password.
DiffADate = DateDiff("d", dtmPwdLastSet, Now)
'Is the machine the one we're looking for?
if UCase(objRSADSI.Fields("name")) = querymachine then
txtStream.WriteLine objRSADSI.Fields("name") & ";" & dtmPwdLastSet & ";" & DiffADate & ";" & objRSADSI.Fields("operatingSystem")
wscript.echo objRSADSI.Fields("name") & ", Last set: " & dtmPwdLastSet & ", Days since last change: " & DiffADate
end if
end if
objRSADSI.MoveNext
loop
wscript.echo "Done!"
Function Integer8Date(objDate, lngBias)
' Function to convert Integer8 (64-bit) value to a date, adjusted for
' local time zone bias.
Dim lngAdjust, lngDate, lngHigh, lngLow
lngAdjust = lngBias
lngHigh = objDate.HighPart
lngLow = objdate.LowPart
' Account for bug in IADslargeInteger property methods.
If lngLow < 0 Then
lngHigh = lngHigh + 1
End If
If (lngHigh = 0) And (lngLow = 0) Then
lngAdjust = 0
End If
lngDate = #1/1/1601# + (((lngHigh * (2 ^ 32)) _
+ lngLow) / 600000000 - lngAdjust) / 1440
Integer8Date = CDate(lngDate)
End Function
(我很想对上述脚本表示感谢,但是它被传来传去,并以各种方式被修改,我不知道它最初来自哪里)
将其保存为类似 MachinePasswordDate.vbs 的文件,在 Windows 中双击该文件时,会弹出一个框,您可以在其中输入机器名称,然后它会查询域并告诉您该机器的密码上次更改的时间。
如果您定期恢复虚拟机快照,则在保存映像之前,可能需要查看这些计算机上的安全策略。您可以很容易地将机器密码重置间隔更改为最长 999 天,假设您的域 GPO 不会覆盖它,并且您的安全策略允许此类操作:
单击“开始”,单击“运行”,键入 Gpedit.msc,然后按 ENTER。
展开“本地计算机策略”、“计算机配置”,展开“Windows 设置”,展开“安全设置”,展开“本地策略”,然后展开“安全选项”。
配置以下设置:
域成员:禁用机器帐户密码更改(已启用)
域成员:机器账户密码最长使用期限(999天)
域控制器:拒绝机器帐户密码更改(已启用)
答案2
在 DC 或任何具有 RSAT 的计算机上,你可以运行dsquery computer -name ComputerName -stalepwd x
ComputerName 是您要检查的计算机的名称
x 是自上次设置密码以来的天数。
如果在 x 天内没有设置密码,它将返回计算机的名称和容器。如果在过去 x 天内设置了密码,它将不返回任何内容。