پک عملی شماره ۴

PowerShell برای پشتیبان شبکه

از مفهوم Object و Pipeline تا عیب‌یابی واقعی Adapter، IP، DNS، Route، Port، Service، Event Log، Domain و مستندسازی؛ با تمرکز روی خواندن خروجی و تصمیم بعدی

۴۱ بخش عملیObject & PipelineNetwork CmdletsIf → Thenسناریو واقعی
Windows PowerShell
مسیر کامل این کارگاه
۱PowerShell را درست باز کن۲فرق PowerShell با CMD را بفهم۳Get-Command و Get-Help؛ به‌جای حفظ کردن، خود PowerShell را سؤال کن۴$PSVersionTable؛ اول بفهم با Windows PowerShell 5.1 کار می‌کنی یا PowerShell 7۵Object و Pipeline؛ مهم‌ترین تفاوت فکری PowerShell با CMD۶Select-Object؛ فقط ستون‌هایی را نگه دار که برای عیب‌یابی لازم داری۷Where-Object؛ خروجی را بر اساس شرط واقعی فیلتر کن۸Sort-Object و Measure-Object؛ داده را مرتب و خلاصه کن۹Format-Table و Format-List؛ فقط در انتهای Pipeline برای نمایش۱۰Variableها؛ نتیجه را نگه دار و چند بار استفاده کن۱۱Get-NetAdapter؛ کارت شبکه را از دید Windows دقیق بخوان۱۲Get-NetIPConfiguration؛ نسخه PowerShellیِ نگاه سریع به IP، Gateway و DNS۱۳Get-NetIPAddress؛ وقتی جزئیات آدرس و Prefix مهم است۱۴Get-NetRoute؛ Routing Table را به‌صورت Object تحلیل کن۱۵Get-NetNeighbor؛ ARP/Neighbor Cache را با PowerShell بخوان۱۶Get-DnsClientServerAddress؛ دقیقاً ببین هر Interface از چه DNSی استفاده می‌کند۱۷Resolve-DnsName؛ نسخه قدرتمندتر PowerShell برای Query کردن DNS۱۸Test-NetConnection؛ Ping، Port و Route را در یک ابزار جمع کن۱۹Get-NetTCPConnection؛ Connection و Listening Port را Object‌محور ببین۲۰Get-NetAdapterStatistics؛ Error و Drop کارت شبکه را بررسی کن۲۱Set-DnsClientServerAddress؛ DNS را تغییر بده، اما بدان دقیقاً چه اثری دارد۲۲Restart-NetAdapter و Disable/Enable؛ ابزار ساده‌ای که می‌تواند Remote Session را قطع کند۲۳Get-Service؛ وضعیت سرویس را Object‌محور بررسی کن۲۴Get-Process؛ PID، CPU و Memory Process را بررسی کن۲۵Get-WinEvent؛ از Event Log به‌جای حدس استفاده کن۲۶Get-CimInstance؛ اطلاعات سیستم را Structured بگیر۲۷Get-LocalUser و Get-LocalGroupMember؛ حساب Local را از Domain Account جدا کن۲۸New-PSDrive؛ Shared Folder را Map کن و خطا را درست تفسیر کن۲۹Execution Policy؛ خطای «running scripts is disabled» را درست بفهم۳۰Export-Csv و Out-File؛ نتیجه عیب‌یابی را قابل استفاده تحویل بده۳۱Start-Transcript؛ Session عیب‌یابی را ثبت کن۳۲Test-ComputerSecureChannel؛ Trust بین Client و Domain را بررسی کن۳۳Error Record؛ خط قرمز PowerShell را کامل بخوان۳۴سناریو: فقط یک Client اینترنت ندارد۳۵سناریو: Port سرویس باز نیست۳۶سناریو: Domain و GPO مشکل دارد۳۷سناریو: Shared Folder۳۸سناریو: قطع‌ووصلی شبکه۳۹سناریو: Inventory و Escalation۴۰جدول انتخاب Cmdlet۴۱چک‌لیست پایان پک
رویکرد این پک

PowerShell را مثل CMD با دستورهای جدید یاد نمی‌گیری؛ باید طرز فکرش را بفهمی

قدرت اصلی PowerShell در Object، Property، Pipeline، Filter و Automation است. اگر فقط اسم Cmdletها را حفظ کنی بخش مهم PowerShell را از دست می‌دهی. در این پک هر خروجی را می‌خوانیم و مشخص می‌کنیم نتیجه چه معنایی دارد و قدم بعدی چیست

مشکل کاربر
داده Structured
Filter
تفسیر
اقدام
بررسی
۱
شروع

PowerShell را از Windows 11 درست باز کن

در Windows 11 می‌توانی PowerShell را از Search پیدا کنی. برای بیشتر دستورهای مشاهده‌ای نیازی به Administrator نیست. فقط وقتی یک دستور واقعاً به دسترسی بالاتر نیاز دارد PowerShell را با Run as administrator باز کن

PowerShell در Windows 11
Windows PowerShell console
Run PowerShell as administrator
Administrator Windows PowerShell
نکته عملی

اگر Title Bar عبارت Administrator را دارد PowerShell با دسترسی Administrator اجرا شده است. فقط زمانی PowerShell را با دسترسی Administrator باز کن که دستور واقعاً به آن نیاز داشته باشد

۲
طرز فکر PowerShell

فرق مهم PowerShell با CMD: خروجی فقط متن نیست

در CMD معمولاً خروجی را به‌شکل متن می‌بینی. در PowerShell بسیاری از دستورها Object می‌سازند. Object یعنی داده دارای Property مثل Name، Status، IPAddress و LinkSpeed. Pipeline می‌تواند همین Object را به Cmdlet بعدی بدهد تا دقیق Filter، Select، Sort یا Export شود

Get-NetAdapter |
    Where-Object Status -eq 'Up' |
    Select-Object Name,LinkSpeed,MacAddress

در این مثال رشته متن را Search نمی‌کنیم. PowerShell Property واقعی Status را بررسی می‌کند و بعد Propertyهای موردنیاز را انتخاب می‌کند

۳
آموزش عمیق PowerShell

Get-Command و Get-Help؛ به‌جای حفظ کردن، خود PowerShell را سؤال کن

این دستور را چرا اجرا می‌کنیم؟

در PowerShell تعداد Cmdletها زیاد است و قرار نیست همه آن‌ها را حفظ کنی. کار حرفه‌ای این است که بتوانی دستور مناسب را پیدا کنی و Syntax آن را از Help بخوانی

دستور

Get-Command *Net*
Get-Help Get-NetAdapter
Get-Help Get-NetAdapter -Examples
Get-Help Test-NetConnection -Full

نمونه خروجی و نحوه خواندن آن

CommandType     Name                         Version    Source
-----------     ----                         -------    ------
Function        Test-NetConnection           1.0.0.0    NetTCPIP
Cmdlet          Get-NetAdapter               2.0.0.0    NetAdapter

NAME
    Get-NetAdapter

SYNOPSIS
    Gets the basic network adapter properties.
بخش خروجیمعنی آن
CommandTypeمشخص می‌کند مورد پیدا شده Cmdlet، Function، Alias یا نوع دیگری است
Nameنام دستوری است که اجرا می‌کنی
SourceModule یا منبعی است که دستور از آن آمده
-Examplesمثال‌های رسمی همان Cmdlet را نشان می‌دهد

اگر این را دیدی یعنی چه؟

  • Get-Command چیزی پیدا نکردSpelling، Module و نسخه Windows/PowerShell را بررسی کن
  • Help خیلی کوتاه بودممکن است Help محلی کامل نباشد؛ Help Online یا مستندات رسمی همان Cmdlet را بررسی کن
قدم بعدی

قبل از اجرای Cmdlet تغییردهنده، Help پارامترهای آن را بخوان و اگر Cmdlet از WhatIf پشتیبانی می‌کند ابتدا اثر احتمالی را بررسی کن

سناریوی واقعی پشتیبانی

اسم دقیق Cmdlet مربوط به Route یادت نیست. به‌جای حدس، Get-Command *Route* می‌زنی و Cmdletهای NetTCPIP مربوط به Route را پیدا می‌کنی

۴
آموزش عمیق PowerShell

$PSVersionTable؛ اول بفهم با Windows PowerShell 5.1 کار می‌کنی یا PowerShell 7

این دستور را چرا اجرا می‌کنیم؟

Windows PowerShell 5.1 و PowerShell 7 کنار هم قابل نصب‌اند و یک محصول واحد با Version متفاوت نیستند. بعضی Moduleهای Windows در Windows PowerShell 5.1 در دسترس‌اند و رفتار بعضی Cmdletها بین محیط‌ها می‌تواند متفاوت باشد

دستور

$PSVersionTable

نمونه خروجی و نحوه خواندن آن

Name                           Value
----                           -----
PSVersion                      5.1.22621.2428
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.22621.2428
بخش خروجیمعنی آن
PSVersionنسخه PowerShell همین Session است
PSEdition: Desktopمعمولاً نشان‌دهنده Windows PowerShell 5.1 است
PSEdition: Coreدر PowerShell 7 دیده می‌شود

اگر این را دیدی یعنی چه؟

  • Cmdlet در یک سیستم هست و در سیستم دیگر نیستنسخه PowerShell، Windows و Moduleهای نصب‌شده را مقایسه کن
  • راهنمای اینترنتی مربوط به PowerShell 7 بود ولی سیستم 5.1 استCompatibility همان Cmdlet را قبل از استفاده بررسی کن
قدم بعدی

نسخه را در Ticketهای پیچیده ثبت کن چون برای عیب‌یابی Script و Module اطلاعات مهمی است

سناریوی واقعی پشتیبانی

یک Script روی لپ‌تاپ تو اجرا می‌شود ولی روی Server قدیمی خطا می‌دهد. اولین مقایسه باید Version و Module Availability باشد

۵
آموزش عمیق PowerShell

Object و Pipeline؛ مهم‌ترین تفاوت فکری PowerShell با CMD

این دستور را چرا اجرا می‌کنیم؟

PowerShell فقط متن را از یک دستور به دستور بعدی نمی‌فرستد. بسیاری از Cmdletها Object تولید می‌کنند که Property و Method دارند. اگر این مفهوم را بفهمی، فیلتر کردن و گزارش‌گیری خیلی دقیق‌تر می‌شود

دستور

Get-Service | Get-Member
Get-NetAdapter | Get-Member

نمونه خروجی و نحوه خواندن آن

TypeName: Microsoft.Management.Infrastructure.CimInstance#ROOT/StandardCimv2/MSFT_NetAdapter

Name                 MemberType     Definition
----                 ----------     ----------
InterfaceDescription Property       string InterfaceDescription
LinkSpeed            Property       ulong LinkSpeed
MacAddress           Property       string MacAddress
Name                 Property       string Name
Status               Property       string Status
بخش خروجیمعنی آن
TypeNameنوع Object خروجی را نشان می‌دهد
Propertyداده‌ای است که می‌توانی Select، Filter یا Sort کنی
Methodعملی است که Object می‌تواند ارائه دهد

اگر این را دیدی یعنی چه؟

  • جدول پیش‌فرض یک Property را نشان ندادبه این معنی نیست که Property وجود ندارد؛ با Get-Member یا Format-List * بررسی کن
  • می‌خواهی فقط Adapterهای Up را ببینیبه‌جای جستجوی متن از Property Status در Where-Object استفاده کن
قدم بعدی

از این بخش به بعد خروجی را به‌عنوان Object ببین، نه فقط چیزی که روی صفحه چاپ شده

سناریوی واقعی پشتیبانی

Get-NetAdapter فقط چند ستون نشان می‌دهد ولی برای گزارش Driver به Property بیشتری نیاز داری. Get-Member و Select-Object به تو نشان می‌دهند چه داده‌هایی قابل استفاده‌اند

۶
آموزش عمیق PowerShell

Select-Object؛ فقط ستون‌هایی را نگه دار که برای عیب‌یابی لازم داری

این دستور را چرا اجرا می‌کنیم؟

خروجی زیاد می‌تواند مهم‌ترین نکته را پنهان کند. Select-Object به تو اجازه می‌دهد Propertyهای لازم را انتخاب کنی و گزارش خواناتر بسازی

دستور

Get-NetAdapter | Select-Object Name,Status,LinkSpeed,MacAddress

نمونه خروجی و نحوه خواندن آن

Name       Status LinkSpeed MacAddress
----       ------ --------- ----------
Ethernet   Up     1 Gbps    4C-52-62-11-22-33
Wi-Fi      Up     866 Mbps  80-11-22-AA-BB-CC
بخش خروجیمعنی آن
Nameنام Interface در Windows است
StatusUp یا Down بودن Adapter را نشان می‌دهد
LinkSpeedسرعت Link گزارش‌شده توسط Adapter است، نه تضمین سرعت واقعی اینترنت
MacAddressMAC همان Adapter است

اگر این را دیدی یعنی چه؟

  • LinkSpeed پایین‌تر از انتظار بودکابل، Negotiation، Switch Port، Driver و تنظیمات Adapter را بررسی کن
  • Status Down بوداول اتصال فیزیکی، Disabled بودن Adapter و Driver را بررسی کن
قدم بعدی

بعد از انتخاب ستون‌ها می‌توانی خروجی را Export-Csv کنی تا برای Ticket یا مستندسازی نگه داری

سناریوی واقعی پشتیبانی

می‌خواهی مشخصات کارت شبکه ۳۰ سیستم را مقایسه کنی. گزارش چهار Property مشخص خیلی مفیدتر از خروجی کامل و شلوغ است

۷
آموزش عمیق PowerShell

Where-Object؛ خروجی را بر اساس شرط واقعی فیلتر کن

این دستور را چرا اجرا می‌کنیم؟

Where-Object روی Propertyهای Object شرط می‌گذارد. این یعنی به‌جای جستجوی متن می‌توانی دقیقاً بگویی فقط Serviceهای Stopped یا Adapterهای Up را نشان بده

دستور

Get-NetAdapter | Where-Object Status -eq 'Up'
Get-Service | Where-Object Status -eq 'Stopped'

نمونه خروجی و نحوه خواندن آن

Name       InterfaceDescription                    ifIndex Status
----       --------------------                    ------- ------
Ethernet   Intel(R) Ethernet Connection                  12 Up
Wi-Fi      Intel(R) Wi-Fi 6 AX201                        19 Up
بخش خروجیمعنی آن
-eqبرابر بودن را بررسی می‌کند
$_در ScriptBlock نماینده Object فعلی Pipeline است
StatusPropertyای است که شرط روی آن اجرا می‌شود

اگر این را دیدی یعنی چه؟

  • هیچ خروجی ندیدیممکن است هیچ Objectی با شرط تو منطبق نباشد یا نام Property/Value اشتباه باشد
  • شرط متنی پیچیده‌تر لازم شدمی‌توانی -like، -match، -ne، -gt و Operatorهای دیگر را بر اساس نوع Property استفاده کنی
قدم بعدی

فیلتر را تا جای ممکن نزدیک به منبع داده انجام بده و بعد فقط Propertyهای لازم را Select کن

سناریوی واقعی پشتیبانی

روی سیستم چند Adapter مجازی وجود دارد و فقط Adapterهای فعال را می‌خواهی. Where-Object خروجی را به همان موارد محدود می‌کند

۸
مفهوم پایه

Sort-Object و Measure-Object؛ داده را مرتب و خلاصه کن

Sort-Object برای مرتب‌سازی و Group/Measure برای خلاصه‌کردن داده مفیدند. وقتی صدها Object داری، این ابزارها کمک می‌کنند الگوی مهم را سریع‌تر ببینی

تمرین

Get-Process | Sort-Object WorkingSet -Descending | Select-Object -First 10
Get-Service | Group-Object Status
۹
مفهوم پایه

Format-Table و Format-List؛ فقط در انتهای Pipeline برای نمایش

Format-* برای نمایش است. اگر قرار است داده را بعداً Export یا Filter کنی، Format را زود در Pipeline نگذار چون Objectهای Formatting تولید می‌کند

تمرین

Get-NetAdapter | Format-Table Name,Status,LinkSpeed
Get-NetAdapter -Name Ethernet | Format-List *
۱۰
مفهوم پایه

Variableها؛ نتیجه را نگه دار و چند بار استفاده کن

Variable با $ شروع می‌شود و می‌تواند Object کامل را نگه دارد. این یعنی لازم نیست دستور پرهزینه را چند بار اجرا کنی و می‌توانی Propertyهای همان Object را جدا بخوانی

تمرین

$nic = Get-NetAdapter -Name 'Ethernet'
$nic.Status
$nic.MacAddress
۱۱
آموزش عمیق PowerShell

Get-NetAdapter؛ کارت شبکه را از دید Windows دقیق بخوان

این دستور را چرا اجرا می‌کنیم؟

قبل از بررسی IP و DNS، مطمئن شو Adapter درست فعال است، Link دارد و روی همان Interfaceی کار می‌کنی که به شبکه مورد نظر وصل است

دستور

Get-NetAdapter
Get-NetAdapter -Physical
Get-NetAdapter -Name 'Ethernet' | Format-List *

نمونه خروجی و نحوه خواندن آن

Name       InterfaceDescription                    ifIndex Status MacAddress         LinkSpeed
----       --------------------                    ------- ------ ----------         ---------
Ethernet   Intel(R) Ethernet Connection                  12 Up     4C-52-62-11-22-33 1 Gbps
Wi-Fi      Intel(R) Wi-Fi 6 AX201                        19 Up     80-11-22-AA-BB-CC 866 Mbps
بخش خروجیمعنی آن
ifIndexشناسه Interface است و در Cmdletهای دیگر شبکه هم استفاده می‌شود
Status: UpAdapter فعال است و از دید Windows Link دارد
LinkSpeedسرعت Link Negotiated شده است
InterfaceDescriptionمدل یا Description سخت‌افزاری Adapter است

اگر این را دیدی یعنی چه؟

  • Status DisabledAdapter غیرفعال است و باید علت غیرفعال بودن مشخص شود
  • Status Disconnectedبرای Ethernet کابل/Port و برای Wi-Fi اتصال شبکه را بررسی کن
  • چند Adapter مشابه دیدیifIndex و InterfaceDescription را برای تشخیص دقیق استفاده کن
قدم بعدی

اگر Adapter سالم و Up است، Get-NetIPConfiguration را اجرا کن تا IP، Gateway و DNS را در همان Interface ببینی

سناریوی واقعی پشتیبانی

کاربر می‌گوید LAN قطع است. Get-NetAdapter نشان می‌دهد Ethernet روی Disconnected است ولی Wi-Fi Up است. قبل از تغییر IP سراغ کابل و Port می‌روی

۱۲
آموزش عمیق PowerShell

Get-NetIPConfiguration؛ نسخه PowerShellیِ نگاه سریع به IP، Gateway و DNS

این دستور را چرا اجرا می‌کنیم؟

این Cmdlet اطلاعات مهم IP Configuration را به‌صورت Object می‌دهد و برای Support معمولاً یکی از سریع‌ترین راه‌ها برای دیدن Interface، IPv4، Gateway و DNS است

دستور

Get-NetIPConfiguration
Get-NetIPConfiguration -InterfaceAlias 'Ethernet'

نمونه خروجی و نحوه خواندن آن

InterfaceAlias       : Ethernet
InterfaceIndex       : 12
IPv4Address          : 192.168.10.25
IPv4DefaultGateway   : 192.168.10.1
DNSServer            : 192.168.10.10
NetProfile.Name      : corp.local
بخش خروجیمعنی آن
InterfaceAliasنام Adapter مورد بررسی است
IPv4AddressIP فعلی Interface است
IPv4DefaultGatewayGateway پیش‌فرض IPv4 همان Interface است
DNSServerDNS Serverهای مرتبط با Interface را نشان می‌دهد

اگر این را دیدی یعنی چه؟

  • IPv4DefaultGateway خالی بوداین Interface Default Gateway ندارد؛ بررسی کن طراحی شبکه همین را می‌خواهد یا نه
  • IPv4Address از محدوده مورد انتظار نبودDHCP، VLAN، Static IP یا Adapter اشتباه را بررسی کن
  • DNS Server با Domain Design نمی‌خواندName Resolution و تنظیم DNS Client را بررسی کن
قدم بعدی

اگر IP منطقی است، Test-NetConnection را برای Gateway، DNS Server یا سرویس مقصد اجرا کن

سناریوی واقعی پشتیبانی

Client عضو Domain است ولی Login و GPO کند شده. Get-NetIPConfiguration نشان می‌دهد DNS روی یک DNS عمومی تنظیم شده؛ این اختلاف با طراحی شبکه یک سرنخ جدی است

۱۳
آموزش عمیق PowerShell

Get-NetIPAddress؛ وقتی جزئیات آدرس و Prefix مهم است

این دستور را چرا اجرا می‌کنیم؟

Get-NetIPConfiguration برای نگاه سریع خوب است، اما Get-NetIPAddress اطلاعات دقیق‌تری درباره آدرس‌های IPv4/IPv6، PrefixLength و وضعیت Address می‌دهد

دستور

Get-NetIPAddress -AddressFamily IPv4
Get-NetIPAddress -InterfaceAlias 'Ethernet' -AddressFamily IPv4

نمونه خروجی و نحوه خواندن آن

IPAddress         : 192.168.10.25
InterfaceIndex    : 12
InterfaceAlias    : Ethernet
AddressFamily     : IPv4
Type              : Unicast
PrefixLength      : 24
PrefixOrigin      : Dhcp
AddressState      : Preferred
بخش خروجیمعنی آن
PrefixLength: 24معادل Subnet Mask رایج 255.255.255.0 است
PrefixOrigin: Dhcpآدرس از DHCP آمده است
AddressState: Preferredآدرس برای استفاده عادی در وضعیت مناسب است

اگر این را دیدی یعنی چه؟

  • PrefixOrigin: ManualIP به‌صورت دستی تنظیم شده یا از منبع Manual آمده است
  • AddressState DuplicateWindows تکراری بودن آدرس را تشخیص داده و باید IP Conflict را بررسی کنی
قدم بعدی

اگر Origin و Prefix با انتظار شبکه نمی‌خواند، قبل از تغییر IP Plan و DHCP Scope را بررسی کن

سناریوی واقعی پشتیبانی

قرار بوده Client DHCP باشد ولی PrefixOrigin=Manual است. حالا می‌فهمی چرا تغییر Scope DHCP روی این Client اثر نکرده است

۱۴
آموزش عمیق PowerShell

Get-NetRoute؛ Routing Table را به‌صورت Object تحلیل کن

این دستور را چرا اجرا می‌کنیم؟

در سیستم دارای VPN، چند NIC یا Route سفارشی، مسیر واقعی ممکن است با چیزی که فقط از Gateway می‌بینی فرق داشته باشد

دستور

Get-NetRoute -AddressFamily IPv4
Get-NetRoute -DestinationPrefix '0.0.0.0/0' | Sort-Object RouteMetric

نمونه خروجی و نحوه خواندن آن

ifIndex DestinationPrefix NextHop       RouteMetric ifMetric PolicyStore
------- ----------------- -------       ----------- -------- -----------
12      0.0.0.0/0         192.168.10.1 25          25       ActiveStore
42      0.0.0.0/0         10.8.0.1     1           5        ActiveStore
بخش خروجیمعنی آن
DestinationPrefix 0.0.0.0/0Default Route IPv4 است
NextHopGateway یا Hop بعدی برای آن Route است
RouteMetricبخشی از اولویت Route است
ifIndexInterface مورد استفاده Route را مشخص می‌کند

اگر این را دیدی یعنی چه؟

  • دو Default Route دیدیVPN یا چند Adapter را بررسی کن و ببین کدام Route عملاً ترجیح داده می‌شود
  • NextHop غیرمنتظره بودقبل از حذف Route بفهم کدام نرم‌افزار یا VPN آن را ساخته است
قدم بعدی

در سطح Support اول فقط Read و Compare کن. تغییر Route بدون شناخت Topology می‌تواند ارتباط Remote را قطع کند

سناریوی واقعی پشتیبانی

بعد از اتصال VPN، اینترنت کاربر از VPN عبور می‌کند. Get-NetRoute دو Default Route نشان می‌دهد و Metric مسیر VPN کمتر است

۱۵
آموزش عمیق PowerShell

Get-NetNeighbor؛ ARP/Neighbor Cache را با PowerShell بخوان

این دستور را چرا اجرا می‌کنیم؟

این Cmdlet Neighbor Cache را نشان می‌دهد و برای بررسی ارتباط Local، Gateway و بعضی سناریوهای IP Conflict یا MAC Mapping مفید است

دستور

Get-NetNeighbor -AddressFamily IPv4
Get-NetNeighbor -IPAddress 192.168.10.1

نمونه خروجی و نحوه خواندن آن

ifIndex IPAddress       LinkLayerAddress    State
------- ---------       ----------------    -----
12      192.168.10.1    00-11-22-33-44-55 Reachable
12      192.168.10.20   00-AA-BB-CC-DD-EE Stale
بخش خروجیمعنی آن
LinkLayerAddressMAC شناخته‌شده برای IP است
ReachableNeighbor اخیراً قابل دسترس تشخیص داده شده
StaleEntry وجود دارد ولی برای اطمینان از Reachability نیاز به Refresh دارد

اگر این را دیدی یعنی چه؟

  • MAC برای IP مهم با انتظار فرق داشتDHCP Lease، Asset List و Switch MAC Table را مقایسه کن
  • Entry وجود نداشتممکن است هنوز برای آن IP ارتباط Local انجام نشده باشد یا مقصد در Subnet محلی نباشد
قدم بعدی

Neighbor Cache را به‌تنهایی دلیل قطعی خرابی یا سلامت سرویس در نظر نگیر

سناریوی واقعی پشتیبانی

Gateway IP درست است اما رفتار ارتباط Local غیرعادی است. Get-NetNeighbor به تو MAC فعلی Gateway را می‌دهد تا با اطلاعات شبکه مقایسه کنی

۱۶
آموزش عمیق PowerShell

Get-DnsClientServerAddress؛ دقیقاً ببین هر Interface از چه DNSی استفاده می‌کند

این دستور را چرا اجرا می‌کنیم؟

در سیستم دارای Ethernet، Wi-Fi، VPN و Adapter مجازی، دیدن یک DNS کلی کافی نیست. این Cmdlet DNS Serverهای هر Interface را جدا نمایش می‌دهد

دستور

Get-DnsClientServerAddress -AddressFamily IPv4
Get-DnsClientServerAddress -InterfaceAlias 'Ethernet'

نمونه خروجی و نحوه خواندن آن

InterfaceAlias InterfaceIndex AddressFamily ServerAddresses
-------------- -------------- ------------- ---------------
Ethernet       12             IPv4          {192.168.10.10, 192.168.10.11}
Wi-Fi          19             IPv4          {192.168.1.1}
بخش خروجیمعنی آن
InterfaceAliasDNS مربوط به کدام Interface است
ServerAddressesDNS Serverهای تنظیم‌شده برای همان Interface هستند
AddressFamilyIPv4 یا IPv6 بودن لیست را مشخص می‌کند

اگر این را دیدی یعنی چه؟

  • Ethernet Domain DNS دارد ولی Wi-Fi DNS خانگی داردببین Traffic و Name Resolution واقعاً از کدام Interface استفاده می‌شود
  • لیست خالی بودممکن است DNS روی آن Interface تنظیم نشده باشد یا وضعیت Configuration را باید بیشتر بررسی کنی
قدم بعدی

بعد از مشخص شدن DNS، Resolve-DnsName را برای نام داخلی و خارجی اجرا کن

سناریوی واقعی پشتیبانی

نام داخلی فقط وقتی کابل LAN وصل است Resolve می‌شود. مقایسه DNS هر Interface دلیل تفاوت رفتار را روشن می‌کند

۱۷
آموزش عمیق PowerShell

Resolve-DnsName؛ نسخه قدرتمندتر PowerShell برای Query کردن DNS

این دستور را چرا اجرا می‌کنیم؟

Resolve-DnsName Query DNS را با خروجی Object انجام می‌دهد و برای دیدن Record Type و پاسخ دقیق مناسب است

دستور

Resolve-DnsName file01.company.local
Resolve-DnsName company.local -Type A
Resolve-DnsName company.local -Server 192.168.10.10

نمونه خروجی و نحوه خواندن آن

Name                           Type TTL Section IPAddress
----                           ---- --- ------- ---------
file01.company.local           A    120 Answer  192.168.10.20
بخش خروجیمعنی آن
Type Aپاسخ IPv4 است
TTLمدت Cache شدن Record را نشان می‌دهد
Section Answerاین Record در پاسخ Query برگشته است
IPAddressآدرس Resolve شده است

اگر این را دیدی یعنی چه؟

  • DNS name does not existنام یا Record وجود ندارد یا Zone مورد Query آن را ندارد
  • Query با -Server خاص جواب داد ولی بدون آن Fail شدDNS پیش‌فرض Client یا مسیر رسیدن به آن را بررسی کن
قدم بعدی

اگر DNS جواب صحیح می‌دهد ولی Application هنوز مشکل دارد، Cache، Proxy، Hosts File و خود Application را بررسی کن

سناریوی واقعی پشتیبانی

نام File Server با IP کار می‌کند اما با نام نه. Resolve-DnsName به DNS داخلی NXDOMAIN می‌دهد؛ حالا مسئله از SMB جدا شده است

۱۸
آموزش عمیق PowerShell

Test-NetConnection؛ Ping، Port و Route را در یک ابزار جمع کن

این دستور را چرا اجرا می‌کنیم؟

Test-NetConnection اطلاعات تشخیصی Connection می‌دهد و می‌تواند Ping، TCP Port و Route را بررسی کند. برای Support سرویس‌ها بسیار کاربردی است

دستور

Test-NetConnection 192.168.10.1
Test-NetConnection file01 -Port 445
Test-NetConnection web01 -Port 443 -InformationLevel Detailed

نمونه خروجی و نحوه خواندن آن

ComputerName     : file01
RemoteAddress    : 192.168.10.20
RemotePort       : 445
InterfaceAlias   : Ethernet
SourceAddress    : 192.168.10.25
TcpTestSucceeded : True
بخش خروجیمعنی آن
RemoteAddressIPای که نام مقصد به آن Resolve شده
RemotePortPort TCP تست‌شده
SourceAddressIP محلی‌ای که برای Connection انتخاب شده
TcpTestSucceeded: TrueTCP Handshake به Port مورد نظر موفق بوده است

اگر این را دیدی یعنی چه؟

  • PingSucceeded False ولی TcpTestSucceeded TrueICMP می‌تواند Block باشد ولی سرویس TCP قابل دسترس است
  • TcpTestSucceeded FalsePort از دید Client قابل اتصال نیست؛ Service، Firewall، ACL و Route را بررسی کن
  • RemoteAddress اشتباه بودDNS/Hosts/Name Resolution را بررسی کن
قدم بعدی

برای Troubleshooting سرویس همیشه Port واقعی سرویس را تست کن، نه اینکه فقط به Ping تکیه کنی

سناریوی واقعی پشتیبانی

کاربر می‌گوید Share Server باز نمی‌شود. Test-NetConnection file01 -Port 445 مقدار False می‌دهد، پس قبل از NTFS Permission باید Connectivity/SMB Port را بررسی کنی

۱۹
آموزش عمیق PowerShell

Get-NetTCPConnection؛ Connection و Listening Port را Object‌محور ببین

این دستور را چرا اجرا می‌کنیم؟

این Cmdlet مشابه هدف netstat برای TCP است ولی خروجی Object می‌دهد و Filter کردن State، Port و Process خیلی تمیزتر می‌شود

دستور

Get-NetTCPConnection
Get-NetTCPConnection -State Listen
Get-NetTCPConnection -LocalPort 443

نمونه خروجی و نحوه خواندن آن

LocalAddress LocalPort RemoteAddress RemotePort State       OwningProcess
------------ --------- ------------- ---------- -----       -------------
0.0.0.0      443       0.0.0.0       0          Listen      4120
192.168.10.25 53122    203.0.113.20  443        Established 8652
بخش خروجیمعنی آن
Listenیک Process منتظر TCP Connection است
EstablishedTCP Session برقرار است
OwningProcessPID Process مالک Connection است

اگر این را دیدی یعنی چه؟

  • Port مورد نظر Listen نیستApplication یا Service، Bind Address و Startup Error را بررسی کن
  • Listen هست ولی Remote Fail استWindows Firewall، Network Firewall، ACL و Route را بررسی کن
قدم بعدی

PID را به Get-Process بده تا Process مالک Port را پیدا کنی

سناریوی واقعی پشتیبانی

وب‌سرویس باید روی 443 باشد ولی Clientها وصل نمی‌شوند. Local Get-NetTCPConnection نشان می‌دهد هیچ Listen روی 443 نیست، پس اول خود Service را بررسی می‌کنی

۲۰
آموزش عمیق PowerShell

Get-NetAdapterStatistics؛ Error و Drop کارت شبکه را بررسی کن

این دستور را چرا اجرا می‌کنیم؟

برای قطع‌ووصلی یا Performance غیرعادی، Statistics کارت شبکه می‌تواند سرنخ‌هایی از Packetهای Received/Sent، Error یا Discard بدهد

دستور

Get-NetAdapterStatistics -Name 'Ethernet'

نمونه خروجی و نحوه خواندن آن

Name             : Ethernet
ReceivedBytes    : 984523102
ReceivedUnicastPackets : 735204
SentBytes        : 410225993
SentUnicastPackets : 522190
بخش خروجیمعنی آن
ReceivedBytes/SentBytesحجم داده عبوری از Adapter را نشان می‌دهند
Packet Counterهابرای مقایسه روند Traffic مفیدند
Error/Discard Propertyهااگر Adapter/Driver آن‌ها را گزارش کند می‌توانند سرنخ خطای Link باشند

اگر این را دیدی یعنی چه؟

  • Counter Error سریع افزایش پیدا می‌کندکابل، Port، Driver، Duplex/Negotiation و Hardware را بررسی کن
  • Traffic تقریباً صفر است ولی کاربر انتظار Traffic داردAdapter یا مسیر Application را بررسی کن
قدم بعدی

یک Snapshot Before بگیر، مشکل را بازتولید کن و دوباره Statistics را مقایسه کن

سناریوی واقعی پشتیبانی

کاربر می‌گوید اتصال LAN هر چند دقیقه Freeze می‌شود. اختلاف Statistics قبل و بعد از Freeze می‌تواند برای Escalation سرنخ تولید کند

۲۱
آموزش عمیق PowerShell

Set-DnsClientServerAddress؛ DNS را تغییر بده، اما بدان دقیقاً چه اثری دارد

این دستور را چرا اجرا می‌کنیم؟

این Cmdlet DNS Serverهای یک Interface را به‌صورت Static تنظیم می‌کند. وقتی استفاده شود DNSهای DHCP برای همان Interface Override می‌شوند تا زمانی که تنظیم را Reset کنی

دستور

Set-DnsClientServerAddress -InterfaceAlias 'Ethernet' -ServerAddresses ('192.168.10.10','192.168.10.11')

# بازگشت به DNS دریافتی از DHCP
Set-DnsClientServerAddress -InterfaceAlias 'Ethernet' -ResetServerAddresses

نمونه خروجی و نحوه خواندن آن

# در حالت موفق معمولاً خروجی نمایشی ندارد
# برای بررسی:
Get-DnsClientServerAddress -InterfaceAlias 'Ethernet'
بخش خروجیمعنی آن
بدون Outputبسیاری از Set-* Cmdletها در حالت موفق Object چاپ نمی‌کنند
-ServerAddressesلیست DNS Static جدید است
-ResetServerAddressesتنظیم DNS را به حالت پیش‌فرض Interface برمی‌گرداند

اگر این را دیدی یعنی چه؟

  • بعد از Set اینترنت با IP هست ولی Domain خراب شدممکن است DNS نامناسب برای شبکه Domain تنظیم کرده باشی؛ سریعاً Design را بررسی و Rollback کن
  • Remote Session داریقبل از تغییر شبکه مطمئن شو تغییر DNS باعث از دست رفتن مدیریت Remote نمی‌شود
قدم بعدی

همیشه بعد از Set، با Get-DnsClientServerAddress و Resolve-DnsName نتیجه را بررسی کن

سناریوی واقعی پشتیبانی

Client باید از DNS داخلی شرکت استفاده کند، اما روی آن 8.8.8.8 به‌صورت Static تنظیم شده است. بعد از ثبت DNSهای سازمان، Resolve-DnsName نام‌های داخلی دوباره تست می‌شود

۲۲
آموزش عمیق PowerShell

Restart-NetAdapter و Disable/Enable؛ ابزار ساده‌ای که می‌تواند Remote Session را قطع کند

این دستور را چرا اجرا می‌کنیم؟

Restart کردن Adapter می‌تواند برای بعضی مشکلات Driver یا Link مفید باشد، اما روی سیستم Remote همان Interface ارتباط تو را قطع می‌کند

دستور

Restart-NetAdapter -Name 'Ethernet' -Confirm

# فقط با برنامه
Disable-NetAdapter -Name 'Ethernet' -Confirm
Enable-NetAdapter -Name 'Ethernet' -Confirm

نمونه خروجی و نحوه خواندن آن

Confirm
Are you sure you want to perform this action?
Performing the operation "Disable-NetAdapter" on target "Ethernet".
[Y] Yes  [N] No  [S] Suspend  [?] Help
بخش خروجیمعنی آن
-Confirmقبل از تغییر تأیید می‌گیرد
Restart-NetAdapterAdapter را Restart می‌کند و Connection موقتاً قطع می‌شود
Disable-NetAdapterAdapter را غیرفعال می‌کند و ممکن است تمام ارتباط شبکه همان سیستم قطع شود

اگر این را دیدی یعنی چه؟

  • روی همان Adapter Remote هستیDisable/Restart ممکن است Session را قطع کند و نتوانی Remote آن را برگردانی
  • چند Adapter وجود داردنام Adapter و ifIndex را قبل از انجام کار دوباره بررسی کن
قدم بعدی

روی Remote System بدون Out-of-Band Access یا نفر Onsite با احتیاط بسیار زیاد عمل کن

سناریوی واقعی پشتیبانی

روی لپ‌تاپ کاربر حضوری هستی و Adapter پس از Sleep مشکل دارد. Restart-NetAdapter می‌تواند تست کنترل‌شده‌ای باشد، ولی همین کار روی Server Remote ریسک متفاوتی دارد

۲۳
آموزش عمیق PowerShell

Get-Service؛ وضعیت سرویس را Object‌محور بررسی کن

این دستور را چرا اجرا می‌کنیم؟

برای DNS Client، Windows Time، Print Spooler یا سرویس Application ابتدا وضعیت را بخوان. PowerShell Filter و Propertyهای خوبی برای Service دارد

دستور

Get-Service -Name W32Time
Get-Service | Where-Object Status -eq 'Stopped' | Select-Object Name,DisplayName

نمونه خروجی و نحوه خواندن آن

Status   Name               DisplayName
------   ----               -----------
Running  W32Time            Windows Time
بخش خروجیمعنی آن
Status RunningService در حال اجراست
Status StoppedService اکنون اجرا نیست
NameService Name فنی است
DisplayNameنام نمایشی Service در GUI است

اگر این را دیدی یعنی چه؟

  • Service Running است ولی Function خراب استRunning بودن فقط State سرویس را ثابت می‌کند، نه سلامت کامل عملکرد آن
  • Service مرتب Stop می‌شودEvent Log و Log Application را بررسی کن، نه اینکه فقط Start را تکرار کنی
قدم بعدی

برای تغییر Service اول Dependency و اثر عملیاتی را بررسی کن

سناریوی واقعی پشتیبانی

Time Sync مشکل دارد ولی W32Time Running است. پس مشکل فقط Stop بودن سرویس نیست و باید Source/Sync Status را هم بررسی کنی

۲۴
آموزش عمیق PowerShell

Get-Process؛ PID، CPU و Memory Process را بررسی کن

این دستور را چرا اجرا می‌کنیم؟

وقتی PID را از Get-NetTCPConnection داری یا Application کند است، Get-Process Process واقعی و مصرف منابع آن را نشان می‌دهد

دستور

Get-Process -Id 4120
Get-Process | Sort-Object CPU -Descending | Select-Object -First 10 Name,Id,CPU,WorkingSet

نمونه خروجی و نحوه خواندن آن

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  ProcessName
-------  ------    -----      -----     ------     --  -----------
   1102      85   410220     520331      915.20   4120  appservice
بخش خروجیمعنی آن
IdPID Process است
CPUCPU Time مصرف‌شده Process است، نه لزوماً درصد لحظه‌ای CPU
WorkingSetحافظه Working Set Process است

اگر این را دیدی یعنی چه؟

  • PID پیدا نشدProcess ممکن است بسته شده باشد یا PID تغییر کرده باشد
  • Process منابع بالا داردقبل از Kill، رفتار Application و User Impact را بررسی کن
قدم بعدی

برای Problem Process ابتدا Log و Service/Application Context را پیدا کن و بعد درباره Restart تصمیم بگیر

سناریوی واقعی پشتیبانی

Port 443 توسط PID 4120 Listen است. Get-Process -Id 4120 نشان می‌دهد Process مربوط به appservice است و عیب‌یابی روی همان Application متمرکز می‌شود

۲۵
آموزش عمیق PowerShell

Get-WinEvent؛ از Event Log به‌جای حدس استفاده کن

این دستور را چرا اجرا می‌کنیم؟

خیلی از مشکلات Service، Driver، Logon و Windows در Event Log سرنخ دارند. Get-WinEvent امکان Filter دقیق و Export نتیجه را می‌دهد

دستور

Get-WinEvent -LogName System -MaxEvents 20
Get-WinEvent -FilterHashtable @{LogName='System'; Level=2} -MaxEvents 20

نمونه خروجی و نحوه خواندن آن

ProviderName: Service Control Manager

TimeCreated                      Id LevelDisplayName Message
-----------                      -- ---------------- -------
8/17/2026 20:15:42            7031 Error            The ... service terminated unexpectedly
بخش خروجیمعنی آن
TimeCreatedزمان Event است و باید با زمان گزارش کاربر مقایسه شود
IdEvent ID است که همراه Provider معنی پیدا می‌کند
ProviderNameکامپوننتی است که Event را ثبت کرده
LevelDisplayNameError/Warning/Information بودن Event است

اگر این را دیدی یعنی چه؟

  • صدها Error قدیمی دیدیفقط Error بودن کافی نیست؛ بازه زمانی و ارتباط با Incident را در نظر بگیر
  • Event دقیقاً هم‌زمان با مشکل تکرار می‌شودProvider، Event ID و Message را برای Root Cause بیشتر بررسی کن
قدم بعدی

زمان Incident را از کاربر بگیر و Filter زمانی بساز تا Noise کم شود

سناریوی واقعی پشتیبانی

Application هر روز ساعت مشخصی قطع می‌شود. Get-WinEvent نشان می‌دهد Service همان دقیقه Terminate شده و Event ID مرتبط ثبت شده است

۲۶
آموزش عمیق PowerShell

Get-CimInstance؛ اطلاعات سیستم را Structured بگیر

این دستور را چرا اجرا می‌کنیم؟

CIM برای گرفتن اطلاعات OS، Computer، BIOS و بسیاری از کلاس‌های مدیریتی Windows مناسب است و خروجی قابل Filter/Export دارد

دستور

Get-CimInstance Win32_OperatingSystem | Select-Object Caption,Version,LastBootUpTime
Get-CimInstance Win32_ComputerSystem | Select-Object Manufacturer,Model,TotalPhysicalMemory

نمونه خروجی و نحوه خواندن آن

Caption                  Version        LastBootUpTime
-------                  -------        --------------
Microsoft Windows 11 Pro 10.0.26100     8/16/2026 8:12:41 AM
بخش خروجیمعنی آن
CaptionEdition/نام سیستم‌عامل
VersionVersion/Build خانواده OS
LastBootUpTimeزمان Boot سیستم

اگر این را دیدی یعنی چه؟

  • User می‌گوید Restart کرده ولی Boot Time قدیمی استنوع Shutdown/Fast Startup یا ادعای Restart را دوباره بررسی کن
  • مدل/سخت‌افزار با Asset List فرق داردAsset Documentation را اصلاح یا سیستم صحیح را بررسی کن
قدم بعدی

خروجی CIM را برای Inventory در CSV ذخیره کن

سناریوی واقعی پشتیبانی

قبل از Remote Troubleshooting می‌خواهی نسخه Windows، مدل دستگاه و آخرین Boot را بدون چند پنجره GUI جمع‌آوری کنی

۲۷
آموزش عمیق PowerShell

Get-LocalUser و Get-LocalGroupMember؛ حساب Local را از Domain Account جدا کن

این دستور را چرا اجرا می‌کنیم؟

برای بررسی Local Administratorها و Local Accountها این Cmdletها خروجی واضح‌تری از روش‌های متنی می‌دهند

دستور

Get-LocalUser
Get-LocalGroupMember -Group 'Administrators'

نمونه خروجی و نحوه خواندن آن

ObjectClass Name                    PrincipalSource
----------- ----                    ---------------
User        PC01\LocalAdmin         Local
User        COMPANY\ITSupport       ActiveDirectory
بخش خروجیمعنی آن
PrincipalSource Localحساب از خود سیستم Local آمده
PrincipalSource ActiveDirectoryPrincipal از Domain آمده
Administratorsعضویت این Group دسترسی Local Admin می‌دهد

اگر این را دیدی یعنی چه؟

  • User ناشناخته در Administrators بودقبل از حذف، مالکیت/کاربرد حساب و سیاست سازمان را بررسی کن
  • Domain Group مورد انتظار نبودGPO، Local Group Policy یا Deployment روش دسترسی را بررسی کن
قدم بعدی

هر تغییر Membership را مستند کن و کمترین سطح دسترسی لازم را رعایت کن

سناریوی واقعی پشتیبانی

کاربر می‌گوید قبلاً Local Admin بوده. Get-LocalGroupMember نشان می‌دهد Group مربوطه دیگر عضو Administrators نیست و حالا باید علت تغییر را بررسی کنی

۲۸
آموزش عمیق PowerShell

New-PSDrive؛ Shared Folder را Map کن و خطا را درست تفسیر کن

این دستور را چرا اجرا می‌کنیم؟

PowerShell می‌تواند Network Drive بسازد و برای Automation/Support خروجی قابل کنترل‌تری بدهد

دستور

New-PSDrive -Name Z -PSProvider FileSystem -Root '\\FILE01\Public' -Persist
Get-PSDrive -Name Z

نمونه خروجی و نحوه خواندن آن

Name           Used (GB)     Free (GB) Provider      Root
----           ---------     --------- --------      ----
Z                                      FileSystem    \\FILE01\Public
بخش خروجیمعنی آن
-PersistMapping را در Windows ماندگار می‌کند
PSProvider FileSystemDrive از نوع File System است
Rootمسیر UNC مقصد است

اگر این را دیدی یعنی چه؟

  • Path not foundDNS، نام Share، SMB و Connectivity را بررسی کن
  • Access deniedAuthentication و Share/NTFS Permission را بررسی کن
قدم بعدی

قبل از Mapping جدید، مسیر UNC و Mappingهای قبلی را بررسی کن

سناریوی واقعی پشتیبانی

Z: به Server قدیمی اشاره می‌کند. ابتدا Mapping موجود را شناسایی و سپس طبق Change مورد نظر مسیر صحیح را Map می‌کنی

۲۹
آموزش عمیق PowerShell

Execution Policy؛ خطای «running scripts is disabled» را درست بفهم

این دستور را چرا اجرا می‌کنیم؟

Execution Policy شرایط اجرای Script را کنترل می‌کند و یک Safety Feature است، نه مرز امنیتی کامل. دستورهای Interactive حتی در Restricted قابل اجرا هستند ولی Script ممکن است Block شود

دستور

Get-ExecutionPolicy
Get-ExecutionPolicy -List

نمونه خروجی و نحوه خواندن آن

        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       Undefined
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser       Undefined
 LocalMachine       Restricted
بخش خروجیمعنی آن
Restrictedاجرای Scriptهای PowerShell در آن Scope محدود است
Undefinedدر آن Scope Policy صریح تعریف نشده
MachinePolicy/UserPolicyمی‌توانند توسط Group Policy مدیریت شوند

اگر این را دیدی یعنی چه؟

  • running scripts is disabled on this systemاول Scope و Policy را بخوان؛ کورکورانه Policy را Bypass نکن
  • Policy توسط GPO آمدهتنظیم Local ممکن است مؤثر نباشد و باید Policy سازمان را رعایت کنی
قدم بعدی

قبل از تغییر Execution Policy دلیل، Scope و سیاست امنیتی سازمان را مشخص کن

سناریوی واقعی پشتیبانی

یک Script داخلی اجرا نمی‌شود اما Cmdletهای دستی کار می‌کنند. Error دقیق می‌گوید Script Execution Block است و Get-ExecutionPolicy -List منبع Policy را روشن می‌کند

۳۰
آموزش عمیق PowerShell

Export-Csv و Out-File؛ نتیجه عیب‌یابی را قابل استفاده تحویل بده

این دستور را چرا اجرا می‌کنیم؟

پشتیبانی حرفه‌ای یعنی خروجی Before/After و اطلاعات لازم برای Escalation را ثبت کنی. PowerShell برای Export Structured Data عالی است

دستور

Get-NetAdapter | Select-Object Name,Status,LinkSpeed,MacAddress | Export-Csv .\net-adapters.csv -NoTypeInformation
Get-NetIPConfiguration | Out-File .\ipconfig.txt

نمونه خروجی و نحوه خواندن آن

# net-adapters.csv
"Name","Status","LinkSpeed","MacAddress"
"Ethernet","Up","1 Gbps","4C-52-62-11-22-33"
"Wi-Fi","Up","866 Mbps","80-11-22-AA-BB-CC" 
بخش خروجیمعنی آن
Export-CsvPropertyهای Object را به CSV قابل پردازش تبدیل می‌کند
-NoTypeInformationHeader نوع قدیمی PowerShell را از CSV حذف می‌کند
Out-Fileنمای متنی Output را داخل فایل می‌نویسد

اگر این را دیدی یعنی چه؟

  • CSV ستون‌های عجیب داشتقبل از Export با Select-Object Propertyهای لازم را مشخص کن
  • اطلاعات حساس داخل خروجی استقبل از ارسال Ticket یا فایل برای شخص دیگر Data را بررسی کن
قدم بعدی

برای Inventory از CSV و برای Log متنی از Out-File/Transcript استفاده کن

سناریوی واقعی پشتیبانی

باید وضعیت Adapterهای چند سیستم را برای همکار سطح ۲ ارسال کنی. CSV استاندارد سریع‌تر قابل مقایسه است

۳۱
آموزش عمیق PowerShell

Start-Transcript؛ Session عیب‌یابی را ثبت کن

این دستور را چرا اجرا می‌کنیم؟

Transcript دستورها و بسیاری از Outputهای Session را داخل فایل ثبت می‌کند و برای مستندسازی Incident مفید است

دستور

Start-Transcript -Path "$env:USERPROFILE\Desktop\support-session.txt"
# دستورات عیب‌یابی
Stop-Transcript

نمونه خروجی و نحوه خواندن آن

Transcript started, output file is C:\Users\User\Desktop\support-session.txt
...
Transcript stopped, output file is C:\Users\User\Desktop\support-session.txt
بخش خروجیمعنی آن
Transcript startedثبت Session شروع شده است
Transcript stoppedفایل ثبت Session بسته شده است
$env:USERPROFILEمسیر Profile کاربر فعلی است

اگر این را دیدی یعنی چه؟

  • قرار است Credential یا اطلاعات حساس وارد شودTranscript را با آگاهی از Data Handling سازمان استفاده کن
  • فایل برای Ticket ارسال می‌شودقبل از ارسال محتوای حساس را بررسی کن
قدم بعدی

Transcript را ابزار Documentation بدان، نه اینکه بی‌دلیل تمام Sessionهای مدیریتی را ذخیره کنی

سناریوی واقعی پشتیبانی

یک خطای پیچیده باید به Level 2 Escalate شود. Transcript باعث می‌شود ترتیب Commandها و Errorها دقیق قابل بازبینی باشد

۳۲
آموزش عمیق PowerShell

Test-ComputerSecureChannel؛ Trust بین Client و Domain را بررسی کن

این دستور را چرا اجرا می‌کنیم؟

این Cmdlet Secure Channel بین Computer و Domain را تست می‌کند. برای خطاهای Trust Relationship یک تست مستقیم و مفید است

دستور

Test-ComputerSecureChannel
Test-ComputerSecureChannel -Verbose

نمونه خروجی و نحوه خواندن آن

True
بخش خروجیمعنی آن
TrueSecure Channel در تست فعلی سالم گزارش شده است
FalseTrust/Secure Channel مشکل دارد یا تست نتوانسته آن را سالم تأیید کند
-Verboseجزئیات بیشتری از عملیات نمایش می‌دهد

اگر این را دیدی یعنی چه؟

  • False بودDNS، دسترسی به Domain Controller، Computer Account و وضعیت Domain را قبل از Repair بررسی کن
  • سیستم Workgroup استاین Cmdlet برای همان سناریوی Domain Member معنی دارد
قدم بعدی

Repair را خودکار و بدون تشخیص اجرا نکن. اول علت DNS/Connectivity/Account را مشخص کن

سناریوی واقعی پشتیبانی

Windows پیام Trust Relationship می‌دهد. DNS Client صحیح است، DC قابل دسترس است و Test-ComputerSecureChannel=False گزارش می‌کند؛ حالا Secure Channel یک محور واقعی عیب‌یابی است

۳۳
آموزش عمیق PowerShell

Error Record؛ خط قرمز PowerShell را کامل بخوان

این دستور را چرا اجرا می‌کنیم؟

PowerShell Error فقط یک جمله نیست. CategoryInfo و FullyQualifiedErrorId می‌توانند نوع و منبع خطا را مشخص‌تر کنند

دستور

Get-Service -Name NotAService
$Error[0] | Format-List *

نمونه خروجی و نحوه خواندن آن

Get-Service : Cannot find any service with service name 'NotAService'.
CategoryInfo          : ObjectNotFound: (NotAService:String) [Get-Service], ServiceCommandException
FullyQualifiedErrorId : NoServiceFoundForGivenName,Microsoft.PowerShell.Commands.GetServiceCommand
بخش خروجیمعنی آن
ObjectNotFoundنوع کلی خطا نشان می‌دهد Object مورد نظر پیدا نشده
FullyQualifiedErrorIdشناسه دقیق‌تر خطا برای مستندات و جستجوی فنی است
$Error[0]آخرین Error ثبت‌شده Session را می‌دهد

اگر این را دیدی یعنی چه؟

  • AccessDenied دیدیقبل از Run as administrator بفهم عملیات چرا Privilege می‌خواهد
  • CommandNotFound دیدیSpelling، Module و Version را بررسی کن
  • ParameterBindingException دیدیSyntax، نوع Value و نام Parameter را بررسی کن
قدم بعدی

متن Error را پاک نکن و دوباره کورکورانه فرمان نزن. Error خودش بخشی از داده عیب‌یابی است

سناریوی واقعی پشتیبانی

Cmdlet روی یک Server CommandNotFound می‌دهد. به‌جای تغییر Permission، اول می‌فهمی Module یا Version لازم روی Server موجود نیست

سناریو ۱

فقط یک Client اینترنت ندارد

  1. Get-NetAdapter → آیا Adapter درست Up است؟
  2. Get-NetIPConfiguration → IP، Gateway و DNS منطقی است؟
  3. Test-NetConnection gateway → مسیر Local
  4. Test-NetConnection 8.8.8.8 → مسیر IP بیرونی
  5. Resolve-DnsName example.com → DNS
  6. هرجا Chain می‌شکند همان محدوده را عمیق‌تر بررسی کن
سناریو ۲

Application روی Port مشخص جواب نمی‌دهد

  1. Test-NetConnection server -Port 443 از Client
  2. روی Server: Get-NetTCPConnection -LocalPort 443
  3. PID را از OwningProcess بردار
  4. Get-Process -Id PID
  5. اگر Listen نیست Service/Application را بررسی کن
  6. اگر Listen هست ولی Remote Fail است Firewall/ACL/Route را بررسی کن
سناریو ۳

Client عضو Domain است ولی Trust یا GPO مشکل دارد

  1. Get-NetIPConfiguration و DNS داخلی
  2. Resolve-DnsName برای DC/Domain
  3. Test-NetConnection برای Connectivity لازم
  4. Test-ComputerSecureChannel
  5. Event Log مرتبط با زمان Incident را با Get-WinEvent بررسی کن
سناریو ۴

Shared Folder باز نمی‌شود

  1. Resolve-DnsName FILE01
  2. Test-NetConnection FILE01 -Port 445
  3. اگر Port 445 سالم است مسیر UNC را بررسی کن
  4. Mapping را با Get-PSDrive یا ابزار Mapping بررسی کن
  5. Access Denied را از Path/Network Error جدا کن
سناریو ۵

شبکه قطع و وصل می‌شود

  1. Get-NetAdapterStatistics Before
  2. مشکل را بازتولید کن
  3. Statistics را دوباره بگیر
  4. Test-NetConnection -InformationLevel Detailed برای مسیر
  5. زمان Incident را با System Eventها مقایسه کن
سناریو ۶

Escalation حرفه‌ای با داده قابل استفاده

  1. Adapter، IP و DNS را Select کن
  2. Eventهای مرتبط همان بازه را جمع کن
  3. خروجی‌ها را Export-Csv/Out-File کن
  4. در صورت نیاز Transcript Session را نگه دار
  5. در Ticket بنویس چه چیزی تست شد، نتیجه چه بود و کجا Failure دیده شد
مرجع سریع

برای هر سؤال کدام Cmdlet را اول بزنم؟

سؤالCmdletدنبال چه چیزی هستی؟
کارت شبکه سالم است؟Get-NetAdapterStatus، LinkSpeed، ifIndex
IP/Gateway/DNS چیست؟Get-NetIPConfigurationConfiguration همان Interface
IP از DHCP است یا Manual؟Get-NetIPAddressPrefixOrigin و PrefixLength
Default Route چیست؟Get-NetRouteNextHop و Metric
DNS چه جوابی می‌دهد؟Resolve-DnsNameRecord، IP، Error
Port TCP باز است؟Test-NetConnection -PortTcpTestSucceeded
چه Processی Port را گرفته؟Get-NetTCPConnectionOwningProcess
Service Running است؟Get-ServiceStatus
Event مرتبط چیست؟Get-WinEventTime، ID، Provider، Message
Trust Domain سالم است؟Test-ComputerSecureChannelTrue/False
پایان پک

بعد از این پک باید این مهارت‌ها را داشته باشی

  • فرق Windows PowerShell 5.1 و PowerShell 7 را در حد Support می‌فهمی
  • Get-Help و Get-Command را به‌جای حفظ کردن همه Cmdletها استفاده می‌کنی
  • Object، Property و Pipeline را می‌فهمی
  • خروجی را با Select، Where و Sort کنترل می‌کنی
  • Adapter، IP، Gateway، DNS و Route را با Cmdletهای شبکه تحلیل می‌کنی
  • Test-NetConnection را برای Port واقعی سرویس استفاده می‌کنی
  • PID را از Connection به Process وصل می‌کنی
  • Service و Event Log را با داده Structured بررسی می‌کنی
  • Secure Channel Domain را تست می‌کنی
  • قبل از Set-* یا Disable-* اثر تغییر و Rollback را در نظر می‌گیری
  • Output را برای Ticket و Escalation به CSV/Text تبدیل می‌کنی
  • Error Record را می‌خوانی و از روی Error قدم بعدی انتخاب می‌کنی