簡體   English   中英

使用 PowerShell 遠程安裝 Windows 更新。 (一些 PowerCLI)

[英]Installing windows updates remotely, using PowerShell. (some PowerCLI)

我的遠程 Windows 更新腳本有問題。 我的目標是:在不使用 WSUS 或 SCCM 的情況下,從 PowerShell 更新所有 Windows 服務器,而無需登錄所有 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 服務器並讓批處理以提升的權限運行它對我來說不是問題,但這是唯一的方法嗎?

我將執行批處理解決方案以查看我可以實現的目標,但是我面臨的問題還有其他解決方案嗎? 有沒有人試過?

非常感謝您的寶貴時間! 我也願意對我的代碼或修復程序發表任何評論!

如果管理員權限,提升的提示是您的問題,以下內容可能對您有所幫助。

用於檢查是否以管理員身份運行的 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\\處修改ConsentPromptBehaviorAdmin

——

這是一個簡單的 BAT 文件,它將繞過 PS 執行策略,然后啟動 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將執行策略設置回受限或您設置的內容。

我在嘗試使用Invoke-Command在遠程機器上導入模塊時遇到了這個問題。 有一項安全功能不允許您這樣做。 您可以嘗試運行以下命令,看看您在導入新模塊方面是否更成功。

$myPsSession = New-PSSession -ComputerName $HostName
Import-Module -Name PSWindowsUpdate -PSSession $myPsSession

我選擇了任務調度程序解決方案,因為它看起來更容易。

我創建了一個名為 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 的回答,我會檢查它們,稍后我會回來評論它們。

非常感謝您的寶貴時間。

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/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM