آموزش کار با دستور Resolve-DnsName در پاورشل

دستور cmdlet Resolve-DnsName یک کوئری DNS را اجرا می‌کند که برای تبدیل آدرس‌های IP به DNS و برعکس به‌کار می‌رود. علاوه‌براین، Resolve-DnsName برای جست‌وجوی رکوردهای DNS و بررسی وضعیت رزولوشن DNS هم به‌کار می‌رود. این cmdlet از نظر عملکردی شبیه به ابزار nslookup در CMD ویندوز است که به کاربران امکان می‌دهد DNSها را جست‌وجو کنند. ما در این مقاله، بدون هیچ اضافه‌گویی، به‌سراغ آموزش کار با دستور Resolve-DnsName در پاورشل می‌رویم و تمام پرامپت‌های آن را معرفی می‌کنیم.
فهرست مطالب

عضویت در خبرنامه

با عضویت در خبرنامه‌ ایران‌سرور، اخبار و مقالات را به‌روز و دست اول دریافت کنید.

سینتکس دستور Resolve-DnsName در پاورشل

سینتکس Resolve-DnsName در پاورشل، با Resolve-DnsName شروع می‌شود و یک یا چند مورد از این پارامترها را به خود می‌گیرد:

 [-Name] <String>
[[-Type] <RecordType>]
[-Server <String[]>]
[-DnsOnly]
[-CacheOnly]
[-AllRecords]
[-TcpOnly]

پارامترهای دستور Resolve-DnsName

چند پارامتر در سینتکس Resolve-DnsName مهم‌تر از بقیه هستند که لیست آن‌ها را در زیر می‌بینید:

  • Name: دامنه یا آدرس IP مقصد را برای Resolve مشخص می‌کند.
  • Type: این پارامتر، نوع درخواست DNS را که قرار است صادر شود، مشخص می‌کند.این پارامتر چند اختیار دارد که مهم‌ترین آن‌ها را در بخش بعدی به‌همراه مثال توضیح خواهیم داد.
  • Server: این پارامتر برای مشخص کردن سرور هنگام کوئری نوشتن استفاده می‌شود.
  • DnsOnly: این پارامتر جست‌وجو بین DNSها را فقط به همین سرورها محدود می‌کند و از پرونده هاست استفاده نمی‌کند. 
  • AllRecords: این پارامتر چند DNS را جست‌وجو می‌کند.

بررسی رکوردهای DNS به کمک پاورشل زمانی کاربردی‌تر است که سرور شما به‌درستی پیکربندی شده باشد. اگر هنوز فضای مناسبی برای راه‌اندازی سایت ندارید، با خرید هاست این فضا را تهیه کنید

نحوه استفاده از دستور Resolve-DnsName در پاورشل

برای صرفه‌جویی در زمان نوشتن کوئری‌های Resolve-DnsName، چند حرف اول یک cmdlet را تایپ کنید و Tab را از کیبورد فشار دهید تا بقیه دستور به‌صورت خودکار تکمیل شود. 

مثلا اگر «reso» را تایپ کنید و سپس tab (reso + tab) را بزنید، PowerShell Resolve-DnsName را پر می‌کند. این کار برای cmdletهای دیگر مانند Test-Connection هم به همین شکل انجام می‌شود و کاملا یکسان است. 

پیدا کردن یک DNS خاص

دستور زیر، یک DNS خاص را بر اساس نام دامنه پیدا می‌کند:

Resolve-DnsName -Name iranserver.com

اگر آدرس IP یک DNS را دارید و می‌خواهید نام آن را بیابید، باید دستور زیر را بنویسید:

Resolve-DnsName -Name www.bing.com -Server 10.0.0.1

جست‌وجوی رکورد DNS

برای مشخص کردن رکورد هدف، باید “-type” را برای تکمیل cmdlet اضافه کنید.

دستور موردنظر مشابه جدول زیر می‌شود:

Resolve-DnsName iranservermail.com -Type MX

جلوی -type، می‌توانید هر رکورد دیگری بنویسید و جایگزین MX کنید.

این دستور حاوی رکوردهای MX (Mail Exchange) است که نقش مهمی در تحویل ایمیل ایفا می‌کنند. همین دستوری که نوشتیم، سرور ایمیلی را که مسئول دریافت ایمیل از طرف یک دامنه است، مشخص می‌کند. 

بعد از تشخیص مشکل از طریق Resolve-DnsName، گام بعدی معمولاً تغییر یا اصلاح رکوردهاست. برای دامنه‌های ملی، مقاله تنظیم DNS بر روی دامنه‌های IR مراحل این کار را در سایت ایرنیک به‌طور کامل آموزش داده است.

جستجوی رکورد DNS

رکوردهای پشتیبانی‌شده عبارتند از A، AAAA، MX، TXT، NS، SOA و SRV. هرکدام از این تایپ‌ها، وظایف زیر را انجام می‌دهند:

  • A: نوع کوئری DNS آدرس یک سرور با IPv4 است.
  • AAAA: همان نوع A، با این تفاوت که آدرس سرور مقصد با IPv6 است.
  • MX: نوع کوئری DNS حاوی اطلاعات مسیریابی برای ایمیل‌ها است.
  • TXT: نوع کوئری یک رشته متنی (String) است.
  • NS: نوع کوئری DNS یک Name Server است.
  • SRV: نوع کوئری با انتخاب یک سرور خاص تطبیق داده می‌شود.
  • SOA: نوع کوئری DNS نام یک دامنه Mailbox در سرویس ایمیل است.

نمونه دیگر این دستور با سرویس ایمیل Gmail به‌شکل زیر است:

Resolve-DnsName -Name gmail.com -Type MX

خروجی نشان داده‌شده در تصویر زیر، لیست رکوردهای MX را برای DNS جیمیل به نشانی Gmail.com نشان می‌دهد.

لیست رکوردهای MX را برای DNS

محدود کردن جست‌وجوی DNS به یک سرور

اگر می‌خواهید کوئری Resolve-DnsName را به یک سرور DNS خاص محدود و هدایت کنید، باید دستور را با استفاده از پارامتر Server بنویسید که به‌شکل زیر درمی‌آید:

Resolve-DnsName dc.contoso.com -Server 192.168.0.1

اگر می‌خواهید از نام DNS به‌جای IP آن استفاده کنید، یک فاصله بعد از -server بگذارید و نام آن را به‌طور کامل بنویسید و دستور را اجرا کنید.

استفاده از DNS دیگر به‌جای DNS سیستم خودمان

Resolve-DnsName به‌طور پیش‌فرض، از آدرس‌های سرور DNS که روی سیستم‌مان پیکربندی شده است استفاده می‌کند؛ اما می‌توانیم حین کار با دستور Resolve-DnsName در پاورشل، این دستور را مجبور کنیم که هنگام انجام جست‌جوها، از یک DNS دیگر استفاده کند.

به‌عنوان مثال، اگر می‌خواهید از Google Public DNS برای جست‌وجوی رکوردها استفاده کنید، می‌توانید این کار را با اضافه کردن پارامتر -Server در دستور خود مشابه مثال زیر انجام دهید.

$dnsServer = @('8.8.8.8','8.8.4.4')

Resolve-DnsName adamtheautomator.com -Server $dnsServer

نتیجه دستور بالا، مشابه تصویر زیر خواهد بود.

جستجوی DNS عمومی گوگل برای رکوردها

استفاده از DNS دیگر برای جست‌وجوی رکوردها، به دلایل زیر انجام می‌شود. اگر در هر کدام از سناریوهای زیر قرار گرفتید، از دستور بالا استفاده کنید:

  • سرعت بیشتر: برخی از سرورهای DNS ممکن است سریع‌تر از بقیه کار کنند.
  • امنیت بالاتر: بعضی از سرورهای DNS از ابزارها و نرم‌افزارهای امنیتی بیشتری نسبت‌به DNS سیستم خودمان استفاده می‌کنند و امکان هک و حملات شبکه را به صفر می‌رسانند.
  • در دسترس بودن سوابق کوئری‌ها: در بسیاری از سناریوهای واقعی، سازمان‌ها سرورهای DNS داخلی خود را مستقر کرده‌اند که شامل سوابق مناطق و نام‌هایی است که فقط به صورت داخلی استفاده می‌شوند. در این صورت، جست‌وجوی رکورد با DNS داخلی، راه‌حل منطقی برای تبادل اطلاعات با DNSهای عمومی نخواهد بود. در این حالت با پیغام خطا، مشابه تصویر زیر مواجه خواهیم شد:

خطا در تبادل اطلاعات با DNS عمومی

دستور Resolve-DnsName می‌تواند اطلاعات دقیق درباره وضعیت DNS دامنه‌ها بدهد، اما اگر اتصال شما به اینترنت با اختلال مواجه شده و این پیغام را مشاهده می‌کنید، مقاله رفع خطای dns probe finished bad config روش‌های عملی برای حل مشکل را پیشنهاد می‌دهد.

جست‌وجوی چند DNS

دستور Resolve-DnsName به‌طور پیش‌فرض، فقط یک DNS را جست‌وجو می‌کند؛ اما با پارامتر AllRecords می‌توانید چند DNS را هدف بگیرید. دستور آن هم در زیر آمده است:

Resolve-DnsName -Name example.com -Type A -AllRecords

گزارش‌ گرفتن از رکوردهای DNS

اکنون که با یکدیگر، آموزش کار با دستور Resolve-DnsName در پاورشل را یاد گرفتیم و برخی از مهم‌ترین دستورات آن را نوشتیم، باید یک اسکریپت پاورشل بسازیم که وظایف نظارت و گزارش سوابق DNS را انجام دهد. این اسکریپت هم مثل دستورات قبلی، پارامترهای متفاوتی می‌گیرد. 

برای گزارش گرفتن از رکوردهای DNS در پاورشل، ویرایش‌گر اسکریپت موردنظرتان را باز کنید و یک فایل جدید به‌نام GetDnsRecord.ps1 ایجاد کنید. این نام هر چیز دیگری می‌تواند باشد؛ اما پسوندش حتما باید ‘ps1’ باشد.

یکی از کاربردهای Resolve-DnsName، بررسی صحت تنظیمات DNS است. اگر به‌دنبال اعمال تغییرات در رکوردهای دامنه هستید، پیشنهاد می‌کنیم مقاله مدیریت DNS در دایرکت ادمین را مطالعه کنید.

 

تعریف متغیرها

ابتدا باید متغیرهای مورد استفاده را تعیین کنید. این متغیرها شامل موارد زیر خواهند بود:

  • $NameList: این متغیر نام رکوردهای DNS را نگه می‌دارد. همان رکوردهایی که می‌خواهید اسکریپت شما کوئری کند.
  • $Serverlist: از این متغیر برای نشان دادن سرورهای DNS استفاده کنید که توسط اسکریپت برای جست‌وجو استفاده می‌شوند.

برای تعیین این متغیرها، کد زیر را کپی کرده و در ابتدای اسکریپت خود قرار دهید.

$NameList = @('iranserver.com','powershell.org','xyz.local')

$ServerList = @('8.8.8.8','8.8.4.4')

در مرحله بعد، این کد باید بتواند رکورد DNS هر یک از DNSهای مشخص‌شده را جست‌وجو کند. پس باید از حلقه foreach برای تکرار لیست رکوردها استفاده کنید. برای جست‌وجوی هر نام هم از Resolve-DnsName استفاده کنید.

کد زیر شامل همین اسکریپت به‌شکل کامل است. آن را کپی کنید و در پنجره پاورشل خودتان Paste کنید.

$FinalResult = @()

foreach ($Name in $NameList) {

    $tempObj = "" | Select-Object Name, IPAddress, Status, ErrorMessage

    try {

        $dnsRecord = Resolve-DnsName $Name -Server $ServerList -ErrorAction Stop | Where-Object { $_.Type -eq 'A' }

        $tempObj.Name = $Name

        $tempObj.IPAddress = ($dnsRecord.IPAddress -join ',')

        $tempObj.Status = 'OK'

        $tempObj.ErrorMessage = ''

    }

    catch {

        $tempObj.Name = $Name

        $tempObj.IPAddress = ''

        $tempObj.Status = 'NOT_OK'

        $tempObj.ErrorMessage = $_.Exception.Message

    }

    $FinalResult += $tempObj

}

return $FinalResult

پس از ذخیره این اسکریپت، آن را با نام GetDnsRecord.ps1 در پاورشل اجرا کنید. تصویر زیر، خروجی همین دستورات را نشان می‌دهد.

خروجی اسکریپت GetDnsRecord.ps1

همان‌طور که از نتیجه بالا می‌بینید، خروجی اسکریپت ما یک شی است. بنابراین می‌توانید نتایج را با استفاده از دستور زیر، به فایلی با پسوند CSV بفرستید.

.\GetDnsRecord.ps1 | Export-Csv DnsRecord.csv -NoTypeInformation

این دستور، خروجی CSV زیر را خواهد داشت:

خروجی CSV هنگام کار با دستور Resolve-DnsName در PowerShell

 

آنچه در کار با دستور Resolve-DnsName خواندیم

دستور Resolve-DnsName در پاورشل، برای کار با نام‌های دامنه و پیدا کردن رکوردهای آن‌ها استفاده می‌شود. به‌کار گرفتن این دستور بسیار ساده است. به این شکل که باید پارامترهای موردنظرتان را در کنار Resolve-DnsName قرار دهید و خروجی بگیرید. 

شما فکر می‌کنید چه پارامترهای دیگری با این دستور، خروجی خیلی خوبی تحویل می‌دهند؟ ترکیب کدام پارامترها را خودتان امتحان کردید؟ ما در بخش نظرات، مشتاق خواندن و استفاده از تجربه گران‌بهای شما هستیم. پس همین حالا آن را بنویسید و با ما و سایر مخاطبان به‌اشتراک بگذارید.

امتیاز شما به محتوا

نظر خود را در رابطه با مقاله‌ای که خواندید ثبت کنید. همچنین می‌توانید نظر خود را نظر در بخش نظرات بنویسید.

هنوز امتیاز داده نشده!

دیدگاه شما

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *