كيفية إصلاح "عميل WinRM Shell لا يستطيع معالجة الطلب. إحدى قيم الحجج التي تم تمريرها إلى وظيفة WSManRunShellCommand هي null أو صفر".
الوصف
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.
القضية الأساسية هي أن WinRM تتوقع حجج صالحة غير فارغة عند بدء أمر قذيفة ( WSManRunShellCommand إذا كان النص الخاص بك، أداة التشغيل الآلي (مثل Ansible، Jenkins، أو Azure DevOps) ، أو إدخال CLI يدوي يمر سلسلة فارغة ( "" ), متغير صفر ، أو معيار هرب بشكل غير صحيح حيث يتم طلب أمر أو حجة صراحة ، يرفض WinRM الطلب مع هذا الخطأ. يمكن أيضًا أن يتم تشغيله بسبب عدم تطابق تشفير الأحرف ، أو تكوينات جلسة WinRM المتلفة ، أو قيود سياسة صارمة على المضيف البعيد التي تمحو الحجج المحددة أثناء النقل.
إصلاحات خطوة بخطوة
إصلاح 1: تحقق وتطهير حجج الأوامر الخاصة بك
في معظم الأحيان، يسبب هذا الخطأ متغير يقيّم إلى صفر قبل إرسال الأمر.
- Locate the script or task الذي أثار الخطأ.
- Review the exact command string يتم تمريرها إلى المضيف البعيد.
- ابحث عن متغيرات فارغة (على سبيل المثال،
Invoke-Command -ScriptBlock { & $executable $arguments }أين ؟$executableأو$argumentsيحدث أن تكون فارغة أو خالية). - Hardcode a simple test command (مثل)
whoamiأوhostname) في مكان المتغيرات الخاصة بك. - إذا كانت أوامر الاختبار تعمل، أضف منطق التحقق من صحة النص الخاص بك للتأكد من عدم وجود حجج فارغة قبل التنفيذ، مثل هذا:
if (-not [string]::IsNullOrEmpty($myArgument)) { # Run your WinRM command here }
إصلاح 2: إعادة تسجيل وإعادة تشغيل خدمة WinRM
إذا كانت الحجج على ما يرام، فإن تكوين خدمة WinRM على العميل أو المضيف قد يكون معطلاً أو غير متزامن.
- اضغط على Start قائمة، نوع
cmdانقر على الزر الأيمن Command Prompt ، وتحديد Run as administrator. - أوقف خدمة WinRM عن طريق كتابة الأمر التالي والضغط Enter:
net stop winrm - إلغاء تسجيل تكوين WinRM لإزالة الحالات المتعثرة:
winrm unconfig - إعادة تشغيل تكوين WinRM الافتراضي واستثناءات جدار الحماية:
winrm quickconfig -q - إعادة تشغيل الخدمة لتطبيق التغييرات بشكل نظيف:
net start winrm
إصلاح 3: إصلاح حجة الهروب لأتمتة الطرف الثالث (Ansible / Jenkins)
إذا كنت تواجه هذا الخطأ أثناء استخدام منصات التشغيل الآلي للتحكم في عقد ويندوز، تكمن المشكلة عادة في كيفية معالجة الاقتباسات أو الحروف الخاصة.
- افتح كتاب التكوين الخاص بك أو نص خط الأنابيب.
- تحقق مما إذا كنت تمرر الأوامر مع علامات الاستشهاد المتداخلة (على سبيل المثال،
"powershell.exe -Command "Write-Output 'Hello'"") - Change the escaping style على سبيل المثال، في Ansible، استخدم
win_shellوحدات بدلا من خامwin_command، أو قم بتغليف أوامر PowerShell الخاصة بك باستخدام مقياس الكتل الحرفية (|) لمنع YAML من تحويل الحجج إلى قيم صفرية:- name: Run powershell script safely ansible.windows.win_shell: | $path = "C:\Program Files\App" Start-Process -FilePath "$path\run.exe"
إصلاح 4: زيادة WinRM MaxShellsPerUser و MaxMemoryPerShell
في بعض الأحيان ينزل WinRM الحجج أو يعيد المؤشرات الداخلية الصافية لأنه ينفد من الموارد التشغيلية المخصصة.
- افتح PowerShell as an Administrator على جهاز ويندوز المستهدف
- تحقق من تكوينات MaxShellsPerUser و MaxMemory الحالية:
Get-Item WSMan:\localhost\Shell\* - زيادة الحد الأقصى للذاكرة لكل قذيفة لمنع حدوث حوادث صامتة أثناء تحليل الحجج:
Set-Item WSMan:\localhost\Shell\MaxMemoryPerShellMB 1024 - قم بزيادة الحد المحدد للقشرة المتزامنة لضمان عدم خنق العملية:
Set-Item WSMan:\localhost\Shell\MaxShellsPerUser 30 - إعادة تشغيل خدمة WinRM لتطبيق تحديثات الموارد:
Restart-Service winrm
قد يكون هناك بعض الأخطاء. Learn Microsoft