Comment réparer "Le client WinRM Shell ne peut pas traiter la requête. L'une des valeurs d'argument passée à la fonction WSManRunShellCommand est nulle ou nulle".
Définition
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.
Le problème central est que WinRM s'attend à des arguments valables et non vides lors de l'initiation d'une commande de shell ( WSManRunShellCommand Si votre script, outil d'automatisation (comme Ansible, Jenkins ou Azure DevOps), ou entrée manuelle CLI passe une chaîne vide ( "" WinRM rejette la requête avec cette erreur. Elle peut également être déclenchée par des déséquilibres de codage de caractères, des configurations de session WinRM corrompues ou des restrictions strictes de stratégie sur l'hôte distant qui suppriment des arguments spécifiques pendant le transit.
Réparations étape par étape
Correction 1: Vérifiez et désinfectez vos arguments de commande
Le plus souvent, cette erreur est causée par une variable qui évalue à zéro avant que la commande ne soit envoyée.
- Locate the script or task qui a déclenché l'erreur.
- Review the exact command string être transmis à l'hôte distant.
- Recherchez des variables vides (par exemple,
Invoke-Command -ScriptBlock { & $executable $arguments }Où ?$executableou...$argumentsest vide ou nulle). - Hardcode a simple test command (comme
whoamiou...hostname) à la place de vos variables. - Si la commande test fonctionne, ajoutez une logique de validation à votre script pour s'assurer qu'aucun argument n'est nul avant l'exécution, comme ceci:
if (-not [string]::IsNullOrEmpty($myArgument)) { # Run your WinRM command here }
Correction 2: Réinscrivez et redémarrez le service WinRM
Si les arguments sont corrects, la configuration du service WinRM sur le client ou l'hôte pourrait être défectueuse ou hors de synchronisation.
- Cliquez sur le Start le menu, le type
cmd, cliquez avec le bouton droit. Command Prompt, et sélectionnez Run as administrator. - Arrêtez le service WinRM en tapant la commande suivante et en appuyant Enter:
net stop winrm - Désenregistrer la configuration WinRM pour effacer les états bloqués:
winrm unconfig - Réinitialisez la configuration WinRM par défaut et les exceptions du pare-feu:
winrm quickconfig -q - Redémarrez le service pour appliquer les modifications correctement:
net start winrm
Correction 3: Correction de l'évasion d'argument pour une automatisation de tierce partie (Ansible/Jenkins)
Si vous rencontrez cette erreur lorsque vous utilisez des plates-formes d'automatisation pour contrôler les nœuds Windows, le problème réside généralement dans la façon dont les guillemets ou les caractères spéciaux sont traités.
- Ouvrez votre manuel de configuration ou le script du pipeline.
- Vérifiez si vous passez des commandes avec des guillemets imbriqués (par exemple,
"powershell.exe -Command "Write-Output 'Hello'"") et de l'Union européenne. - Change the escaping style Par exemple, dans Ansible, utilisez le
win_shellmodule au lieu de RAWwin_command, ou enveloppez vos commandes PowerShell en utilisant le scalaire de bloc littéral (|Pour empêcher YAML de convertir des arguments en valeurs nulles:- name: Run powershell script safely ansible.windows.win_shell: | $path = "C:\Program Files\App" Start-Process -FilePath "$path\run.exe"
Correction 4: Augmenter le WinRM MaxShellsPerUser et le MaxMemoryPerShell
Parfois, WinRM laisse tomber des arguments ou renvoie des pointeurs internes nuls parce qu'il est à court de ressources opérationnelles allouées.
- Ouvrez. PowerShell as an Administrator sur la machine Windows cible.
- Vérifiez vos configurations actuelles MaxShellsPerUser et MaxMemory:
Get-Item WSMan:\localhost\Shell\* - Augmenter la limite de mémoire par shell pour éviter les crashs silencieux lors de l'analyse d'arguments:
Set-Item WSMan:\localhost\Shell\MaxMemoryPerShellMB 1024 - Augmentez la limite de coquille simultanée pour vous assurer que votre processus n'est pas étouffé:
Set-Item WSMan:\localhost\Shell\MaxShellsPerUser 30 - Redémarrez le service WinRM pour appliquer les mises à jour des ressources:
Restart-Service winrm
Il y a peut-être des erreurs.. Learn Microsoft