كيفية العثور على (وإزالة) GPOS غير المرتبطة في Active Directory

كما تنمو المؤسسة ينمو بيئة Active Directory (AD) وبنية سياسة المجموعات (GP). يمكن أن تتزايد سريعًا كائنات سياسة المجموعات (GPOs) وقبل أن تدرك، ستجد نفسك لديك العشرات من GPOs غير المرتبطة تراكمت في بيئتك. دعونا نغير ذلك.

في هذا البرنامج التعليمي، ستتعلم كيفية اكتشاف كافة تلك GPOs غير المرتبطة باستخدام كل من وحدة تحكم إدارة سياسة المجموعات (GPMC) وPowerShell.

لنبدأ!

المتطلبات المسبقة

سيكون هذا المقال برنامجًا تعليميًا مع أمثلة عملية. إذا كنت ترغب في متابعة الدروس، تأكد من أن لديك:

من أين تأتي GPOs غير المرتبطة؟

عند إنشاء سياسة مجموعة وتعريف جميع الإعدادات التي تنوي تطبيقها على أجهزة الكمبيوتر العميل، فإن تلك السياسة لا تفعل شيئًا فعليًا. لكي تؤثر فعليًا على أجهزة الكمبيوتر العميل، يجب أن تتم ربط تلك السياسة بوحدة تنظيمية في النشاط الدليل النشط.

مع تقدم الوقت وزيادة عدد المسؤولين الذين يقومون بإنشاء سياسات المجموعات، ينسون ربطها، أو يلغون ربط السياسات عن وحدات التنظيم، أو ينوون إزالتها ولكن لا يفعلون ذلك، يمكن أن تتكاثر السياسات التي لا تقوم بأي عملية. خاصة في المؤسسات الكبيرة، يمكن أن تنمو السياسات غير المرتبطة إلى المئات إذا لم يتم الحفاظ عليها بشكل صحيح.

العثور على السياسات غير المرتبطة في GPMC

يمكنك العثور على السياسات غير المرتبطة بأحد الطريقتين؛ عبر GPMC أو عبر PowerShell. إذا كانت لديك مجموعة صغيرة فقط من السياسات غير المرتبطة، فقد يكون من المنطقي استخدام GPMC بدلاً من إنشاء سكريبت PowerShell.

للعثور على السياسات غير المرتبطة عبر GPMC:

1. قم بفتح GPMC عن طريق الانتقال إلى قائمة “إدارة سياسة المجموعة” في قائمة البدء الخاصة بك وكتابة “إدارة سياسة المجموعة”. عندما يظهر برنامج GPMC، قم بفتحه.

2. في GPMC، انتقل إلى الغابة: <اسم الغابة الخاصة بك —> النطاقات —> <اسم النطاق الخاص بك>، انقر بزر الماوس الأيمن على اسم النطاق وانقر فوق بحث. سيؤدي هذا الإجراء إلى ظهور صندوق الحوار البحث عن كائنات سياسة المجموعة.

Search option in GPMC console

3. انقر فوق القائمة المنسدلة Search Item واختر GPO-links. سيبحث هذا البند عن GPOs المرتبطة بـ OU. قم بتغيير القائمة المنسدلة Condition لتكون Exist In والمجال يكون مجالك.

في اللقطة الشاشة أدناه، ستبحث هذه الإعدادات عن جميع GPOs المرتبطة بـ OU واحد على الأقل في مجال homelab.local.

عندما تكون العملية كاملة، انقر فوق Add لإضافة المعايير. ستظهر تحت القسم All search criteria.

Adding search item in “Search for Group Policy Objects” window

4. الآن، انقر فوق زر Search للعثور على جميع GPOs التي تطابق معايير البحث.

using search option in “Search for Group Policy Objects” window

5. كما هو مبين في اللقطة الشاشة أدناه، يتم عرض الـ GPOs المرتبطة فقط في نتائج البحث.

Search results for linked GPOs

6. للعثور على GPOs غير المرتبطة، قم بمقارنة جميع GPOs يدوياً مع الـ GPOs المرتبطة كما هو مبين أدناه. في اللقطة الشاشة أدناه، يتم عرض ثلاثة GPOs فقط مرتبطة. بالنظر تحت الـ Group Policy Objects، يمكنك رؤية أن واحدة من الـ GPOs لا تظهر (UnlinkedGPO1 و UnlinkedGPO2). وهذا يعني أنها غير مرتبطة.

سيكون هذا المهمة تستغرق وقتاً ولهذا سترى كيفية أداء هذه المهمة عبر PowerShell في القسم التالي.

Comparing search results with all the Group Policy Objects

ستحتوي الـ GPOs المرتبطة على رابط عندما يتم تعيينها لكائن AD مثل OU، كما هو مبين أدناه. إذا كان لديك عدد قليل من GPOs، يمكنك البحث عن GPOs التي تحتوي على رابط، وتلك التي لا تحتوي على رابط. الـ GPOs التي لا تحتوي على رابط هي GPOs غير المرتبطة.

Displaying linked GPO

العثور على GPOs غير المرتبطة باستخدام PowerShell

البحث في سياسات المجموعة في GPMC قد يعمل لعدد قليل من سياسات المجموعة، ولكن ستواجه صعوبات إذا كان لديك مئات أو آلاف من سياسات المجموعة التي تدير آلافًا من نقاط النهاية. في هذه الحالة ، حان الوقت لتوتيكن هذه العملية وإنشاء أداة PowerShell مفيدة.

بشرط أن تكون على جهاز الكمبيوتر الخاص بك الذي تم الانضمام إلى النطاق المحلي مع تثبيت RSAT:

1. افتح نافذة تحكم PowerShell في نظام التشغيل Windows.

2. استيراد وحدة GroupPolicy. تأتي وحدة GroupPolicy مع RSAT ويجب أن تكون مثبتة بالفعل على نظامك. تحتوي هذه الوحدة على جميع الأوامر اللازمة للعمل مع سياسات المجموعة في PowerShell.

Import-Module GroupPolicy

3. قم بتشغيل cmdlet PowerShell Get-GPO باستخدام المعلمة All. يقوم هذا ال cmdlet باستعلام AD وإرجاع جميع سياسات المجموعة الموجودة.

Get-GPO -All
Get-Gpo cmdlet output

4. الآن بما أنه يمكنك استعلام جميع سياسات المجموعة في النطاق ، يجب عليك الآن معرفة أي منها غير مرتبطة. للقيام بذلك ، قم بتشغيل cmdlet Get-GPOReport. يتيح لك هذا ال cmdlet تقديم اسم ونوع الإخراج لإرجاعه.

Get-GPOReport -Name SomeGPO -ReportType XML

قم بنسخ ولصق أحد أسماء سياسات المجموعة التي تم العثور عليها في الخطوة السابقة وتشغيل هذا الأمر. سترى أن ال cmdlet يرجع تقرير XML لجميع الإعدادات التي تحتوي عليها سياسات المجموعة. خاصة ، لاحظ القسم المسمى LinksTo كما هو موضح أدناه. يحتوي هذا القسم على عنصر XML SOMPath الذي يمثل المسار إلى وحدة التنظيم التي تم ربطها بها.

Sample output containing LinksTo section

يمكن لأمر Get-GPOReport الحصول على تقرير لـ GPO واحد في كل مرة. هذا الأمر يتضمن نتائج البحث فقط من النطاقات وليس من مواقع AD.

5. الآن بمعرفة كيفية العثور على جميع GPOs باستخدام Get-GPO وأمر لاكتشاف ما يرتبط بهم (Get-GPOReport), قم بدمجهم عن طريق نسخ ولصق الأمر PowerShell أدناه في وحدة التحكم الخاصة بك.

الأمر أدناه يستعلم عن جميع GPOs في النطاق (Get-GPO) ثم يولد تقرير XML لكل منها (Get-GPOReport), مما يسمح فقط لتلك التي لا تحتوي على سلسلة <LinksTo> في التقرير (Select-String) بالعودة.

Get-GPO -All | Where-Object {
     $_ | Get-GPOReport -ReportType XML | Select-String -NotMatch "<LinksTo>"
 }

في بيئة البرنامج التعليمي، يمكنك أن ترى في المثال أدناه UnlinkedGPO1 و UnlinkedGPO2 غير مرتبطة بأي وحدة تنظيمية.

Listing out unlinked GPO in the domain

بناء أداة PowerShell لـ Unlinked GPO

الآن دعنا نضع كل ما تعلمته معًا ونقوم ببناء سكريبت PowerShell قد تستخدمه في العالم الحقيقي.

1. افتح محرر الكود المفضل لديك وانسخ / الصق السكريبت PowerShell التالي فيه. احفظ السكريبت باسم Remove-UnlinkedGPO.ps1. هذا السكريبت:

  • ينشئ مجلدًا باسم التاريخ الحالي لتخزين تقارير GPO غير المرتبطة.
  • يجد جميع GPOs في AD التي غير مرتبطة.
  • ينشئ تقرير HTML لكل GPO غير مرتبط ويحفظه على القرص.
  • ينشئ ويضيف إلى ملف نصي قائمة بجميع GPOs غير المرتبطة.
  • يقوم بإزالة كل GPO غير المرتبط مع خطوة تأكيد باستخدام أمر Remove-GPO.

يمكنك أيضًا تنزيل سكريبت Remove-UnlinkedGPO.ps1 عبر GitHub.

Import-Module GroupPolicy
 $Date = Get-Date -Format dd_MM_yyyy
 $BackupDir = "c:\GPOBackup\$Date"
## ينشئ دليلاً لتخزين تقارير GPO
 if (-Not(Test-Path -Path $BackupDir))  {
   New-Item -ItemType Directory $BackupDir -Force
 }
# احصل على جميع GPOs مع نوع تقرير gpo كـ XML وابحث أيضًا عن القسم في تقرير XML.
# النظر فقط في GPOs التي ليس لديها قسم.
 Get-GPO -All | Where-Object { $_ | Get-GPOReport -ReportType XML | Select-String -NotMatch "<LinksTo>" } | ForEach-Object {
   # اختياري: نسخ النسخ الاحتياطي لـ GPO والتقرير HTML وحفظ تفاصيل GPO في ملف نصي.
   Backup-GPO -Name $_.DisplayName -Path $BackupDir
    # قم بتشغيل التقرير وحفظه كتقرير HTML على القرص
   Get-GPOReport -Name $_.DisplayName -ReportType Html -Path "$BackupDir\$($_.DisplayName).html"
   # إنشاء وإلحاق ملف نصي يسمى UnlinkedGPOs.txt في مجلد النسخ الاحتياطي الذي
   # يحتوي كل كائن GPO الذي تعيد Get-GPO
   $_ | Select-Object * | Out-File "$BackupDir\UnLinkedGPOs.txt" -Append
   # إزالة GPO ولكن أولاً توجيه قبل الإزالة
   $_.Displayname | Remove-GPO -Confirm
 }

2. تنفيذ سكريبت Remove-UnlinkedGPO.ps1.

3. إذا تم العثور على GPO غير مرتبط، سيقوم السكربت بتوجيهك لإزالته. يأتي هذا التوجيه من Remove-GPO باستخدام مفتاح التأكيد Confirm. لتأكيد إزالة GPO الفردية تلك، انقر نعم، وإلا، انقر نعم للكل لإزالة جميع GPOs غير المرتبطة دون تأكيد إضافي.

GPO deletion confirmation prompt

بعد اكتمال السكربت والعثور على GPO غير المرتبطة على الأقل واحدة، يجب أن تشاهد في المجلد C:\GPOBackup\<تاريخ> محتويات GPO كمجلد GUID بالإضافة إلى تقارير HTML وملف UnlinkedGPOs.txt.

Displaying Backup Folder

4. الآن، افتح إحدى تقارير GPO HTML باستخدام متصفح الويب. يمكنك أن ترى أدناه أن التقرير يحتوي على جميع الإعدادات المحددة في تلك GPO. في المثال أدناه، تحتوي GPO UnlinkedGPO1 على إعدادات لسياسة تنفيذ PowerShell.

GPO HTML report

5. أخيرًا، افتح ملف UnlinkedGPOs.txt. سترى أدناه أنه يحتوي على نفس الناتج الذي تلقيته من Get-GPO cmdlet.

UnlinkedGPOs.txt GPO listing

الاستنتاج

يجب أن تعرف الآن كيفية العثور على جميع تلك GPOs غير المرتبطة في بيئتك AD باستخدام GPMC وPowerShell.

أي الطريقتين تفضل؟ هل يمكنك التفكير في طريقة لتحسين سكربت PowerShell المعروض؟

Source:
https://adamtheautomator.com/unlinked-gpo/