ابزار قدرتمند PowerShell: فلسفه، تاریخچه، نصب و راه‌اندازی و یک مثال جذاب و کاربردی

توجه: این مقاله به مرور زمان، ویرایش و یا تکمیل می‌شود!تقاضا: در صورتی که با مشکل تایپی، دستوری و یا مفهومی در این مقاله برخورد کردید، از شما دوست عزیز و گرامی، صمیمانه تقاضا می‌کنم که اینجانب را مطلع کرده، تا نسبت به تصحیح و یا تکمیل آن، در اسرع وقت، اقدام نمایم.با کمال تشکرداریوش تصدیقیکانال تلگرام: IranianExperts@شماره تلفن همراه: ۰۹۱۲۱۰۸۷۴۶۱نشانی پست الکترونیکی: DariushT@GMail.comفیلم‌های آموزشی https://www.aparat.com/DariushTآدرس سایت‌ها: https://WebsiteAnalytics.ir - http://IranianExperts.ir - http://Date2Date.irنسخه مقاله: ۱.۰ - تاریخ بروزرسانی: ۱۳۹۹/۰۳/۰۵فلسفه PowerShellتا قبل از Windows Server 2003 SP1، هر عملیات سیستمی، که می‌خواستیم انجام دهیم، فقط از طریق محیط گرافیکی ویندوز امکان‌پذیر بود. هر چند که با وجود Windows Command Prompt، می‌توانستیم به جای محیط Windows Explorer، و با استفاده از دستورات dir، فهرست فایل‌ها و پوشه‌های ویندوز را مشاهده کرده و با دستوری مانند md، اقدام به ایجاد یک پوشه نماییم و غیره، ولی این محیط Windows Command Prompt و مجموعه دستورات آن (DOS)، بسیار ضعیف و محدود بودند!شاید یکی از مهم‌ترین دلایلی که متخصصین شبکه، از سیستم‌عامل ویندوز، دلسرد شده (فارغ از مباحث امنیتی و رایگان بودن و غیره) و به سیستم‌عامل لینوکس (Linux)، علاقه‌مند شده بودند، همین ضعف Windows Command Prompt بود. هر چند که ما می‌توانیم (می‌توانستیم) به زیبایی و در حالی که به پشتی صندلی خود تکیه داده‌ایم و با استفاده از ماوس، در محیط ویندوز، بر روی My Computer = This PC، دکمه سمت راست ماوس را زده، گزینه Manage را انتخاب کرده و سپس از طریق انتخاب گزینه Local Users and Groups، اقدام به ایجاد گروه‌ها و حساب‌های کاربری نماییم! ولی زمانی که مسئول یک شبکه کامپیوتری بزرگ هستیم و باید بیش از ۱۰۰۰ حساب کاربری و ۱۰۰ گروه کاربری تعریف نماییم، این روال گرافیکی و جذاب، تقریبا ما را دیوانه می‌کند! در صورتی که از همان ابتدا در محیط لینوکس، می‌توانستیم با استفاده از یک دستور ساده add-user در محیط ترمینال (SHELL)، اقدام به ایجاد یک حساب کاربری کرده و یا با استفاده از فایل‌های sh لینوکس، چیزی شبیه Batch File، ایجاد کرده و با استفاده از یک دستور حلقه، اقدام به ایجاد هزاران حساب کاربری و گروه‌های کاربری نماییم!این جذابیت لینوکس که اجازه می‌داد که تقریبا هر کاری که می‌توان در محیط گرافیکی آن انجام داد را در محیط ترمینال آن، و با استفاده از دستورات انجام دهیم و چه بسا کارهایی را انجام دهیم که حتی در محیط گرافیکی نیز امکان‌پذیر نبود! ویندوز را بر آن داشت که نسبت به ایجاد یک محیط قدرتمندتر از Windows Command Prompt، اقدامی اساسی کند. مایکروسافت در اولین اقدام PowerShell نسخه یک را در محیط ویندوز ایجاد کرد و پس از آن در محیط ویندوز، ما شاهد دو محیط برای اجرای دستورات بودیم!محیط Windows Command Promptمحیط Windows PowerShellدر محیط Windows PowerShell، ضمن آن‌که تمامی دستورات DOS، قابلیت اجرا داشتند، مجموعه دستورات PowerShell، توجه اکثر متخصصین شبکه و حتی برنامه‌نویسان را به خود جلب کرد! تا جایی که در آخرین نسخه PowerShell، یعنی نسخه ۷ آن، تقریبا هر کاری که در محیط گرافیکی ویندوز و به صورت Wizard، انجام می‌دهیم، معادل آن، دستوری در این محیط قدرتمند وجود دارد!پاورشل تا نسخه ۴، به صورت Native، توسعه پیدا کرد و برای اولین بار، مایکروسافت برای توسعه نسخه ۵ از DOT NET Framework استفاده کرد. مایکروسافت در نسخه ۵.۱، دو نسخه از پاورشل را منتشر نمود، یک نسخه به اصطلاح Desktop که کماکان با DOT NET Framework، توسعه پیدا کرده بود و یک نسخه به نام Core، که با اولین نسخه DOT NET Core ایجاد شده بود. مایکروسافت نسخه ۶ را کمی تغییر نام داد و نام آن‌را PowerShell Core 6.0 قرار داد و صرفا از DOT NET Core، آن هم نسخه ۲ برای توسعه آن استفاده کرده. این روال تا نسخه ۶.۲ نیز ادامه داشت، تا در نهایت مجددا در نسخه ۷، نام آنٰ‌را به اختصار PowerShell 7 نام نهاد. مایکروسافت در این نسخه از DOT NET Core 3.1 استفاده کرد و از آنجایی که مدت‌هاست که تصمیم گرفته که از حالت دو نسخه‌ای DOT NET Framework (آخرین نسخه آن ۴.۸) و DOT NET Core (آخرین نسخه آن ۳.۱) خارج شود، به زودی نسخه DOT NET 5 را منتشر خواهد کرد که در واقع نسخه یکی شده این دو خواهد بود. به همین دلیل نیز از اضافه کردن کلمه Core، به ادامه کلمه PowerShell اجنتاب کرد!از آن‌جایی که DOT NET Core، یک بستر Cross Platform می‌باشد! و برنامه‌هایی که با این فریم‌ورک ایجاد می‌شوند، قابلیت اجرا شدن در محیط‌های لینوکس و iOS را دارند، خصوصا از نسخه ۶ پاورشل، بسیاری از کاربران لینوکس و iOS نیز به این ابزار علاقه‌مند شده و از آن در سیستم‌عامل‌های خود استفاده می‌کنند. خصوصا کسانی که به هر شکل، در طول روز، با سیستم‌عامل‌های متنوعی سر و کار دارند! و به جای این‌که مثلا در سیستم‌عامل لینوکس حفظ کنند که برای نمایش فایل‌ها و پوشه‌ها، دستوری به نام ls‌ وجود دارد و در سیستم‌عامل ویندوز، دستوری به نام dir وجود دارد، اگر بر روی دستورات پاورشل، سرمایه‌گذاری کنند، به راحتی با نوشتن دستور Get-ChildItem می‌توانند به مقصود خود در هر سیستم‌عاملی برسند!تاریخچه مختصری از PowerShellPowerShell 1.0تاریخ انتشار:‌۲۰۰۶زبان‌برنامه‌نویسی: Nativeتعداد دستورات: ۱۲۹سیستم‌عامل‌هایی که آن‌را پشتیبانی می‌کنند:Windows VistaWindows XP SP2Windows Server 2008Windows Server 2003 SP1PowerShell 2.0تاریخ انتشار:‌۲۰۰۸زبان‌برنامه‌نویسی: Nativeتعداد دستورات: ۶۳۲سیستم‌عامل‌هایی که آن‌را پشتیبانی می‌کنند:Windows 7Windows XP SP3Windows Vista SP1Windows Server 2008 R2Windows Server 2003 SP2PowerShell 3.0تاریخ انتشار: ۲۰۱۲زبان‌برنامه‌نویسی: Nativeتعداد دستورات: بیش از ۱۰۰۰ دستورسیستم‌عامل‌هایی که آن‌را پشتیبانی می‌کنند:Windows 8Windows 7 SP1Windows Server 2012Windows Server 2008 SP1Windows Server 2008 R2 SP1PowerShell 4.0تاریخ انتشار:‌۲۰۱۴زبان‌برنامه‌نویسی: Nativeتعداد دستورات: بیش از ۱۰۰۰ دستورسیستم‌عامل‌هایی که آن‌را پشتیبانی می‌کنند:Windows 8.1Windows 7 SP1Windows Server 2012Windows Server 2012 R2Windows Server 2008 SP1Windows Server 2008 R2 SP1PowerShell 5.0تاریخ انتشار:‌۲۰۱۶زبان‌برنامه‌نویسی: DOT Net Frameworkتعداد دستورات: بیش از ۱۳۰۰ دستورسیستم‌عامل‌هایی که آن‌را پشتیبانی می‌کنند:Windows 8.1Windows Server 2016PowerShell 5.1تاریخ انتشار:‌۲۰۱۷زبان‌برنامه‌نویسی: نسخه Desktop: استفاده از DOT NET Frameworkنسخه Core: استفاده از DOT NET Core 1.0تعداد دستورات: ۱۵۸۶سیستم‌عامل‌هایی که آن‌را پشتیبانی می‌کنند:Windows 10Windows 8Windows 8.1Windows 7 SP1Windows Server 2016Windows Server 2008Windows Server 2008 R2Windows Server 2012Windows Server 2012 R2Windows Server 2016 Nano ServerPowerShell Core 6.0تاریخ انتشار:‌۲۰۱۸زبان‌برنامه‌نویسی: DOT NET Core 2.0تعداد دستورات: بیش از ۱۸۰۰ دستورنکته: PowerShell رسما از این نسخه Cross Platform شد!PowerShell Core 6.1تاریخ انتشار:‌۲۰۱۹زبان‌برنامه‌نویسی: DOT NET Core 2.1تعداد دستورات: بیش از ۱۹۰۰ دستوراین نسخه نیز Cross Platform می‌باشد!PowerShell Core 6.2تاریخ انتشار:‌۲۰۱۹زبان‌برنامه‌نویسی: DOT NET Core 2.2تعداد دستورات: بیش از ۱۹۰۰ دستوراین نسخه نیز Cross Platform می‌باشد!PowerShell 7.0تاریخ انتشار:‌۲۰۱۹زبان‌برنامه‌نویسی: DOT NET Core 3.1تعداد دستورات: کاهش دستورات به ۱۵۰۷ دستور!این نسخه نیز Cross Platform می‌باشد!نصب و راه‌اندازیبرای نصب و راه‌اندازی نسخه دلخواه PowerShell می‌توانیم به نشانی ذیل مراجعه نماییم:https://github.com/PowerShell/PowerShell https://github.com/PowerShell/PowerShell برای دریافت اطلاعات از امکانات PowerShell می‌توانیم به نشانی ذیل مراجعه نماییم:https://docs.microsoft.com/en-us/powershell/scripting/learn/ps101/powershell.exe-command-line-help?view=powershell-7 https://docs.microsoft.com/en-us/powershell/scripting/learn/ps101/powershell.exe-command-line-help?view=powershell-7 یک آموزش کاربردی برای شروع کار با PowerShellدر خیلی از مواقع این اتفاق رخ می‌دهد! زمانی که به شرکت یا سازمانی می‌رویم، و می‌خواهیم Laptop خود را به شبکه آن شرکت متصل نماییم، از ما می‌خواهند که DNS سیستم خود را (کارت شبکه‌ای که قرار است به شبکه آن‌ها و یا اینترنت متصل شویم) تغییر دهیم! فرآیند این کار هر چند که در محیط ویندوز کاملا گرافیکی و به صورت Wizard می‌باشد، ولی وقتی که قرار است هر بار کل آن مسیر را با کلیک و دابل کلیک طی کرده و سپس اقدام به نوشتن DNS مذکور کرده و یا آن‌را هر بار پاک (حذف) نماییم، جدا آزار دهنده است! فارغ از این اتفاق که به کرات رخ می‌دهد، شاید اکثر شما عزیزان با سایت شکن آشنایی داشته باشید! سایت شکن:https://shecan.ir/ https://shecan.ir/ یک سایت فوق‌العاده است که به ما این امکان را می‌دهد که با تغییر دادن DNS، کارت شبکه‌ای که به اینترنت متصل می‌باشد، به سایت‌هایی ورود نماییم که ایران را فیلتر کرده‌اند! به هر حال، ما همیشه احتیاج به این IP های DNS نداریم! و برای این‌که هربار مجبور نباشیم که آن‌ها را بر روی کارت شبکه مورد نظر Set کرده و سپس آن‌ها را حذف نماییم، می‌توانیم از دستورات PowerShell استفاده نماییم.برای این منظور، قبل از آن‌که دستورات PowerShell را اجرا نماییم، محیط PowerShell را (برای این‌که برای اجرای بعضی از دستورات دچار خطای Permission نشویم!) به صورت Run as Administrator اجرا می‌کنیم:دستور ذیل، فهرست تمام Interface های شبکه را به ما نمایش می‌دهد. ما به دستور ذیل نیاز داریم، چرا که در ادامه راه، می‌خواهیم از طریق دستورات PowerShell اعلام نماییم که می‌خواهیم DNS مورد نظر را بر روی کدام Interface، ثبت نماییم:Get-NetAdapterالبته برای این آموزش، می‌توانیم از دستور ذیل استفاده کرده، تا صرفا اینترفیس‌های فیزیکی (مانند کارت شبکه Ethernet و کارت شبکه بی‌سیم) نمایش داده شود:Get-NetAdapter -physicalاز آن‌جایی که در این مقاله، می‌خواهم DNS را بر روی کارت شبکه بی‌سم (Wireless)، تنظیم نمایم، با استفاده از یکی از دستورات فوق، اندیس Interface آن‌را (در این مثال شماره ۹) را بدست می‌آورم!با استفاده از دستور ذیل، می‌توانیم DNS ای که بر روی Interface‌ مورد نظر (در این مثال کارت شبکه بی‌سیم)، تنظیم شده است را مشاهده نماییم:Get-DnsClientServerAddress -InterfaceIndex 9با استفاده از دستور ذیل، می‌توانیم DNS مورد نظر خود را (در این مثال DNS مربوط به سایت شکن!) بر روی Interface مورد نظر (در این مثال کارت شبکه بی‌سیم) تنظیم نماییم:Set-DnsClientServerAddress -InterfaceIndex 9 -ServerAddresses (&quot178.22.122.100&quot,&quot185.51.200.2&quot)می‌توانیم پس از اجرای دستور فوق، مجدد از دستور ذیل استفاده کرده و از تنظیم شدن DNS جدید، اطمینان حاصل نماییم:Get-DnsClientServerAddress -InterfaceIndex 9برای این‌که DNS تنظیم شده را حذف کرده و اصطلاحا DNS تنظیم شده را Reset نماییم، می‌توانیم از دستور ذیل استفاده نماییم:Set-DnsClientServerAddress -InterfaceIndex 9 -ResetServerAddressesمجددا می‌توانیم با استفاده از دستور ذیل، از حذف شدن DNS مذکور، اطمینان حاصل کنیم:Get-DnsClientServerAddress -InterfaceIndex 9پایان