Cómo arreglarlo "El cliente WinRM Shell no puede procesar la solicitud. Uno de los valores de argumento pasados a la función WSManRunShellCommand es nulo o cero".
Descripción
This error occurs when you try to execute a remote command via Windows Remote Management (WinRM) or PowerShell Remoting, and the command invocation fails before it even starts executing on the target machine.
El problema central es que WinRM espera argumentos válidos y no vacíos al iniciar un comando de shell ( WSManRunShellCommand Si su script, herramienta de automatización (como Ansible, Jenkins o Azure DevOps), o entrada manual de CLI pasa una cadena vacía ( "" ), una variable nula, o un parámetro escapado incorrectamente donde se requiere explícitamente un comando o argumento, WinRM rechaza la solicitud con este error. También puede desencadenarse por discrepancias de codificación de caracteres, configuraciones de sesión de WinRM dañadas o restricciones estrictas de políticas en el host remoto que eliminan argumentos específicos durante el tránsito.
Soluciones paso a paso
Solución 1: Compruebe y limpie sus argumentos de comando
Con mayor frecuencia, este error es causado por una variable que se evalúa a derecho a cero antes de que se envíe el comando.
- Locate the script or task que desencadenó el error.
- Review the exact command string que se pasa al host remoto.
- Busque variables vacías (por ejemplo,
Invoke-Command -ScriptBlock { & $executable $arguments }¿ Dónde ?$executable- ¿ Qué ?$argumentssucede que está vacío o nulo). - Hardcode a simple test command (como
whoami- ¿ Qué ?hostname) en lugar de sus variables. - Si el comando de prueba funciona, añadir la lógica de validación a su script para asegurarse de que ningún argumento es nulo antes de ejecutar, como esto:
if (-not [string]::IsNullOrEmpty($myArgument)) { # Run your WinRM command here }
Corrección 2: Registre y reinicie el servicio WinRM
Si los argumentos están bien, la configuración del servicio WinRM en el cliente o el host podría estar fallando o fuera de sincronización.
- Haga clic en el Start Menú, tipo
cmdHaga clic derecho. Command Prompt, y seleccione Run as administrator. - Detenga el servicio WinRM escribiendo el siguiente comando y presionando Enter:
net stop winrm - Desregistre la configuración WinRM para borrar los estados atascados:
winrm unconfig - Reinicie la configuración WinRM predeterminada y las excepciones del cortafuegos:
winrm quickconfig -q - Reinicie el servicio para aplicar los cambios de forma limpia:
net start winrm
Corrección 3: Corrección de argumentos que escapan para la automatización de terceros (Ansible / Jenkins)
Si se produce este error mientras se utilizan plataformas de automatización para controlar nodos de Windows, el problema generalmente radica en cómo se procesan las comillas o caracteres especiales.
- Abra su libreta de configuración o guión de la tubería.
- Compruebe si está pasando comandos con comillas anidadas (por ejemplo,
"powershell.exe -Command "Write-Output 'Hello'"") y de la Comisión). - Change the escaping style Por ejemplo, en Ansible, use el
win_shellmódulo en lugar de crudowin_command, o envuelva sus comandos de PowerShell usando el escalar de bloques literal (|) para evitar que YAML convierta los argumentos en valores nulos:- name: Run powershell script safely ansible.windows.win_shell: | $path = "C:\Program Files\App" Start-Process -FilePath "$path\run.exe"
Corrección 4: Aumentar WinRM MaxShellsPerUser y MaxMemoryPerShell
A veces WinRM deja caer argumentos o devuelve punteros internos nulos porque se está quedando sin recursos operativos asignados.
- Abierto. PowerShell as an Administrator en la máquina de Windows de destino.
- Compruebe sus configuraciones actuales de MaxShellsPerUser y MaxMemory:
Get-Item WSMan:\localhost\Shell\* - Aumentar el límite de memoria por shell para evitar caídas silenciosas durante el análisis de argumentos:
Set-Item WSMan:\localhost\Shell\MaxMemoryPerShellMB 1024 - Aumente el límite de capas concurrentes para asegurarse de que su proceso no se esté ahogando:
Set-Item WSMan:\localhost\Shell\MaxShellsPerUser 30 - Reinicie el servicio WinRM para aplicar las actualizaciones de recursos:
Restart-Service winrm
Puede haber algunos errores.. Learn Microsoft