Удаленная установка обновлений Windows с помощью PowerShell.(немного PowerCLI) - PullRequest
0 голосов
/ 15 октября 2018

У меня проблема со скриптом для удаленных обновлений Windows.Моя цель: обновить все серверы Windows, не используя WSUS или SCCM, из PowerShell без необходимости входа на все из них и начать процесс обновления.

Для своего сценария я использую модули 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 скрипт обновления и получить пакет для запуска его с повышенными правами, но разве это единственный способ?

Я сделаю пакетное решение, чтобы увидеть, что я могудостичь, но есть ли другое решение проблемы, с которой я сталкиваюсь?Кто-нибудь пробовал это?

Большое спасибо за потраченное время!Я также открыт для любых комментариев по поводу моего кода или исправлений!

Ответы [ 3 ]

0 голосов
/ 15 октября 2018

Я столкнулся с этой проблемой при попытке импортировать модули на удаленные машины с помощью Invoke-Command.Есть функция безопасности, которая не позволяет вам это делать.Вы можете попробовать выполнить следующее, чтобы проверить, успешнее ли вам импортировать новый модуль.

$myPsSession = New-PSSession -ComputerName $HostName
Import-Module -Name PSWindowsUpdate -PSSession $myPsSession
0 голосов
/ 16 октября 2018

Я пошел с решением планировщика задач, поскольку оно кажется более простым.

Я создал скрипт с именем 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, я проверю их и вернусь позже, чтобы прокомментировать их.

Большое спасибо за ваше время.

0 голосов
/ 15 октября 2018

Если у вас есть права администратора, вам нужны повышенные права, вам может помочь следующее:

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 и затем запустит сценарий 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 чтобы установить политику выполнения обратно на ограниченное или на то, что вы установили.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...