איך למצוא (ולהסיר) GPOs לא מקושרים ב Active Directory

ככל שארגון גדל, כך גם הסביבה שלו ב-Active Directory (AD) ובתשתיות מדיניות קבוצה (GP) מתרחבת. אובייקטי מדיניות קבוצה (GPOs) יכולים להתמלא במהירות ולפתע תופסים מקום בסביבה שלך. בבעיה של עשרות GPOs שאינם מקושרים מקרינים בסביבה שלך. בואו נשנה זאת.

במדריך זה, תלמד איך לגלות את כל ה-GPOs שאינם מקושרים עם ה-מסוף ניהול מדיניות הקבוצה (GPMC) ו-PowerShell.

בואו נתחיל!

דרישות מוקדמות

מאמר זה יהיה מדריך עם דוגמאות מעשיות. אם ברצונך להתעקש, וודא שיש לך:

מאיפה מגיעים GPOs שאינם מקושרים?

כאשר אתה יוצר GPO ומגדיר את כל ההגדרות שברצונך ליישם על מחשבי הלקוח, ה-GPO הזה לא עושה כלום בפועל. כדי להשפיע בפועל על מחשבי הלקוח, על ה-GPO להיות מקושר ליחידת ארגון (OU) ב-AD.

ככל שהזמן עובר ומנהלים רבים יוצרים GPOs, שוכחים לקשור אותם, מנתקים GPOs מ-OUs, מתכוונים להסיר אותם אך לעולם לא עושים זאת, GPOs פשוט מתנפצים ונשארים סתם מסתובבים. במיוחד בארגונים גדולים, GPOs שאינם מקושרים יכולים להתרחש במאות אם לא יתוודעו כהלכה.

איתור של GPOs שאינם מקושרים ב-GPMC

ניתן למצוא GPOs שאינם מקושרים באחת משני הדרכים: דרך ה-GPMC או דרך PowerShell. אם יש לך רק מספר זעיר של GPOs שאינם מקושרים, ייתכן שיהיה הגיוני להשתמש ב-GPMC במקום ליצירת סקריפט PowerShell.

כדי למצוא GPOs שאינם מקושרים דרך ה-GPMC:

1. פתח את ה-GPMC על ידי לגשת לתפריט ההתחלה ולהקליד "ניהול מדיניות קבוצתית". כאשר התוכנית GPMC מופיעה, פתח אותה.

2. ב-GPMC, עבור אל יער: <שם היער שלך —> דמיינים —> <שם הדומיין שלך>, לחץ עם העכבר על שם הדומיין ולחץ חיפוש. פעולה זו תביא את תיקיית החיפוש למדיניות הקבוצה Search for Group Policy Objects.

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

עיון ב-GPOs ב-GPMC עשוי לעבוד עבור מספר קטן של GPOs, אך ייתכן שתתמקד בקושי אם יש לך מאות או אלפי GPOs שמנהלים אלפי נקודות קצה. במקרה כזה, זהו הזמן לאוטומציה של תהליך זה ולבנות כלי PowerShell נוח.

בהנחה שאתה על מחשב Windows מקומי מצורף לדומיין עם RSAT מותקן:

1. פתח קונסולת PowerShell של Windows.

2. יבא את המודול GroupPolicy. מודול ה-GroupPolicy מגיע עם RSAT וכבר צריך להיות מותקן במערכת שלך. מודול זה מכיל את כל הפקודות הנחוצות לעבוד עם GPOs ב-PowerShell.

Import-Module GroupPolicy

3. הרץ את פקודת ה-PowerShell Get-GPO באמצעות הפרמטר All. פקודה זו משאירה בקשר AD ומחזירה את כל ה-GPOs שנמצאו.

Get-GPO -All
Get-Gpo cmdlet output

4. עכשיו שניתן לשאול את כל ה-GPOs בדומיין, עליך להבין כעת אילו מהם אינם מקושרים. כדי לעשות זאת, הרץ את הפקודה Get-GPOReport. פקודה זו מאפשרת לך לספק שם וסוג של פלט להחזיר.

Get-GPOReport -Name SomeGPO -ReportType XML

העתק והדבק ידנית את אחד משמות ה-GPOs שנמצאו בשלב למעלה והפעל את הפקודה. תראה שהפקודה מחזירה דוח XML של כל ההגדרות של ה-GPOs. במיוחד, שים לב לחלק הנקרא LinksTo, כפי שמוצג למטה. סעיף זה מכיל את קוד XML של הנתיב אל ה-OU שה-GPO מקושר אליו.

Sample output containing LinksTo section

פקודת ה-\code{Get-GPOReport} יכולה לקבל דוח רק עבור GPO יחיד בכל פעם. פקודת זו כוללת תוצאות חיפוש רק מתחומים ולא מאתרי AD.

5. עכשיו שאתה יודע כיצד למצוא את כל ה-GPOs עם ה-\code{Get-GPO} ופקודת ה-\code>Get-GPOReport} לגלות למה הם מקושרים (\code{Get-GPOReport}), יש לשלב אותם על ידי העתקה והדבקה של הפקודת PowerShell הבאה במסוף שלך.

הפקודה למטה מפעילה שאילתא עבור כל ה-GPOs בדומיין (\code{Get-GPO}) ואז יוצרת דוח XML עבור כל אחד מהם (\code{Get-GPOReport}), מאפשרת רק לגרסאות שאין להן מחרוזת \code{} בדוח (\code{Select-String}) להיחזר.

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

בסביבת ההדרכה, אתה יכול לראות בדוגמה הבאה UnlinkedGPO1 ו- UnlinkedGPO2 לא מקושרים לשום OU.

Listing out unlinked GPO in the domain

בניית כלי PowerShell ל-GPO שאינם מקושרים

עכשיו נשלב את כל מה שלמדת ליחד ונבנה סקריפט PowerShell שתוכל להשתמש בו בעולם האמיתי.

1. פתח את העורך שלך המועדף והעתק/הדבק את הסקריפט PowerShell הבא אליו. שמור את הסקריפט כ- Remove-UnlinkedGPO.ps1. סקריפט זה:

  • יוצר תיקייה עם התאריך הנוכחי לאחסון דוחות GPO לא מקושרים.
  • מוצא את כל ה-GPOs ב-AD שאינם מקושרים.
  • יוצר דוח HTML עבור כל GPO לא מקושר ושומר אותו על הדיסק.
  • יוצר ומוסיף לקובץ טקסט רשימה של כל ה-GPOs לא מקושרים.
  • מסיר כל GPO לא מקושר עם שלב אישור באמצעות פקודת ה-\code{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 עם סוג הדוח שלהם כ-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 היחידי זה, לחץ כן, אחרת, לחץ כן להכול כדי להסיר את כל ה-GPO שאינם מקושרים ללא אישור נוסף.

GPO deletion confirmation prompt

לאחר שהתסריט הושלם ונמצא לפחות GPO אחד שאינו מקושר, עליך לראות בתיקיית C:\GPOBackup\<תאריך> את תוכן ה-GPO כתיקיית GUID יחד עם דוחות ה-HTML והקובץ UnlinkedGPOs.txt.

Displaying Backup Folder

4. עכשיו, פתח אחד מדוחות ה-HTML של ה-GPO עם דפדפן אינטרנט. תוכל לראות שהדוח מכיל את כל ההגדרות שהוגדרו ב-GPO ההוא. בדוגמה שלמטה, ה-GPO UnlinkedGPO1 מכיל הגדרות למדיניות ביצוע PowerShell.

GPO HTML report

5. לבסוף, פתח את הקובץ UnlinkedGPOs.txt. תראה שהוא מכיל את אותה הפלט שקיבלת מתסריט ה-Get-GPO.

UnlinkedGPOs.txt GPO listing

סיכום

עליך כעת לדעת כיצד למצוא את כל ה-GPO שאינם מקושרים בסביבת ה-AD שלך באמצעות GPMC ו-PowerShell.

איזו דרך אתה מעדיף? האם יש לך רעיון לשפר את תסריט ה-PowerShell שכיסיתי?

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