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?
Respostas:
Você simplesmente não pode fazer isso, porque a MS não permite que você faça isso através do WUApi.
Detalhes podem ser encontrados aqui: http://msdn.microsoft.com/en-us/library/windows/desktop/aa387288(v=vs.85).aspx
Você pode tentar usar a tarefa agendada para fazer isso.
fonte
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-credential
desta maneira.Uma forma alternativa e mais direta é
Invoke-Command
solicitar credenciais:fonte
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 :
fonte