قسمت هشتم : انواع PowerShell Remoting

2 85

قسمت هشتم : انواع PowerShell Remoting

دوستان عزیز امیدوارم مثل همیشه حالتون خوب باشه. در این قسمت از سری مقالات آموزشی پاورشل من تصمیم گرفتم درمورد PS Remoting صحبت کنم و البته نکات بسیار مهم و قابل توجهی در این مقاله گفته می شود که امیدوار هستم که برای شما جامع و کاربردی باشد.

 

ساختار PS Remoting

برای اینکه ما بخواهیم از طریق پاورشل به سیستم های دیگری ریموت بزنیم باید پورت و پروتکلی برای این کار وجود داشته باشند تا ما از آن برای ریموت زدن استفاده کنیم. پاورشل نیز از Windows Server 2012 به بالا از پروتکل WS-MAN استفاده می کند.

Web Services-Management Protocol یا WS-MAN از پورت های زیر استفاده می کند :

HTTP : 5985

HTTPS : 5986

اما PS Remoting چگونه کار می کند؟

وقتی ما با پاورشل از طریق پروتکل WS-MAN به یک سیستم دیگر ریموت می زنیم و یک کامندی را اجرا می کنیم، خروجی کامند در مقصد تبدیل به یک XML می شود و در صفحه نمایش ما از حالت XML خارج شده و نتایج به ما نمایش داده می شود. باید به این نکته توجه داشته باشید که اطلاعات نمایش داده شده مربوط به زمانی است که کامند شما در مقصد اجرا شده است و درواقع آن اطلاعات یک Snapshot هایی هستند که بروزرسانی نمی شوند تا زمانی که شما دوباره دستور را اجرا کنید و نتیجه را دوباره مشاهده کنید.

 

Enable-PSRemoting

وقتی شما این کامند را بر روی یک کلاینت اجرا می کنید، به این معنی است که دیگران می توانند به این کلاینت از طریق PowerShell ریموت بزنند. اما شما وقتی دستور Enable-PSRemoting را اجرا می کنید چه کاری انجام می شود؟

  • در ابتدا باید گفت که این دستور باید با دسترسی Administrator انجام شود، پس پاورشل را بصورت Run as administrator باز کنید و این دستور را اجرا کنید.
  • سرویس WinRM را Run میکند.
  • سرویس WinRM را در حالت Automatic می گذارد.
  • یک رول در فایروال برای WS-Management میسازد و اجازه Allow میدهد.

البته چند عملیات دیگر هم برای Permission و اضافه کردن ماژول ها انجام میدهد.

فعال کردن PS Remoting از طریق پاورشل :

نکته : حتما Run as Administrator کنید.

دوستان توجه داشته باشید که ما از پارامتر SkipNetworkProfileCheck استفاده کردیم برای اینکه این دستور در صورتی پروفایل Network Adapter شما بر روی Public باشد ارور می دهد اما با این پارامتر دیگر از آن قسمت پروفایل Network Adapter را چک نمی کند و درصورتی که پروفایل Network Adapter شما Public باشد ارور نمی دهد.

 

فعال کردن PS Remoting از طریق Group Policy

نکته : همه پالیسی های زیر به Computer اعمال می شود.

  • تغییر حالت سرویس WinRm به Automatic :

  • ایجاد Rule در فایروال برای WS-MAN :

  • اجازه ریموت زدن از طریق WinRM :

.. \ Computer \ Administrative Templates \ Windows Component

دوستان در فعال کردن این پالیسی یک نکته بسیار مهم وجود دارد.  و آن این است که ما باید آیپی هایی که می توانند از PSRemoting استفاده کنند را محدود کنیم. که باید در پالیسی که در قسمت بالا به آن اشاره شد تنظیمات زیر را انجام دهیم :

 

Authentication در PS Remoting

نکته اول : بصورت دیفالت فقط Administrator ها دسترسی استفاده از PS Remoting رو دارند و برای اینکه یوزر های دیگر هم بتوانند از PS Remoting استفاده کنند باید عضو گروه Remote Management شوند.

نکته دوم : در هنگام برقراری ارتباط در PS Remoting، نه تنها یوزر باید خودش را نسبت به کامپیوتری که دارد به آن وصل می شود Authenticate کند، بلکه کامپیوتری که ما داریم به آن Remote میزنیم هم باید خود را برای ما Authenticate کند. این همان Mutual Authentication است که اتفاق می افتد.

نکته سوم : البته ما می توانیم از Certificate برای Authenticate کردن کامپیوتر ها هم استفاده بکنیم که کار بهتری است.

 

استفاده از Trusted Hosts

زمانی که کامپیوتر مبدا و مقصد در یک دامین باشند، عملیات های Authentication به راحتی انجام می شود. ولی اگر ما بخواهیم به بیرون دامین ریموت بزنیم و یا از بیرون دامین کامپیوتری بخواهد به یکی از کلاینت های دامین ما ریموت بزند باید یا از Certificate استفاده کنیم و یا کار ساده تر اما با امنیت پایین تر یعنی ایجاد تغییر در Trusted Host. وقتی ما IP و یا نام یک کامپیوتر را در Trusted Host خود اضافه می کنیم، به این معنا است که ما به پاورشل می گوییم این نام و یا IP مطمئن است و نیازی به Certificate یا چیز دیگری برای Authenticate کردن خودش ندارد.

ارور زیر مربوط به زمانی است که کامپیوتر مقصد نتوانسته خود Authenticate کند :

درصورتی که ارور بالا را دریافت کردید از روش پایین برای رفع آن استفاده کنید.

نحوه اضافه کردن IP و نام به Trusted Host :

شما بصورت زیر می توانید IP و یا نام مقصد مورد نظر را قرار دهید :

با استفاده از comma هم می توانید چند Value را همزمان وارد کنید.

Concatenate : اگر اسم هایی قبلا اضافه کرده باشید به آن ها اضافه می کند و مقادیر قدیمی را هم نگه می دارد. در حالت دیفالت مقدار جدید را با مقادیر قدیمی Replace میکند.

با دستور زیر هم می توانید از وضعیت Trusted Host خود مطلع شوید :

 

One-to-One Remoting

ما برای ریموت زدن از یک کامپیوتر به یک کامپیوتر از طریق پاورشل می توانیم از روش زیر استفاده کنیم :

استفاده از Enter-PSSession :

در این روش ما به صورت زیر می توانیم به مقصد مورد نظر ریموت بزنیم :

Credential : با استفاده از این دستور ما می توانیم با دسترسی غیر از دسترسی که در حال حاضر داریم به مقصد ریموت بزنیم.

Exit هم برای خروج از Session ریموت است.

 

استفاده از Advanced Enter-PSSesion

دوستان یک نکته خیلی مهمی در استفاده ساده از Enter-PSSession وجود دارد. نکته این است که شما وقتی Exit می کنید درواقع بطور کامل Session شما با مقصد قطع می شود و اگر بخواهید دوباره وصل شوید باید دوباره همان دستور را بزنید و نکته مهم تر این که تمام ماژول هایی که اضافه کرده بودید و یا متغیر هایی که تعریف کرده بودید از بین می روند. پس اگر می خواهید یک Session داشته باشید که ماژول ها، متغیر ها و دیگر تنظیمات درون خود نگه دارد باید مانند زیر عمل کنید :

کامند New-PSSession یک Session درست می کند و آن را آنلاین نگه می دارد تا زمانی که شما آن را Disconnect کنید.

حالا اگر شما ماژولی اضافه کنید و یا تغییراتی در مقصد انجام دهید، وقتی Exit کنید دیگر آن ها از بین نمی روند و همچنان در Session های شما باقی می مانند. شما می توانید با دستور زیر Session های خود را مشاهده کنید.

Get-PSSession

نحوه Disconnect و Connect کردن Session ها :

 

One-to-Many Remoting

ما از این روش برای اجرای یک کامند بر روی چندین کلاینت استفاده می کنیم. Syntax کامندی که ما از آن برای اجرای کامند بصورت ریموت بر روی چندین سیستم استفاده می کنیم بصورت زیر است :

Invoke-Command “ComputerNames” {Commands}

به مثال زیر دقت کنید :

پارامتر های مهم این کامند :

FilePath :

برای اجرا فایل Script در ریموت سیستم

ThrottleLimit :

برای مثال اگر ما اسم ۱۰ کامپیوتر را بدهیم این دستور بصورت دیفالت برای هر ۱۰ کامپیوتر همزمان دستورات را اجرا می کند و نتیجه ای که به ما نشان می دهد به ترتیب اسم کامپیوتر ها نیست. کاری که این پارامتر می کند این است که، ما می توانیم با استفاده از این پارامتر تعداد همزمان اجرا شدن کامند بر روی کامپیوتر را مشخص کنیم. یعنی اگر ThrottleLimit را عدد ۱ گذاشتیم به این معناست که فقط برای یک کامپیوتر دستورات ما را اجرا می کند و سپس سراغ کامپیوتر های بعدی میرود. اما ما زیاد نیازی به انجام این کار نداریم به این دلیل که می توانیم با استفاده Property به اسم PSComputerName پاسخ هر کامپیوتر را جدا کنیم و سپس نمایش دهیم تا باهم قاطی نشوند.

استفاده از PSComputerName :

استفاده از $using :

شاید زمانی ما بخواهیم از یک متغیر که در Session خود معرفی کرده  ایم، درون دستوراتی که بصورت ریموت اجرا می شوند هم استفاده کنیم. ولی نمی توانیم این کار را انجام دهیم. که این موضوع به دلیل وجود Scope است. در مقالات آینده که درباره Scripting صحبت می کنیم، Scope را توضیح خواهیم داد. به مثال زیر دقت کنید :

ارور بالا به این دلیل است که وقتی کامند در سیستم مقصد اجرا می شود متغیری به اسم $ProcessNames وجود ندارد و این باعث ارور می شود.

اما با استفاده از $using می توانیم این مشکل را حل کنیم. به مثال زیر دقت کنید :

 

Multi-Hop Remoting

شاید بعضی از مواقع ما بخواهیم از طریق اجرای یک کامند یا اسکریپت بر روی سیستم ریموت، به یک سیستم دیگ هم ریموت بزنیم و اطلاعات از آن بدست آوریم. برای اینکار شما اگر بصورت عادی و بدون در نظر گرفتن نکات، این کار را انجام دهید ارور خواهید گرفت. به این دلیل که سیستم ریموت نمی تواند از Credential شما استفاده کند.

راه حل اول : یکی از راه حل های این موضوع استفاده از Kerberos Constrained Delegation است.

راه حل دوم : راه بعدی این است که شما Credential خود را درون کامندی که بر روی مقصد اجرا می شود قرار دهید. بصورت زیر :

 

Implicit Remoting چیست؟

این نوع از ریموت زدن کمی متفاوت است. به این دلیل که ما با استفاده از این راهکار، یک یا چند ماژول را از سیستمی که ریموت زده ایم قرض می کنیم و در سیستم خود از آن استفاده می کنیم ولی درواقع کامند ها در سیستم ریموت اجرا می شوند و نتیجه به ما نمایش داده می شود. در مثال زیر ما می خواهیم از طریق Win10 ماژول های ActiveDirectory, DNSServer را از Domain Controller قرض بگیریم :

ارور بالا برای این است که ما Execution policy خود را بر روی Restricted قرار داده ایم و بادی آن را بصورت زیر تغییر دهیم :

حالا می توانیم از ماژول های قرض گرفته شده استفاده کنیم.

 

استفاده از پارمتر ComputerName

همچنین زمانی که ما از پارامتر ComputerName استفاده می کنیم نیز درواقع از PSRemoting استفاده می کنیم برای اجرای کامند بر روی یک سرور دیگر. حالا اگر بخواهیم دستوراتی که پارامتر ComputerName دارند را ببینیم می توانیم از روش زیر استفاده کنیم :

Get-Command -ParameterName ComputerName

 

خب دوستان TheWays در این مقاله تقریبا بیشتر نکات مهم درباره PS Remoting گفته شد و همه این نکات کاربردی و مورد استفاده است. درکل من تمام تلاشم به گفتن نکات کاربردی هستش. امیدوارم لذت برده باشید از این مقاله ….

منتظر مقالات بعدی باشید 🙂 …

 

منابع :

– کتاب های Learn Windows PowerShell in a Month و PowerShell in depth

– کتاب PowerShellNotesForProfessionals

– Administration and Automation with Windows PowerShell از UDEMY

– PowerShell Basics Course از ITProTV

2 نظرات
  1. Ahmad-JH می گوید

    بسیار عالی.

    1. حمیدرضا سالم می گوید

      مچکر مهندس از اینکه وقت گذاشتید

ارسال یک پاسخ

آدرس ایمیل شما منتشر نخواهد شد.