Tengo una red con servidores Windows 2003, 2008 y 2008r2. Tengo un script de PowerShell que escribí para parchear una máquina local usando los objetos com "Microsoft.Update". (Similar a Windows Update PowerShell Remoting ). Mi script funciona maravillosamente a nivel local, pero me gustaría usar sus funciones de forma remota, ya que tengo una buena cantidad de servidores para administrar. En ese caso, se cae (de manera similar a esa otra publicación, que no se resolvió).
Sin embargo, pude reducir el fracaso a dos métodos en una clase en particular.
(New-Object -ComObject "Microsoft.Update.Session").CreateUpdateDownloader()
(New-Object -ComObject "Microsoft.Update.Session").CreateUpdateInstaller()
Si ejecuta estos en un PowerShell localmente como administrador, no tendrá problemas. Si intentas usar invoke-command (o enter-session, o winrs) obtendrás el siguiente error. (Esto es una prueba con localhost, pero cualquier host lo hará. También lo he intentado con diferentes métodos de autenticación como credssp y 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
He visto esto mencionado en los blogs como un error, pero sin respaldo a esa afirmación. Existen dos soluciones y ambas no me hacen feliz.
- Use psexec para ejecutar comandos como usuario del sistema. PSExec es lo que estoy tratando de no usar, ya que ha demostrado ser poco confiable. También me gustaría una solución de PowerShell pura.
- Cree una tarea programada y dígale que ejecute su script como usuario del sistema. (a través de esta publicación ) Esto no solo es desordenado, sino que tampoco tendré los resultados de la actualización. Tendré que iniciar sesión en un archivo o actualizar una base de datos o algo así.
Estoy abierto a otras formas de ejecutar actualizaciones en un host de forma remota, ya que esto parece ser un problema que mucha gente está enfrentando.
Encontré algunos documentos que explican el mensaje pero no la razón o la solución.
Valor devuelto Devuelve S_OK si tiene éxito. De lo contrario, devuelve un código de error COM o 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.
¿Cómo sabe que estoy en una computadora remota?
Respuestas:
Simplemente no puede hacerlo compañero, porque MS no le permite hacerlo a través de WUApi.
Los detalles se pueden encontrar aquí: http://msdn.microsoft.com/en-us/library/windows/desktop/aa387288(v=vs.85).aspx
Puede intentar utilizar la tarea programada para hacer esto.
fuente
Dicho comando debe ejecutarse con privilegios en la máquina remota, de ahí la necesidad de ejecutarse como usuario administrador de dominio o administrador en la máquina remota.
Si el suyo es el primer caso, no tengo ayuda, pero usted es solo administrador local, no remoto, use de
get-credential
esta manera.Una forma alternativa y más directa es
Invoke-Command
pedir credenciales:fuente
Pude hacer que esto funcione configurando un punto final JEA en el servidor remoto para que se ejecute como una cuenta virtual local.
Desde https://docs.microsoft.com/en-us/powershell/jea/session-configurations :
fuente