בדיקת מצב פעילות הספרייה הראשית עם מסגרת PowerShell

זהו חלק II מסדרת המאמרים הכוללת שני חלקים על בדיקות בריאות ה-Active Directory. אם תרצה ללמוד כיצד נבנה את הסקריפט PowerShell שתלמד עליו במאמר הזה, אתה מוזמן לבדוק את בניית כלי בדיקת בריאות של Active Directory [בעומק]: חלק I.

בחלק I, למדת כמה בדיקות שונות ולמה הן חשובות. עכשיו בוא נגיע לשילובם ולבניית כלי. בחלק זה, תמיר את כל בדיקות בריאות ה-Active Directory שנבארו בחלק I למתכנת בדיקות. תלמד גם כיצד להוציא את תוצאות בדיקות הבריאות השונות לכלים כמו Pester וכלי ניטור בשם PRTG.

כדי להמשיך או לראות גרסה גמורה של הכלי שתלמד עליו במאמר זה, ניתן להוריד את התסריט ADHealthCheck-NoResult.ps1 מ-GitHub.

הגדרת הפלט

קיום סוג אובייקט משותף ודרך פשוטה לייצרו יעשה את התהליך של המרת תוצאות הבדיקות לכלי הבחירה שלך הרבה יותר פשוט.

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

A PowerShell class is a schema that defines how a PowerShell object should look and what it should do. Each line you see below represents a property the objects return will have. You can see below I’m planning on each AD health check to return ten properties.

Class AdhcResult {
    [string]$Source
    [string]$TestName
    [bool]$Pass
    $Was
    $ShouldBe
    [string]$Category
    [string]$SubCategory
    [string]$Message
    $Data
    [string[]]$Tags
}

כדי להאיץ את יצירת הכיתה הזו, אני אשתמש בפונקציית עזר בשם New-AdhcResult. פונקציה זו יוצרת את הכיתה ואת כל הדברים שתצטרך להשתמש בהם. פונקציה זו תפיק תוצאה מסוג [AdhcResult] מותאמת אישית.

הפעלת כלי בדיקת בריאות ה-AD

ראשית, הורד והעתק את סקריפט בדיקת בריאות ה-AD לשרת ברשותך. פתח אותו ב-PowerShell ISE והפעל אותו. חלק זה של הכלי לא יחזיר מידע.

הסקריפט ירוץ וישמור את תוצאת כל בדיקה במשתנה $TestResults כמספר עצמים מסוג [AdhcResult]. יש להשתמש באובייקטים אלו מאוחר יותר ליצירת דוחות או לפלט לכליים שונים. שמירת תוצאות בדיקת בריאות במשתנה כזה מאפשרת לך להוסיף עוד תוצאות במידת הצורך ולהשתמש בפקודה New-AdHcResult.

לאחר הסקריפט מסיים לרוץ, אתה צריך להכיל עכשיו סט מלא של אובייקטים של בדיקת בריאות ה-AD שמאוחסנים במשתנה $TestResults. כעת תוכל להפעיל את $TestResults מהקונסול ולראות את התוצאות הגולמיות.

הצגת תוצאות בדיקת בריאות ה-AD בכלים

מכיוון שכל הבדיקות נמצאות בסוג אובייקט משותף, תוכל לבדוק אותן בצורה טובה יותר דרך כלים כמו Pester ו-PRTG.

במקטע זה, תלמד כיצד ליצור דוח HTML עם כלי בשם extent ולהציג את הדוח ב-PRTG.

יצירת קובץ XML של nUnit עם Pester

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

מאחר ואתה עובד עם PowerShell, תשתמש ב-Pester testing framework כדי לקרוא את הפלט מתסריט בדיקת הבריאות של AD וליצור קובץ XML של nUnit

התחל על ידי הורדת הגרסה האחרונה של Pester. ניתן להוריד את Pester על ידי הרצת Install-Module בקונסולת PowerShell ברמת הריצון. הפקודה למטה תכפה התקנה של הגרסה האחרונה של Pester. מאחר שתעודת היצרן האשראי שבה חתום Pester מגיעה עם Windows 10, נצטרך להשתמש בפרמטר SkipPublisherCheck כדי להתקין אותו.

PS51> Install-Module Pester -Force -Verbose -SkipPublisherCheck

לאחר ש-Pester זמין, תוכל להריץ את התסריט וליצור באופן דינמי קבוצה של בדיקות Pester.

הערה: באפשרותך גם ליצור בדיקות Pester בעצמך בלי אפילו להשתמש בתסריט ה-PowerShell שסיפקתי.

התסריט של PowerShell למטה ישתמש ב-Pester כדי ליצור קובץ XML של nUnit מפלט המשתנה $TestResults הוגדר בתסריט ADHealthCheck-NoResult.ps1.

שמור קובץ זה בשם Pester.ps1 באותו התיקייה שבה נמצא סקר בריאות ה־AD.

# הטען את קובץ ADHealthCheck
. $PSScriptRoot\ADHealthCheck-NoResult.ps1
$Grouped = $TestResults | Group-Object Category

Foreach($Category in $Grouped) {
    Describe -Name $Category.Name -Tags ($Category.Group.Tags | Select -Unique) {
        Foreach($Result in $Category.Group){
            Context "$($Result.Source) - $($Result.TestName)" {
                It -Name "Should've passed" {
                    $Result.Pass | Should -Be -ExpectedValue $True -Because $Result.data
                }
            }
        }
    }
}

לבסוף, הרץ את Invoke-Pester למטה כדי להפעיל את קובץ Pester.ps1 ולשמור את התוצאות בפורמט NUnitXml.

PS51 > Invoke-Pester -Script @{Path = '.\Pester.ps1'} -OutputFile .\NunitReport.xml -OutputFormat NUnitXml

בניית דוח HTML עם כלי ה־Extent

לאחר שתקבל את קובץ ה־NUnit XML, תוכל כעת להשתמש בו כדי להעביר לכלי שיכול להמיר אותו ל־HTML. אחד מהכלים האלה נקרא extent. Extent הוא כלי שימושי ליצירת דוחות HTML מקבצי XML של Nunit.

ראשית, הורד את extent לאותו התיקייה שבה נמצא קובץ ה־NunitReport.xml שנוצר בשלב הקודם. לאחר מכן, בצע את הפקודות הבאות בשיחת PowerShell. פקודות אלו ייצורו את התיקייה לאחסון הקבצים ה־HTML ולאחר מכן יפעילו את extent.exe כדי לבצע את ההמרה.

# צור תיקיית דוח
PS51> mkdir .\HTMLReports

# צור את הדוח
PS51> .\extent.exe -i .\NunitReport.xml -o .\HTMLReports\

כאשר התהליך הושלם, תמצא שני קבצי HTML בתיקיית HTMLReports. הקבצים יראו כמו בתמונות מסך שתפתח בדפדפן.

HTML report for Pester test output
HTML report for Pester test output

הכנסת תוצאות בדיקת בריאות ה־AD אל PRTG

פרטג' הוא כלי מעקב פופולרי שפותח על ידי Paessler שאפשר להשתמש בו כדי לעקוב אחר התשתית והשירותים שלך. בסעיף זה, תלמד כיצד להעביר את תוצאות בדיקת הבריאות ל-PRTG לאחר שנכנס סקריפט בדיקת הבריאות.

להעביר תוצאות ל-PRTG דורש יותר עבודה מאשר לקבל מידע על ידי הכלי, אך בסופו של דבר תראה שההגדרה שווה את הזמן שהושקע בה.

תנאים מראש

כדי להגדיר בהצלחה את PRTG ככלי מעקב עבור סקריפט בדיקת הבריאות של AD שנבנה במאמר זה, וודא שיש לך:

  • PRTG מותקן ומוגדר
  • כל שרתי הרשת מוגדרים ב-PRTG
  • סקריפט PowerShell Send-AdhcResultToPrtg.ps1 שהורד מ-GitHub
  • כתובת ה-URL והפורט של חיישן PRTG שלך

אם יש לך את כל התנאים המוקדמים עשויים, אתה יכול לעקוב אחר ההוראות שלי לקביעת התוצאות של בדיקת הבריאות של AD אל PRTG.

  1. צור מכשיר ב-PRTG בשם Domain או בכל שם שתבחר.
  2. צור חיישן דחיפה HTTP מתקדם עם Token זהות של directory-adhealthcheck. שים לב שזה רגיש לתופסת האותיות!
  3. עבור כל מכשיר שרת הרשת ב-PRTG, צור חיישן דחיפה HTTP מתקדם אחד. עבור כל Token זיהוי, הוסף לכל חיישן סיומת -adhealthcheck כמו dc01-adhealthcheck.
  4. הוסף את תוכן קובץ ה- PowerShell ADHealthCheck-NoResult.ps1 לסוף קובץ ה- PowerShell Send-AdhcResultToPrtg.ps1 שכבר עסקנו בו.
  5. שנה את המשתנה $PRTGUrl לכתובת ה-URL ולפורט של החיישן שלך ב- PRTG.
  6. בצע את הסקריפט.

כאשר הריצה הושלמה, כעת יש לדחוף את מצב השגיאה שלך אל חיישני ה- PRTG שלך כפי שמוצג למטה.

PRTG sensors showing AD health

קביעת קרונות עבור סקריפט בדיקת הבריאות של Active Directory

מעקב אחר בריאות ה-AD הוא תהליך מתמשך. כדאי להריץ בדיקות בכל עת במקום בהתאם למקרים מסוימים. בואו נקבע את סקריפט בדיקת הבריאות של Active Directory לרוץ במרווחים קצרים.

הדרך הקלה ביותר לאוטומציה של בדיקות אלו היא על ידי הוספת הסקריפט למתזמן המשימות ולתת לו לרוץ בתחתית חשבון משתמש ב-AD או חשבון של Group-Managed Service Account.

שימוש בחשבון של Group Managed Service Account (gMSA) הוא הדרך המאובטחת יותר לביצוע משימות מתוזמנות אוטונומיות מאשר חשבונות מחשב מסוימים שיכולים לאחזר את הסיסמה מ- AD. אבל ייתכן כי חלק מהארגונים לא יהיו להם את היוקרה הזו.

יצירת חשבון משתמש ב-AD

בואו נפרק ראשית מה נדרש כדי להגדיר חשבון משתמש ב-AD לרוץ את המשימה המתוזמנת.

אם אתה מתכוון להפעיל משימה מתוזמנת כחשבון משתמש, בכל דרך, אל תפעיל אותה כחשבונך האישי! תיצור חשבון משתמש נפרד למטרה זו.

כדי לחסוך זמן, תראה סקריפט PowerShell למטה. זהו סקריפט דוגמה שאתה יכול להשתמש בו כדי ליצור חשבון משתמש AD שהוא חלק מקבוצת Domain Admins. תוכל להשתמש בחשבון זה להפעיל משימה מתוזמנת.

# שנה זאת ליחידת הארגונים של חשבונות השירות שלך
$OU = "OU=Service Accounts,DC=contoso,DC=com"
# שנה זאת לסיסמה שברצונך להשתמש בחשבון
$Password = "JägareTvå"
$SecureString = $Password | ConvertTo-SecureString -AsPlainText -Force
New-ADUser -Enabled $True -Path $OU -Name svcADHealthCheck -AccountPassword $SecureString
# הגבל את החשבון לשרתי הדומיין בלבד
$DomainControllers = (Get-ADDomainController -Filter *).Name

Set-ADAccount -Identity svcADHealthCheck -LogonWorkstations ($DomainControllers -Join ",")

# ייצור כמנהל דומיין (מצטער)
Add-ADGroupMember -Identity "Domain Admins" -Members svcADHealthCheck

יצירת חשבון של שירות מנוהל בקבוצה

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

יצירת מפתח שורש KDS

כדי ליצור חשבון gMSA להפעלת סקריפט בדיקת הבריאות AD, הוסף תחילה מפתח שורש KDS אם אין כבר לך. תוכל לבדוק אם יש לך מפתח שורש KDS על ידי הרצת הפקודה של PowerShell Get-KDSRootKey על שרת ראשי של הדומיין.

אם אין לך מפתח שורש KDS, ניתן ליצור אחד על ידי הרצת Add-KDSRootKey -EffectiveImmediately תחת חשבון משתמש שהוא חלק מקבוצת מנהלי הדומיין ב-AD בשרת בקרת דומיין 2012R2 או מאוחר יותר.

יש לשכפל את המפתח כדי שישפיע באופן מלא על שרתי הדומיין האחרים. מידע נוסף על תהליך זה ניתן למצוא ב-תיעוד של Microsoft.

יצירת ה- gMSA

לאחר יצירת מפתח שורש KDS, אתה מוכן ליצור את חשבון ה-gMSA בעזרת PowerShell. להלן דוגמה לתסריט שימושי ליצירת חשבון ה-gMSA המורשה רק לאימות משרת בקרת הדומיין בקבוצת מנהלי הדומיין.

# שינוי לדומיין שלך
$Domain = "contoso.com"

$AccountName = "svcadhealthcheck"

# יצירת GMSA בשם svcadhealthcheck (או במציאות svcadhealthcheck$) ואפשרות לקבוצת מנהלי הדומיין לאחזר את הסיסמה בלבד
New-ADServiceAccount $AccountName -DNSHostName "$AccountName.$Domain" –PrincipalsAllowedToRetrieveManagedPassword "Domain Controllers"

# הוספת ה-GMSA לקבוצת מנהלי הדומיין
# שים לב שאנו מוסיפים את החשבון לפי שמו האמיתי SamAccountName 'svcadhealthcheck$'
Add-ADGroupMember -Identity "Domain Admins" -Members "$AccountName`$"

התקנה ובדיקת ה-gMSA

עכשיו ה-gMSA נוצר, השלב האחרון הוא להתקין ולבדוק אותו על כל שרתי הרשת. דרך אחת לעשות זאת היא על ידי שימוש בפקודת ה-PowerShell Invoke-Command. למטה תראה סקריפט PowerShell שיתקין את ה-gMSA על כל שרתי ה-DCs ויבדוק שהוא עובד כראוי.

# זה ירוץ על כל שרתי הרשת
Invoke-Command -ComputerName (Get-ADDomainController -Filter *).Name -ScriptBlock {
    $Account = Get-ADServiceAccount -Filter { Name -eq 'svcadhealthcheck'}
    Install-ADServiceAccount $Account

    # בודק שה-gMSA עובד על המחשב
    # מחזיר $True אם הבדיקות תקינות
    $Test = Test-ADServiceAccount -Identity $Account.Name
    if($Test){
        Write-Output "GMSA test OK on $env:computername"
    }
    else {
        Write-Output "GMSA test FAILED on $env:computername"
    }

}

נתינת הרשאות ל-gMSA להרצת עבודה מצווה

כעת שה-gMSA מותקן, עכשיו עליך לתת לו הרשאה להריץ כמשימה מצווה על ה-DCs. החשבון צריך את הרשאה זו מאחר שהוא יפעל אוטונומית ברקע במשימה מתוזמנת.

ניתן להגדיר הרשאה זו דרך GPO קיים או על ידי יצירת GPO חדש וקישור אותו ל-OU של Domain Controllers. אם אין לך GPO קיים לשימוש, למטה תוכל לראות כמה צעדים שאפשר לקחת כדי ליצור אחד.

  1. הפעל את עורך המדיניות של קבוצה על שרת DC אחד.
  2. לחץ ימנית על OU של Domain Controllers ובחר צור GPO בדומיין זה וקשר אותו כאן.
  3. תן לו שם, למשל DC – התחברות כמשימה מצווה, או שם אחר שתעדיף
  4. לחץ ימנית על ה-GPO ובחר ערוך.
  5. עבור אל תצורת המחשב -> הגדרות Windows -> הגדרות אבטחה -> הזכויות של המשתמש.
  6. לחץ על מנתק שמאלי כנס כפועל הצטרפות ולחץ על מאפיינים.
  7. לחץ על הוסף משתמש או קבוצה
  8. לחץ על סוגי אובייקט, בחר רק חשבונות שירות ולחץ אישור
  9. חפש את חשבון השירות svcADHealthCheck שנוצר קודם, בחר אותו ולחץ אישור

עכשיו אתה אמור לראות את gMSA ברשימת האובייקטים AD כמו שמוצג למטה.

gMSA given rights to logon as a batch job

יצירת משימה מתוזמנת

עכשיו שיש לך חשבון שנוצר כדי להפעיל את המשימות המתוזמנות, אתה יכול כעת ליצור את המשימה המתוזמנת עצמה בשרת המחובר לדומיין שלך בבחירתך.

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

מתחת למתוך תמצא שני סקריפטים; שני הסקריפטים דומים אך אחד מניח חשבון משתמש AD והשני מניח gMSA. וודא שאתה משתמש בסקריפט המתאים לפי החשבון שאתה משתמש.

# החלף עם נתיב הקובץ שלך
$ScriptPath = "C:\Scripts\ADHealthCheck.ps1"
# החלף עם שם המשתמש שיצרת להרץ את המשימה
$UserName = "svdADHealthCheck"

# החלף עם הסיסמה שהגדרת למשתמש למעלה
$Password = "JägareTvå!"
# צור את הפעולה שמשדרת את הסקריפט
$Action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-ExecutionPolicy bypass -File '$ScriptPath'"
# צור את המחצית שמפעילה את המשימה
$Trigger = New-ScheduledTaskTrigger -Once -At "12:00" -RepetitionInterval (New-TimeSpan -Hours 12)
# צור הגדרות למשימה מתוזמנת
$Settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -StartWhenAvailable -RunOnlyIfNetworkAvailable -DontStopOnIdleEnd
# צור את המשימה המתוזמנת באמצעות splat לקריאות
$Splat = @{
    User = "$env:USERDOMAIN\$UserName"
    Password = $Password
    TaskName = "ADHealthCheck"
    Action = $Action
    Trigger = $Trigger
    RunLevel = "Highest"
    Settings = $Settings
}
Register-ScheduledTask @Splat
# החלף עם נתיב הקובץ שלך
$ScriptPath = "C:\Scripts\ADHealthCheck.ps1"
# החלף עם שם המשתמש שיצרת להרץ את המשימה
$UserName = "svdADHealthCheck$"
# צור את הפעולה שמשדרת את הסקריפט
$Action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-ExecutionPolicy bypass -File '$ScriptPath'"
# צור את המחצית שמפעילה את המשימה
$Trigger = New-ScheduledTaskTrigger -Once -At "12:00" -RepetitionInterval (New-TimeSpan -Hours 12)
# צור הגדרות למשימה מתוזמנת
$Settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -StartWhenAvailable -RunOnlyIfNetworkAvailable -DontStopOnIdleEnd

# צור את הראשי שמגדיר את GMSA
$Principal = New-ScheduledTaskPrincipal -UserID "$env:USERDOMAIN\$UserName" -LogonType Password -RunLevel Highest
# צור את המשימה המתוזמנת באמצעות splat לקריאות
$Splat = @{
    Principal = $Principal
    TaskName = "ADHealthCheck"
    Action = $Action
    Trigger = $Trigger
    RunLevel = "Highest"
    Settings = $Settings
}
Register-ScheduledTask @Splat

!אתה סיימת בכך שהמשימה המתוזמנת תופעל בתדירות המצוינת באחד מהסקריפטים למעלה

סיכום

שווה! אם יש לך נפילה עם כל הדרך מחלקה I, אתה צריך לדעת כעת שבריאות AD היא נושא עמוק. יש כל כך הרבה לנושא הזה שאפילו שני פוסטים בלוג ארוכים לא יכולים לכסות.

אך, כעת, יש לך מספיק ידע ומסגרת PowerShell מובנית שבה תוכל לחבר בדיקות בריאות נוספות של Active Directory כשהן עולות.

קריאה נוספת

Source:
https://adamtheautomator.com/active-directory-health-check-2/