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?