يتم استخدام PowerShell من قبل العديد من مسؤولي الخادم. وبطبيعة الحال، إحدى المهام الأكثر استخدامًا هي القدرة على إنشاء البرامج النصية والوظائف لجرد الخوادم الخاصة بك وفهم ما تحتويه بيئتك.
على الرغم من وجود العديد من الطرق لتحقيق ذلك، بمستويات متفاوتة من التعقيد، فإننا سنقوم ببناء تقرير جرد Windows Server بسيط إلى حد ما ولكنه مؤثر في هذه المقالة.
المتطلبات الأساسية
هذه المقالة ستكون عملية. إذا كنت تنوي المتابعة، فيرجى التأكد من توفر المتطلبات الأساسية التالية أولاً:
- العمل على جهاز كمبيوتر يعمل بنظام Windows 10 مرتبط بمجال Active Directory (AD).
- قم بتثبيت وحدة ActiveDirectory PowerShell من مجموعة أدوات RSAT.
- لديك إذن للاستعلام عن حسابات الكمبيوتر AD
- يمكن تشغيل استعلامات WMI/CIM عن بعد ضد أجهزة الكمبيوتر البعيدة
- يملك التحكم عن بعد بوويرشيل متاحة على أجهزة الكمبيوتر البعيدة
إسترجاع الخوادم
أساس البرنامج النصي الذي نقوم ببنائه هو الخوادم نفسها. يمكنك كتابتها بشكل فردي في ملف نصي تتم قراءته، أو في مصفوفة داخل البرنامج النصي نفسه ولكن باستخدام PowerShell يمكننا القيام بذلك بشكل أفضل. لجعل البرنامج النصي أكثر ديناميكية ولا يتطلب منا تعديله في أي وقت تتم فيه إضافة خادم جديد، يمكننا استخدام Active Directory (AD) لسحب قائمة كائنات الكمبيوتر في وحدة تنظيمية معينة (OU).
أدناه نحن نستخدم
ActiveDirectory
الوحدة، المتوفرة في مجموعة أدوات RSAT، للاستعلام
Servers
OU واسترداد كافة كائنات الكمبيوتر هناك عبر
Get-ADComputer
.
Import-Module ActiveDirectory$OU = 'OU=Servers,DC=domain,DC=local'
$Params = @{
"SearchBase" = $OU
"Filter" = '*'
}
$Servers = Get-ADComputer @Params
في هذه المرحلة، كان بإمكاننا تصفية خاصية الاسم فقط لملء الملف $servers
متغير، ولكن غالبًا ما يكون من المفيد جدًا الحصول على الكائن الذي تم إرجاعه بالكامل لاستخدامه لاحقًا.
تحديد البيانات المراد جمعها
الآن بعد أن أصبح لدينا خوادمنا، نحتاج إلى معرفة ما الذي يجب أن نجمعه بالضبط من كل خادم. أحد الأسباب التي تجعل من المهم الاحتفاظ بكائن AD الكامل هو دمج تلك البيانات مع البيانات المباشرة من الخادم نفسه للحصول على صورة أكبر لبيئتك.
في الممارسة العملية، كيف يبدو شيء مثل هذا؟ دعونا ندرج بعض الخصائص التي قد يكون من المفيد جدًا معرفتها.
قيم الخادم
- اسم مضيف الخادم
- مساحة حرة على القرص
- ذاكرة
- اتصالات الشبكة
قيم الإعلان
- كلمة المرور الأخيرة التي تم تعيينها
- تسجيل الدخول الأخير
- اسم مضيف DNS
استرجاع معلومات الخادم
كيف يمكننا أن نقوم بجمع هذه المعلومات على قائمة الخوادم التي تم إرجاعها؟ وبما أن لدينا قائمة بالخوادم، سيتعين علينا تكرارها $Servers
الكائن والاستعلام. البدء بأمر بسيط Foreach-Object
في الحلقة أدناه، يمكننا إنشاء كائن مخصص للاحتفاظ بقيمنا.
$Servers | Foreach-Object {
(PSCustomObject)@{
"ServerHostName" = $_.Name
"Description" = $_.Description
"FreeDiskSpace" = $Null
"TotalMemory" = $Null
"NetworkConnections" = $Null
"PasswordLastSet" = $_.pwdLastSet
"LastLogon" = $_.lastLogon
"DNSHostName" = $_.DNSHostName
"CreationDate" = $_.WhenCreated
}
}
كما تعلم، من خلال حفظ الكائن بالكامل من Active Directory عندما قمنا باسترداد أجهزة الكمبيوتر لأول مرة، يتيح لنا ملء نطاق واسع من المعلومات. لسوء الحظ، هذه ليست كل المعلومات التي نحتاجها.
للحصول على المعلومات من كل خادم، سوف نستخدم واجهة مألوفة للعديد من مسؤولي الخادم، وهي واجهة Windows Management Instrumentation (WMI). قد تلاحظ أن أوامر cmdlets المستخدمة أدناه هي من واجهة نموذج المعلومات العامة (CIM)، والتي يعد WMI منها تطبيق Microsoft لهذا المعيار.
احصل على مساحة القرص الحرة
باستخدام فئة WMI المتوفرة Win32_LogicalDisk
، يمكننا الحصول على كافة الأقراص المتوفرة والمساحة الحرة الخاصة بها. عندما نقوم بتشغيل الأمر لأول مرة، Get-CimInstance -ClassName Win32_LogicalDisk
، قد تلاحظ أنه ليس من الممكن قراءته تمامًا في مخرجاته الافتراضية.
المشكلة الثانية هنا هي أنه تم إرجاع أكثر من محرك أقراص واحد. أود أن أعرف المزيد عن كل من محركات الأقراص هذه ومقدار المساحة الحرة المتوفرة بالجيجابايت. دعونا نعدل الكود لإجراء بعض التحولات ونجعلها أفضل.
$Disks = Get-CimInstance -ClassName Win32_LogicalDisk$DisksResult = $Disks | Foreach-Object {
(PSCustomObject)@{
"Drive" = $_.DeviceID
"FreeSpace" = (Math)::Round(($_.FreeSpace / 1GB),2)
}
}
$DisksResult
بعد أن نقوم بتشغيل الأوامر، تصبح مخرجاتنا أكثر وضوحًا ويمكن استخدامها الآن في البرنامج النصي الخاص بنا.
ولكن ماذا لو أردنا التنبيه بشأن حالة انخفاض مساحة القرص؟ سيكون من الجيد توسيع هذا قليلاً لتعيين علامة على كل محرك أقراص يلبي هذا الشرط. وبمقارنة المساحة الحرة بإجمالي المساحة المتوفرة، يمكننا معرفة ما إذا كانت أقل من 10% أو 10 جيجابايت. السبب -or
الشرط هو أنه على الأقراص الكبيرة جدًا، قد تظل نسبة 10% سخية جدًا، لذا فإن تحديد حد مطلق يساعد.
$Disks = Get-CimInstance -ClassName Win32_LogicalDisk$DisksResult = $Disks | Foreach-Object {
$FreeSpace = (Math)::Round(($_.FreeSpace / 1GB),2)
$TotalSpace = (Math)::Round(($_.Size / 1GB),2)
If ( ($FreeSpace / $TotalSpace -LT 0.10) -Or $FreeSpace -LT 10 ) {
$LowDiskSpace = $True
} Else {
$LowDiskSpace = $False
}
(PSCustomObject)@{
"Drive" = $_.DeviceID
"FreeSpace" = $FreeSpace
"LowDiskSpace" = $LowDiskSpace
}
}
$DisksResult
كما يمكنك أن تقول الآن، لدينا مجموعة رائعة من المعلومات التي سيتم حفظها على خوادمنا.
احصل على الذاكرة المتاحة
من المفيد معرفة مقدار ذاكرة الوصول العشوائي (RAM) المخصصة لكل خادم، خاصة في بيئة الجهاز الظاهري. إذا وجدت أن بعضها مزود بشكل زائد، فيمكنك توفير موارد قيمة عن طريق ضبط حجم الخوادم بشكل صحيح. لحسن الحظ، هذا أسهل بكثير في الاسترداد.
باستخدام Win32_PhysicalMemory
فئة WMI، يمكننا جمع كل ما تم إرجاعه Capacity
خصائص للحصول على الذاكرة الإجمالية.
(Get-CimInstance -ClassName Win32_PhysicalMemory | Measure-Object -Property Capacity -Sum).Sum / 1GB
احصل على كافة اتصالات الشبكة
وأخيرًا، نريد استرداد جميع اتصالات الشبكة معًا. يعد هذا مفيدًا لمعرفة ما إذا كان خادم معين يحتوي على واجهات متعددة تدعو للقلق. باستخدام آلية مختلفة قليلا هذه المرة، نحن نستخدم Get-NetAdapter
cmdlet، ولكن بما أن هذا لا يحتوي على ملف ComputerName
المعلمة، سوف نستخدم PS Remoting لاستدعاء هذا محليًا على الخادم الهدف وإرجاع النتائج إلى البرنامج النصي الخاص بنا.
$NetworkConnections = Invoke-Command -ComputerName $_.DnsHostName -ScriptBlock {
Get-NetAdapter -Physical | Select-Object Name, Status, LinkSpeed
}
ستبدو مخرجاتنا مشابهة لتلك الموجودة أدناه ويمكننا بعد ذلك حفظها في البرنامج النصي الخاص بنا.
ضع في اعتبارك أن ل Invoke-Command
لكي يعمل، يجب إعداد PS Remoting على الخوادم المستهدفة.
وضع كل ذلك معا
الآن بعد أن أصبح لدينا كل القطع، دعونا نجمع كل هذا معًا. يوجد النص النهائي أدناه ويجمع كل التعليمات البرمجية لإنشاء كائن إخراج مخصص مع ما نريد الإبلاغ عنه فقط.
Import-Module ActiveDirectory$OU = 'OU=Servers,DC=domain,DC=local'
$Params = @{
"SearchBase" = $OU
"Filter" = '*'
}
$Servers = Get-ADComputer @Params
$Servers | Foreach-Object {
$Disks = Get-CimInstance -ComputerName $_.DnsHostName -ClassName Win32_LogicalDisk
$DisksResult = $Disks | Foreach-Object {
(PSCustomObject)@{
"Drive" = $_.DeviceID
"FreeSpace" = (Math)::Round(($_.FreeSpace / 1GB),2)
}
}
$NetworkConnections = Invoke-Command -ComputerName $_.DnsHostName -ScriptBlock {
Get-NetAdapter -Physical | Select-Object Name, Status, LinkSpeed
}
(PSCustomObject)@{
"ServerHostName" = $_.Name
"Description" = $_.Description
"FreeDiskSpace" = $DisksResult
"TotalMemory" = ((Get-CimInstance -ComputerName $_.DnsHostName -ClassName Win32_PhysicalMemory | Measure-Object -Property Capacity -Sum).Sum / 1GB)
"NetworkConnections" = $NetworkConnections
"PasswordLastSet" = $_.pwdLastSet
"LastLogon" = $_.lastLogon
"DNSHostName" = $_.DNSHostName
"CreationDate" = $_.WhenCreated
}
}
خاتمة
وما أظهرناه هنا هو مجرد غيض من فيض فيما يتعلق بما يمكن بناؤه لتقرير المخزون. هناك العديد من الخصائص المفيدة التي يمكنك إضافتها إلى هذا التقرير. بأخذ هذا أبعد من ذلك، يمكنك إنشاء ذلك في صفحة HTML، أو جدولة مهمة لتشغيلها هذا الأسبوع، أو حتى تغليفها في أدوات أخرى مثل Ansible.
يعمل PowerShell على تسهيل الحصول على كافة المعلومات التي تحتاجها لتجميعها في مكان واحد. بمجرد تحليل بيئتك وتحديد ما تحتاج إلى معرفته، قم بإنشاء التقرير في PowerShell للمساعدة في إثبات قدرتك على تدقيق بيئتك في المستقبل.
(العلامات للترجمة)مايكروسوفت