PSWindowsUpdate получает отказ в доступе на удаленных компьютерах при администраторе домена

#powershell #windows-update

#powershell #центр обновления Windows

Вопрос:

Я хочу развернуть обновления на серверах Windows в нашем домене. Для достижения этого я хочу использовать модуль «PSWindowsUpdate», вот официальная версия. Я использую этот модуль в сочетании с PSSessions и импортирую его локально на все серверы за пределами пути к модулю по умолчанию.

Он должен принять обновления и установить их без перезагрузки. Этот скрипт запускается с использованием администратора домена

После того, как он примет обновления, он должен начать загрузку там, где это происходит: Ошибка задания

Я начал получать эту ошибку после установки июльского исправления безопасности 2018.

Поскольку я не могу поделиться всем кодом по причинам компании, вот часть, которая имеет значение:

 function invokeUpdate{
param(
    $session
)
if($Script:My.Reboot.isChecked){
    $job = Invoke-Command -Session $session -ScriptBlock {Import-Module "C:ScriptsupdateModule$($Using:My.ModuleVersion)PSWindowsUpdate"; get-windowsupdate -install -AcceptAll} -AsJob
}else {
    $job = Invoke-Command -Session $session -ScriptBlock {Import-Module "C:ScriptsupdateModule$($Using:My.ModuleVersion)PSWindowsUpdate"; get-windowsupdate -install -ignoreReboot -AcceptAll} -AsJob
    }
return $job
}

function initSession{
param(
    $serverHostname
)
$ses = New-PSSession -Computername $serverHostname
if(!(Invoke-Command -Session $ses -ScriptBlock {Test-Path "C:ScriptsupdateModule" })){
    Copy-Item "$modpath$($Script:My.ModuleVersion)" -Destination "C:ScriptsupdateModule$($Script:My.ModuleVersion)" -ToSession $ses -Recurse
}
Invoke-Command -Session $ses -ScriptBlock {
    if((Get-ChildItem -Path "C:ScriptsupdateModule").count -gt 1){
        Get-ChildItem | Where-Object Name -NotLike "$($Using:My.ModuleVersion)" | Remove-Item -Recurse -Force
    }
}
return $ses
}

$sessions =  [System.Collections.ArrayList]@()
$Script:My.ModuleVersion = "2.1.1.2"
foreach  ( $server in $Script:My.ServerActive.Items){
    $sessions.Add(  (initSession -serverHostname $server) )
}
foreach ($ses in $sessions){
   invokeUpdate -session $ses
}
  

$Script:My.ServerActive.Товары :
содержит список полных доменных имен сервера

Любые идеи или решения спасли бы меня, спасибо!

Nik

Редактировать 1:

Вот сообщение об ошибке:

Доступ запрещен. (Исключение из HRESULT: 0x80070005 (E_ACCESSDENIED)) CategoryInfo: не указано: (:) [Get-WindowsUpdate], исключение UnauthorizedAccessException FullyQualifiedErrorId : System.Исключение UnauthorizedAccessException,PSWindowsUpdate.GetWindowsUpdate PSComputerName: fs02.azubi.netz

Это приведет к прерыванию моих сеансов, но результат будет равен $ true ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")

Вызов команды: не удается привязать параметр ‘Session’. Не удается преобразовать значение «True» в тип «System.Management.Автоматизация.Runspaces.PSSession». …

Комментарии:

1. Можете ли вы вставить вывод / ошибку в вопрос вместо ссылки на изображение ошибки?

2. Моя первая мысль здесь заключается в том, что ваш удаленный сеанс не запущен с повышенными разрешениями. Попробуйте запустить это от имени вашего пользователя DA в удаленной системе через PSRemoting, оно вернет, $True если у вас есть права администратора, а $False если нет: ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator") . Если это проблема, ответьте, и у меня есть ответ, который должен решить эту проблему.

Ответ №1:

Чтобы устранить эту проблему, мне пришлось изменить способ копирования в другую систему и фактический вызов get-windowsupdate.

Moudle должен быть в $ env: PSModPath, поэтому, чтобы исправить это, вы должны скопировать в одну из этих папок.

 Copy-Item "$modpath$($Script:My.ModuleVersion)" -Destination "$psmodPSWindowsUpdate$($Script:My.ModuleVersion)" -ToSession $ses -Recurse -ErrorAction Stop 
  

обновление не нужно запускать с помощью команды Invoke.

 Get-WindowsUpdate -AcceptAll -Install  -IgnoreReboot -ComputerName $session.ComputerName
  

Надеюсь, это поможет, если у вас возникнет подобная проблема!