جلسات PowerShell البعيد وسؤال النطاق: يبدو أن الأوامر تعمل محليًا
-
25-09-2019 - |
سؤال
إليك نموذج نصي يحاول إنشاء جلسة عن بُعد على خادم ، ثم استخدم WMI للحصول على قائمة بتجمعات تطبيقات IIS الخاصة بالخادم ، وسرد أسمائها:
function Test-Remoting
{
[CmdletBinding()]
param
(
)
begin
{
Enter-PSSession TestServer
$appPools = Get-WmiObject -namespace "root\MicrosoftIISv2" -class "IIsApplicationPool" -Authentication 6
$appPools | ForEach-Object {
$appPool = $_;
$appPool.Name
}
Exit-PSSession
}
}
هذه الوظيفة موجودة في ملف بعنوان "test-remoting.ps1." أفتح PowerShell ، قرص مضغوط في الدليل الذي يحتوي على هذا الملف ، ونقل الملف في الملف ، واتصل بالوظيفة:
PS C:\Users\moskie> . .\Test-Remoting.ps1
PS C:\Users\moskie> Test-Remoting
لكن نتيجة هذا البرنامج النصي هي قائمة بتجمعات التطبيقات على بلدي محلي آلة ، و ليس TestServer.
بدلاً من ذلك ، إذا قمت بتشغيل الأسطر التالية (مماثلة لتلك الموجودة في الوظيفة) يدويًا في موجه PowerShell ، i فعل احصل على قائمة تجمعات التطبيق على الخادم البعيد:
PS C:\Users\moskie> Enter-PSSession TestServer
[TestServer]: PS C:\> $appPools = Get-WmiObject -namespace "root\MicrosoftIISv2" -class "IIsApplicationPool" -Authentication 6
[TestServer]: PS C:\> $appPools | ForEach-Object { $appPool = $_; $appPools.Name }
<a list of the names of the application pools on TestServer>
[TestServer]: PS C:\>
أعتقد أن هناك مفهومًا أنا غافلاً ، فيما يتعلق ببريدشيل عن بعد ونطاقه. هل يمكن لأي شخص أن يساعد في شرح هذا السلوك؟
المحلول
أعتقد أن Enter/Exit-Pssession يعني الاستخدام التفاعلي. من مساعدة Enter-Pssession:
SYNOPSIS
Starts an interactive session with a remote computer.
في البرنامج النصي ، استخدم pssession الجديد واستدعاء مثل ذلك:
$session = New-PSSession server01
Invoke-Command -Session $session {hostname}
Remove-PSSession -Session $session
تحديث: لتنفيذ برنامج نصي كامل استخدم المعلمة FilePath عن بعد على invoke-command:
icm server01 -FilePath C:\users\keith\myscript.ps1 -arg 1,2
سيؤدي ذلك إلى نسخ البرنامج النصي إلى جهاز الكمبيوتر عن بُعد Server01 وتنفيذه هناك باستخدام المعلمات المقدمة.