Problemas con parches de servidores de forma remota utilizando winrm y Microsoft.Update.Session

10

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?

reconbot
fuente
Esto parece mucho más complejo que poner una instancia de WSUS y seguir esa ruta. ¿Has considerado esa ruta?
Driftpeasant 01 de
No puede controlar exactamente cuándo se comprará un servidor y asegurarse de que volverá a funcionar solo con WSUS. Lo aprovechamos para las actualizaciones mismas. Me interesaría si puede activarlo para que sea bajo demanda.
Reconbot
Tengo el mismo problema al usar PowerShell Web Access en Server 2012, detrás de escena también usa la comunicación remota de PowerShell. Mismo error.
Peter Hahndorf
1
Posible respuesta aquí serverfault.com/a/474031/23300
Nic
@reconbot Sé que es una pregunta muy antigua, pero también estoy enfrentando un problema. ¿Tienes alguna solución o una forma alternativa?
Máquina calculadora

Respuestas:

0

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-credentialesta manera.

$cred = get-credential

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

Una forma alternativa y más directa es Invoke-Commandpedir credenciales:

Invoke-Command -scriptblock {$ENV:username} -Credential ""
motobói
fuente
Estoy ejecutando con las credenciales de una cuenta de administrador, el error especifica "No se puede llamar a este método desde una computadora remota".
Reconbot
0

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 :

Cuenta virtual local

Si las funciones compatibles con este punto final JEA se utilizan para administrar la máquina local, y una cuenta de administrador local es suficiente para ejecutar los comandos con éxito, debe configurar JEA para usar una cuenta virtual local. Las cuentas virtuales son cuentas temporales que son exclusivas de un usuario específico y solo duran la duración de su sesión de PowerShell. En un servidor miembro o estación de trabajo, las cuentas virtuales pertenecen al grupo de Administradores de la computadora local y tienen acceso a la mayoría de los recursos del sistema. En un controlador de dominio de Active Directory, las cuentas virtuales pertenecen al grupo de administradores de dominio del dominio.

jsmitty
fuente