سینتکس دستور 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 مراحل این کار را در سایت ایرنیک بهطور کامل آموزش داده است.

رکوردهای پشتیبانیشده عبارتند از 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 نشان میدهد.

محدود کردن جستوجوی 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های عمومی نخواهد بود. در این حالت با پیغام خطا، مشابه تصویر زیر مواجه خواهیم شد:

دستور 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 در پاورشل اجرا کنید. تصویر زیر، خروجی همین دستورات را نشان میدهد.

همانطور که از نتیجه بالا میبینید، خروجی اسکریپت ما یک شی است. بنابراین میتوانید نتایج را با استفاده از دستور زیر، به فایلی با پسوند CSV بفرستید.
.\GetDnsRecord.ps1 | Export-Csv DnsRecord.csv -NoTypeInformationاین دستور، خروجی CSV زیر را خواهد داشت:

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


