Problemas com o patch de servidores remotamente usando winrm e Microsoft.Update.Session

10

Eu tenho uma rede com servidores Windows 2003, 2008 e 2008r2. Eu tenho um script do PowerShell que escrevi para corrigir uma máquina local usando os objetos com "Microsoft.Update". (Semelhante ao Windows Update PowerShell Remoting .) Meu script funciona maravilhosamente localmente, mas eu gostaria de usá-lo remotamente, pois tenho um número razoável de servidores para gerenciar. Nesse caso, ele cai (da mesma forma que o outro post, que não foi resolvido).

No entanto, consegui restringir a falha a dois métodos em uma classe específica.

(New-Object -ComObject "Microsoft.Update.Session").CreateUpdateDownloader()
(New-Object -ComObject "Microsoft.Update.Session").CreateUpdateInstaller()

Se você os executar em um PowerShell localmente como administrador, não haverá problemas. Se você tentar usar o comando de chamada (ou entrar na sessão ou winrs), receberá o seguinte erro. (Isso está sendo testado com o host local, mas qualquer host o fará. Eu também tentei com diferentes métodos de autenticação, como credssp e kerberos.);

PS C:\> Invoke-Command -ComputerName localhost -ScriptBlock { (New-Object -ComObject "microsoft.update.session").createUpdateDownloader()}
Exception calling "CreateUpdateDownloader" with "0" argument(s): "Access is denied. (Exception from HRESULT: 0x80070005
 (E_ACCESSDENIED))"
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ComMethodTargetInvocation

Eu já vi isso mencionado nos blogs como um bug, mas sem backup para essa reivindicação. Existem duas soluções alternativas e ambas não me fazem feliz.

  • Use psexec para executar comandos como o usuário do sistema. PSExec é o que estou tentando não usar, pois se mostrou não confiável. Eu também gostaria de uma solução pura de PowerShell.
  • Crie uma tarefa agendada e diga para executar seu script como usuário do sistema. (via este post ) Isso não é apenas confuso, mas não terei os resultados da atualização. Vou ter que fazer logon em um arquivo ou atualizar um banco de dados ou algo assim.

Estou aberto a outras maneiras de executar atualizações em um host remotamente, pois isso parece ser um problema que muitas pessoas estão enfrentando.

Encontrei alguns documentos que explicam a mensagem, mas não o motivo ou a solução alternativa.

Valor de retorno Retorna S_OK se for bem-sucedido. Caso contrário, retorna um código de erro COM ou Windows.

This method can also return the following error codes.
Return code   Description
E_INVALIDARGA parameter value is invalid. 
E_ACCESSDENIED    This method cannot be called from a remote computer.

Como ele sabe que estou em um computador remoto?

reconectar
fonte
Isso parece muito mais complexo do que levantar uma instância do WSUS e seguir esse caminho. Você já considerou essa rota?
Driftpeasant
Você não pode controlar exatamente quando um servidor será comprado e garantir que ele volte com o WSUS sozinho. Nós o alavancamos para as próprias atualizações. Eu estaria interessado se você pode acioná-lo para fazer suas coisas sob demanda.
reconbot
Tenho o mesmo problema ao usar o PowerShell Web Access no Server 2012, nos bastidores ele também usa o sistema remoto do PowerShell. Mesmo erro.
Peter Hahndorf
1
Resposta possível aqui serverfault.com/a/474031/23300
Nic
@reconbot eu sei a sua pergunta muito antiga, mas também estou enfrentando problema. Você conseguiu alguma solução ou alternativa?
Calculadora de máquina

Respostas:

0

Esse comando precisa ser executado com privilégios na máquina remota, daí a necessidade de ser executado como um usuário administrador de domínio ou como administrador na máquina remota.

Se o seu for o primeiro caso, não tenho ajuda, mas você é apenas administrador local, não remoto, use get-credentialdesta maneira.

$cred = get-credential

Invoke-Command -ComputerName localhost -credential $cred -scriptblock {}

Uma forma alternativa e mais direta é Invoke-Commandsolicitar credenciais:

Invoke-Command -scriptblock {$ENV:username} -Credential ""
motobói
fonte
Estou executando com as credenciais de uma conta de administrador, o erro especifica "Este método não pode ser chamado de um computador remoto".
reconbota
0

Consegui fazer isso funcionar configurando um ponto de extremidade JEA no servidor remoto para executar como uma conta virtual local.

Em https://docs.microsoft.com/en-us/powershell/jea/session-configurations :

Conta virtual local

Se todas as funções suportadas por este ponto de extremidade JEA forem usadas para gerenciar a máquina local e uma conta de administrador local for suficiente para executar os comandos com êxito, você deverá configurar o JEA para usar uma conta virtual local. Contas virtuais são contas temporárias exclusivas para um usuário específico e duram apenas a duração da sessão do PowerShell. Em um servidor membro ou estação de trabalho, as contas virtuais pertencem ao grupo Administradores do computador local e têm acesso à maioria dos recursos do sistema. Em um controlador de domínio do Active Directory, as contas virtuais pertencem ao grupo de administradores de domínio do domínio.

jsmitty
fonte