没有公网的机器,内网 windows update参考https://cloud.tencent.com/document/product/213/2758
代码语言:javascript复制如果机器有公网,默认不用配啥,用系统自带的更新功能打补丁时自动连微软对公的update server
http://windows-1251783334.cos.ap-shanghai.myzijiebao.com/115.159.148.149/windows_update.vbs (原出处的内容可能更新,建议以原出处为准)
该脚本来自微软,原出处:https://learn.microsoft.com/zh-cn/windows/win32/wua_sdk/searching--downloading--and-installing-updates
主要用于实现windows自动更新功能。 在windows机器内直接执行该脚本文件即可,不需要输入任何参数
RebootToComplete以实现更新后重启机器使得更新生效
脚本执行指令如下:cscript windows_update.vbs /RebootToComplete
注意:
(1)必须确保机器可以正常连接windows更新服务器或自定义的相关更新服务器,否则无法实现更新
(2)该脚本执行结束后,机器会重启以保证补丁生效
(3)脚本执行时间取决于补丁大小及网络状况等
另外,了解下使用 WUA 脱机扫描更新
需要提醒的是,不通过winrm,直接在系统里执行cscript.exe "C:windows_update.vbs"没问题,而通过winrm执行相同命令就会卡在Downloading,报错 Microsoft VBScript 运行时错误: 没有权限
从上到下,依次是.vbs的第362行~第386行
代码语言:javascript复制C:windows_update.vbs(366, 5) Microsoft VBScript 运行时错误: 没有权限
CategoryInfo : NotSpecified: (C:windows_upda...ipt 运行时错误: 没有权限:String) [], RemoteException
FullyQualifiedErrorId : NativeCommandError
PSComputerName : 10.255.5.6
NotSpecified: (:) [], RemoteException
通过winrm执行脚本,前365行的功能正常回显,执行到366行报错了,在系统内部直接执行脚本则完全正常
首先需要打通WinRM,默认不支持WinRM
开启WinRM(执行后最好重启下机器)
代码语言:javascript复制winrm quickconfig -q 2>&1> $null;winrm quickconfig -q -force 2>&1> $null;netstat -ano|findstr :5985;
reg delete "HKLMSOFTWAREPoliciesMicrosoftWindowsWinRM" /f 2>$null
stop-service mpssvc 2>&1 > $null
winrm quickconfig -q 2>&1 > $null
winrm quickconfig -q -force 2>&1 > $null
restart-service winrm 2>&1 > $null
#Set-Item WSMan:localhostclienttrustedhosts -value * -force 2>&1 > $null
winrm set winrm/config/client '@{TrustedHosts="*"}' 2>&1 > $null
#netstat -ato|findstr :5985
用powershell通过winrm执行脚本
代码语言:javascript复制$Username = '.Administrator'
$Password = '密码'
$pass = ConvertTo-SecureString -AsPlainText $Password -Force
$Cred = New-Object System.Management.Automation.PSCredential -ArgumentList $Username,$pass
$iparray = @('10.255.5.6')
for($i=0;$i -lt $iparray.Length;$i ){
"`$iparray[" $i "]=" $iparray[$i] "`n"
Invoke-Command -ComputerName $iparray[$i] -Credential $Cred -ScriptBlock {
cscript.exe "C:windows_update.vbs";
}
}
能执行到这个层面说明脚本已经真正在执行了,只是执行到Downloading那里报错了
winrm跟系统内部cmd/powershell还是有区别的,有些命令通过winrm并不能达到系统内部cmd/powershell执行命令的效果
我调整思路,用这2行命令替换cscript.exe "C:windows_update.vbs"
代码语言:javascript复制schtasks.exe /create /tn "update" /ru Administrator /rl highest /sc ONLOGON /tr "cscript.exe 'C:windows_update.vbs'" /f;
schtasks /Run /TN "update";
通过先创建一个计划任务再触发计划任务执行,这样就相当于在远程服务器本机执行命令,如此执行下来确实符合预期,结果正常