我的远程Windows更新脚本存在问题。 我的目标是:从PowerShell更新所有Windows服务器,而无需使用WSUS或SCCM,而无需登录所有Windows服务器并开始更新过程。
对于我的脚本,我正在使用powercli和PSWindowsUpdate模块。 出于测试目的,我在$ hostname变量中使用单个主机。
这就是我所拥有的。
$Cred = Get-Credential
Import-Module PSWindowsUpdate
Invoke-Command -ComputerName $HostName {Import-Module PSWindowsUpdate} -Verbose -Credential $Cred
Invoke-Command -ComputerName $HostName {Add-WUServiceManager -ServiceID 7971f918-a847-4430-9279-4a52d1efe18d -Confirm:$false} -Verbose -Credential $Cred
Invoke-Command -ComputerName $HostName -ScriptBlock {Get-WUInstall -MicrosoftUpdate -IgnoreUserInput -AcceptAll -AutoReboot -Confirm:$FALSE -Verbose | Out-File C:\Setup\PSWindowsUpdate.log } -credential $cred
Get-Content \\$HostName\c$\Setup\PSWindowsUpdate.log
运行脚本后,一切都可以从关闭,快照,打开电源开始进行,但我无法安装任何更新。 我收到以下错误:
WARNING: To perform some operations you must run an elevated Windows PowerShell console.
WARNING: Can't access to machine "hostName". Try use: winrm qc
在搜索时,我发现我无法在PowerShell本身中进行任何提升,而且我正在阅读一些有关运行CMD bat以提升权限启动PowerShell的文章。 对我来说,将更新脚本复制到每台Windows服务器并有一批可以提升权限运行它不是问题,但这是唯一的方法吗?
我将执行批处理解决方案以查看可以实现的目标,但是我面临的问题是否还有其他解决方案? 有人尝试过吗?
非常感谢您的宝贵时间! 我也愿意对我的代码或修复程序发表任何评论!
答案 0 :(得分:0)
如果管理员权限高,提示是您的问题,那么以下内容可能会对您有所帮助。
PS代码,用于检查是否以管理员身份运行。如果没有,它将以管理员身份重新启动。
If (-Not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
$Arguments = "& '" + $MyInvocation.MyCommand.Definition + "'"
Start-Process Powershell -Verb RunAs -ArgumentList $Arguments
Break
}
您可能还需要在注册表中的ConsentPromptBehaviorAdmin
上修改HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\
-
这是一个简单的BAT文件,它将绕过PS Execution策略,然后启动PS脚本(假设它们的名称相同)。
REG ADD "HKLM\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell" /T REG_SZ /V ExecutionPolicy /D Unrestricted /F
Start PowerShell.exe -Command "& '%~dpn0.ps1'"
添加PS脚本的末尾,您可以使用Set-ExecutionPolicy -ExecutionPolicy Restricted -Scope LocalMachine -Force
将执行策略重新设置为“受限”或设置为“ ti”。
答案 1 :(得分:0)
尝试使用Invoke-Command
导入远程计算机上的模块时遇到了这个问题。有一个安全功能不允许您执行此操作。您可以尝试运行以下命令,以查看是否成功导入了新模块。
$myPsSession = New-PSSession -ComputerName $HostName
Import-Module -Name PSWindowsUpdate -PSSession $myPsSession
答案 2 :(得分:0)
我选择了任务计划程序解决方案,因为它似乎更容易。
我创建了一个名为WUpdates.ps1的脚本
$Timestamp=((Get-Date).ToString('dd_MM_yyyy_HH_mm'))
Import-Module PSWindowsUpdate -Verbose
Add-WUServiceManager -ServiceID 7971f918-a847-4430-9279-4a52d1efe18d -Confirm:$false -Verbose
Get-WUInstall -MicrosoftUpdate -IgnoreUserInput -AcceptAll -AutoReboot -Confirm:$FALSE -Verbose | Format-Table -AutoSize | Out-File C:\Setup\WUpdates\PSWindowsUpdate_$Timestamp.log
和用于创建名为WinUpdateScheduler.ps1的计划任务的脚本
Unregister-ScheduledTask -TaskName "WindowsUpdates" -Confirm:$False
$Action = New-ScheduledTaskAction -Execute C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -Argument '-f "C:\Setup\WUpdates\WUpdates.ps1"'
$Trigger = New-ScheduledTaskTrigger -Once -At (get-date).AddSeconds(30)
Register-ScheduledTask -Action $Action -Trigger $Trigger -RunLevel Highest -User system -TaskName "WindowsUpdates" -Description "Running Windows updates."
然后在主脚本中调用计划脚本并安装更新。
Invoke-Command -ComputerName $HostName { c:\setup\WUpdates\WinUpdateScheduler.ps1 } -Credential $Cred
如果有人想要完整的脚本,我可以提供。 关于Nixphoe和Backin的答案,我将对其进行检查,稍后我将对它们进行评论。
非常感谢您的宝贵时间。
答案 3 :(得分:0)
Invoke-WUInstall -ComputerName Test-1 -Script { ipmo PSWindowsUpdate; Get-WUInstall -AcceptAll | Out-File C:\PSWindowsUpdate.log }
-Confirm:$false –Verbose
https://4sysops.com/archives/install-windows-updates-remotely-with-the-powershell/