我可以让每个人自己工作,但我不能让它们一起工作,登录脚本使用strArg =
调用HTA文件,HTA文件生成一个密码窗口。当登录脚本运行时,HTA 文件在第 31 行和第 106 行出错。
我知道问题出在strArg
,我无法弄清楚。它应该在到期前 13 天通知最终用户。任何帮助都会很棒。目前,就像现在的脚本一样,HTA 文件部分出现错误:
线路: 31 和 106
错误:类型不匹配"strARG"
代码: 0
我确实在下面的链接中打开了这个问题,但这些建议并没有解决问题。
VBScript 语句不匹配环失败
Dim oDomain
Dim oUser
Dim maxPwdAge
Dim numDays
Dim warningDays
warningDays = 13
Set LoginInfo = CreateObject("ADSystemInfo")
Set objUser = GetObject("LDAP://" & LoginInfo.UserName & "")
strDomainDN = UCase(LoginInfo.DomainDNSName)
strUserDN = LoginInfo.UserName
Const ADS_UF_DONT_EXPIRE_PASSWD = &h10000
intUserAccountControl = objUser.Get("userAccountControl")
If intUserAccountControl And ADS_UF_DONT_EXPIRE_PASSWD Then
'WScript.Echo "The password does not expire."
Else
Set oDomain = GetObject("LDAP://" & strDomainDN)
Set maxPwdAge = oDomain.Get("maxPwdAge")
' Calculate the number of days that are held in this value.
numDays = CCur((maxPwdAge.HighPart * 2 ^ 32) + _
maxPwdAge.LowPart) / CCur(-864000000000)
'WScript.Echo "Maximum Password Age: " & numDays
Set oUser = GetObject("LDAP://" & strUserDN)
whenPasswordExpires = DateAdd("d", numDays, oUser.PasswordLastChanged)
fromDate = Date
daysLeft = DateDiff("d", fromDate, whenPasswordExpires)
'WScript.Echo "Password Last Changed: " & oUser.PasswordLastChanged
If (daysLeft < warningDays) And (daysLeft > -1) Then
strCMD = "\domainnetlogonPwExpChkPWReminder.hta" & " -" & intDaysRemaining
Set wshShell = CreateObject("WScript.Shell")
RC = WshShell.Run(strCMD , 0, False)
End If
End If
Set oUser = Nothing
Set maxPwdAge = Nothing
Set oDomain = Nothing
Set wshShell = Nothing
HTA 文件:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<title>Password Reminder</title>
<hta:application
border="thin
borderstyle="normal"
caption="Password Reminder"
contextmenu="yes"
maximizebutton="Yes"
minimizebutton="no"
navigable="yes"
scroll="no"
selection="yes"
showintaskbar="yes"
singleinstance="yes"
sysmenu="Yes"
WINDOWSTATE="normal"
id="objPasswordHTA">
<script language="vbscript">
Sub Window_onLoad
strArg = 13
arrCommands = Split(objPasswordHTA.commandLine, "-")
If UBound(arrCommands) > 0 Then
strArg = arrCommands(UBound(arrCommands))
End If
'setup the window size depending on how many days remain
strArg = strArg * 1
If strArg <= 5 Then
self.MoveTo 200,50
window.ResizeTo 1000,850
Set wshShell = CreateObject("WScript.Shell")
wshShell.AppActivate "Password Reminder"
wshShell.SendKeys "% x" ' ALT+SPACE+X = windows maximize, must be enabled on hta
' ALT+SPACE+N = windows minimize, must be enabled on hta
' ALT+SPACE+R = windows restore
ElseIf strArg <= 10 Then
self.MoveTo 200,50
window.ResizeTo 900,750
Else
self.MoveTo 200,50
window.ResizeTo 750, 575
End If
End Sub
</script>
</head>
<body>
<table cellspacing="0" cellpadding="0" width="100%" bgcolor=Silver>
<tbody>
<tr>
<td valign="top" width="80%">
<p style="PADDING-TOP: 8px; PADDING-LEFT: 8px; margin-top: 0px">
<font face="Verdana" color="White" style="font-size: 11pt"><strong>Company name</strong></font><br />
<font face="Verdana" color="Black" size="5"><strong>Password Reset Reminder</strong></font>
<p>
</td>
<td valign="bottom" width="50%">
<img src='\domainnetlogonPwExpChklogo.jpg' width='451' height='170' style="vertical-align:bottom;">
</td>
</tr>
</tbody>
</table>
<span id=DataArea></span>
<script language="vbscript">
Set wshNetwork = reateObject("WScript.Network")
Set wshShell = CreateObject("Wscript.Shell")
'TableMsgs:
strDaysLeftMsg1 = "We have detected that your password will expire in"
strDaysLeftMsg2 = "day(s) or less."
strPWCriteriaMsg = "<BR>Password criteria:" & _
"<BR> - 8 characters or longer" & _
"<BR> - At least one alpha, one numeric, and one special character" & _
"<BR> - Cannot be an old password" & _
"<BR> - Passwords ARE CaSe SeNsItIvE!!!" & _
"<BR>"
strArg = 13
arrCommands = Split(objPasswordHTA.commandLine, "-")
If UBound(arrCommands) > 0 Then
strArg = arrCommands(UBound(arrCommands))
strArg = strArg * 1
End If
intDaysLeftonPW = strArg
'Generate the HTML for the table
strTableHTML = "<TABLE align=center width=75%>"
If intDaysLeftonPW <= 5 Then
strTableHTML = strTableHTML & "<font size=5>"
strTableHTML = strTableHTML & "<TR bgcolor=Red><TD> </TD></TR>"
strTableHTML = strTableHTML & "<TR><TD><font size=5>" & strDaysLeftMsg1 & "<font color=Red><b> " & intDaysLeftonPW & _
"</b></font> " & strDaysLeftMsg2 & "</font>" & _
"<BR>" & _
"<BR>Please reset your password now to avoid getting locked out or expiring. " & _
"The only way to unlock an expired password is to contact Help Desk. " & _
"A typical expired password request takes 15-20 minutes.</TD></TR>"
strTableHTML = strTableHTML & "<TR bgcolor=Red><TD> </TD></TR>"
strTableHTML = strTableHTML & "<TR><TD>" & strPWCriteriaMsg & "</TD></TR>"
strTableHTML = strTableHTML & _
"<TR><TD><BR><font color=red>To reset password:</font>" & _
"<BR>1. Press CTRL+ALT+DELETE" & _
"<BR>2. Select " & Chr(34) & "Change a Password..." & Chr(34) & _
"<BR>3. Complete the password reset wizard." & _
"<BR>" & _
"<BR>Caution: There are no grace logons. Expired passwords will not be allowed onto " & _
"the network.</TD></TR>"
strTableHTML = strTableHTML & "</font>"
ElseIf intDaysLeftonPW <= 10 Then
strTableHTML = strTableHTML & "<TR bgcolor=yellow><TD> </TD></TR>"
sTRTableHTML = strTableHTML & _
"<TR><TD>" & strDaysLeftMsg1 & "<font color=Red><b> " & intDaysLeftonPW & _
"</b></font> " & strDaysLeftMsg2 & "</TD></TR>"
strTableHTML = strTableHTML & "<TR bgcolor=Yellow><TD> </TD></TR>"
strTableHTML = strTableHTML & "<TR><TD>" & strPWCriteriaMsg & "</TD></TR>"
strTableHTML = strTableHTML & _
"<TR><TD><BR>To reset password:" & _
"<BR>1. Press CTRL+ALT+DELETE" & _
"<BR>2. Select " & Chr(34) & "Change a Password..." & Chr(34) & _
"<BR>3. Complete the password reset wizard." & _
"<BR>" & _
"<BR>Tip: Try to avoid resetting passwords on Friday and reset early in " & _
"the week. This will give you more opportunities to sign in and get used to the new password " & _
"so you do not forget over the weekend.</TD></TR>"
Else
strTableHTML = strTableHTML & "<TR bgcolor=Green><TD> </TD></TR>"
strTableHTML = strTableHTML & _
"<TR><TD>" & strDaysLeftMsg1 & "<font color=Red><b> " & intDaysLeftonPW & _
"</b></font> " & strDaysLeftMsg2 & "</TD></TR>"
strTableHTML = strTableHTML & "<TR bgcolor=Green><TD> </TD></TR>"
strTableHTML = strTableHTML & "<TR><TD>" & strPWCriteriaMsg & "</TD></TR>"
strTableHTML = strTableHTML & _
"<TR><TD><BR>Please press CTRL+ALT+DELETE and select Change a Password..." & _
"</TD></TR>"
End If
'Add the dynamic HTML to the table/HTA
strTableHTML = strTableHTML & "</TABLE>"
DataArea.InnerHTML = strTableHTML
</script>
</body>
</html>
有你的罪魁祸首:
strCMD = "\domainnetlogonPwExpChkPWReminder.hta" & " -" & intDaysRemaining
' ~~~~~~~~~~~~~~~~
您永远不会在代码中的任何位置定义intDaysRemaining
,因此变量为空,这意味着命令行如下所示:
domainetlogon\PwExpChk\PWReminder.hta -
在 -
处拆分此命令行会给你一个数组,最后一个字段中有一个空字符串,这反过来又会引发你在尝试将空字符串乘以 1 时观察到的错误。
示范:
>>> cmdline = "\\domainetlogon\PwExpChk\PWReminder.hta -">>> a = Split(cmdline, "-")>>> v = a(UBound(a))>>> WScript.Echo "_" & v & "_"__>>> i = v * 1类型不匹配 (0xD)
如果您将Option Explicit
添加到 VBScript,或者至少在调试时费心在 HTA 中回显命令行(MsgBox objPasswordHTA.commandLine
),您会立即发现这一点。