كيفية إنشاء تقرير مخزون Windows Server مجانًا باستخدام PowerShell

يتم استخدام 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، قد تلاحظ أنه ليس من الممكن قراءته تمامًا في مخرجاته الافتراضية.


/wordpress/wp-content/uploads/csit/2019/12/7ad76249.png

المشكلة الثانية هنا هي أنه تم إرجاع أكثر من محرك أقراص واحد. أود أن أعرف المزيد عن كل من محركات الأقراص هذه ومقدار المساحة الحرة المتوفرة بالجيجابايت. دعونا نعدل الكود لإجراء بعض التحولات ونجعلها أفضل.

$Disks = Get-CimInstance -ClassName Win32_LogicalDisk

$DisksResult = $Disks | Foreach-Object {
    (PSCustomObject)@{
        "Drive" = $_.DeviceID
        "FreeSpace" = (Math)::Round(($_.FreeSpace / 1GB),2)
    }
}

$DisksResult

بعد أن نقوم بتشغيل الأوامر، تصبح مخرجاتنا أكثر وضوحًا ويمكن استخدامها الآن في البرنامج النصي الخاص بنا.

/wordpress/wp-content/uploads/csit/2019/12/4ad3ee0c.png


ولكن ماذا لو أردنا التنبيه بشأن حالة انخفاض مساحة القرص؟ سيكون من الجيد توسيع هذا قليلاً لتعيين علامة على كل محرك أقراص يلبي هذا الشرط. وبمقارنة المساحة الحرة بإجمالي المساحة المتوفرة، يمكننا معرفة ما إذا كانت أقل من 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

كما يمكنك أن تقول الآن، لدينا مجموعة رائعة من المعلومات التي سيتم حفظها على خوادمنا.

Untitled%202

كيف%20to%20Build%20a%20Windows%20Server%20Inventory%20Report%20for/Untitled%202.png

احصل على الذاكرة المتاحة

من المفيد معرفة مقدار ذاكرة الوصول العشوائي (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
}

ستبدو مخرجاتنا مشابهة لتلك الموجودة أدناه ويمكننا بعد ذلك حفظها في البرنامج النصي الخاص بنا.

/wordpress/wp-content/uploads/csit/2019/12/e4621782.png


ضع في اعتبارك أن ل 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 للمساعدة في إثبات قدرتك على تدقيق بيئتك في المستقبل.

(العلامات للترجمة)مايكروسوفت

أضف تعليق