Adam The Automator
dette er del II i en todelt serie om Active Directory-sundhedskontrol. Selvom det ikke er nødvendigt at læse, hvis du gerne vil lære, hvordan det Strømshell-script, du lærer om i denne artikel, blev bygget, opfordres du til at tjekke opbygning af et Active Directory-Sundhedstjekværktøj : del I.
i Del I lærte du, hvor mange forskellige flere tests, og hvorfor de er vigtige. Lad os nu trække dem alle sammen og bygge et værktøj. I denne del konverterer du alle de Active Directory-sundhedstjek, der er forklaret i del i, til en testramme. Du lærer også, hvordan du udsender resultater af forskellige ANNONCESUNDHEDSTJEK til værktøjer som Pester og et overvågningsværktøj kaldet PRTG.
hvis du vil følge med eller se en færdig version af det værktøj, du vil lære om i denne artikel, skal du hente adhealthcheck-NoResult.ps1 script fra GitHub.
Indholdsfortegnelse
definition af Output
at have en fælles objekttype og en nem måde at generere det på vil gøre det meget nemmere at konvertere testresultater til det valgte værktøj.
for at skabe et ensartet output til alle potentielle værktøjer har jeg valgt at bruge en Strømshell-klasse. Selvom det ikke kræves, er det den tilgang, jeg har valgt at tage her. Hovedpunktet er at sikre, at alle ANNONCESUNDHEDSKONTROLLER returnerer den samme type output.
en Strømshell-klasse er et skema, der definerer, hvordan et Kraftshell-objekt skal se ud, og hvad det skal gøre. Hver linje, du ser nedenfor, repræsenterer en egenskab, som objekterne returnerer. Du kan se nedenfor, Jeg planlægger på hver annonce sundhedstjek for at returnere ti ejendomme.
Class AdhcResult { $Source $TestName $Pass $Was $ShouldBe $Category $SubCategory $Message $Data ]$Tags}
for at fremskynde denne klasseoprettelse bruger jeg en hjælpefunktion kaldet Ny-AdhcResult. Denne funktion skaber klassen og alt hvad du skal følge med. Denne funktion udsender et brugerdefineret
type objekt.
kørsel af værktøjet ad Health Check
først skal du hente og kopiere scriptet til AD health check til en domænecontroller. Åbn den med ISE og kør den. Denne del af værktøjet returnerer ingen oplysninger.
THS script vil køre og gemme resultatet af hver check i $TestResults
variablen som flere objekter. Du vil bruge disse objekter senere til at generere rapporter eller udsende det i forskellige værktøjer. Hvis du holder sundhedstjekresultater i en variabel som denne, kan du tilføje flere resultater, hvis du vælger at oprette en anden og bruge kommandoen
New-AdHcResult
.
når scriptet er færdig med at køre, skal du nu have et komplet sæt AD health check-objekter gemt i variablen $TestResults
. Du kan nu køre $TestResults
fra konsollen og se de rå resultater.
visning af Annoncesundhedstjek resulterer i værktøjer
da alle kontroller er i en almindelig objekttype, kan du bedre inspicere dem gennem et par værktøjer som Pester og PRTG.
i dette afsnit lærer du, hvordan du opretter en HTML-rapport med et værktøj kaldet omfang og viser rapporten i PRTG.
oprettelse af en nUnit-fil med Pester
du skal først konvertere Kraftshellobjekterne i et format, som dine værktøjer kan forstå. De fleste værktøjer forstår HML eller, mere specifikt, nUnit HML. Dette er et format, som du kan importere til forskellige værktøjer til at vise resultater.
da du arbejder med Pester testing, skal du bruge pester testing-rammen til at læse output fra ad health check-scriptet og til at generere en NUnit-fil
Start med at hente den nyeste version af Pester. Du kan hente Pester ved at køre Install-Module
i en forhøjet konsol. Nedenstående kommando tvinger en installation af den nyeste Pester-version. Da udgivercertifikatet, som Pester er underskrevet med, leveres med vinduer 10, skal vi bruge parameteren SkipPublisherCheck
til at installere det.
PS51> Install-Module Pester -Force -Verbose -SkipPublisherCheck
når Pester er tilgængelig, kan du derefter køre scriptet og dynamisk oprette et sæt Pester-tests.
Bemærk: Du kan også oprette Pester Test dig selv uden selv at bruge Magtshell script jeg har givet.
nedenstående script vil bruge pester til at generere en nUnit-fil fra udgangen af variablen $TestResults
defineret i adhealthcheck-NoResult.ps1 scriptet.
Gem denne fil som Pester.ps1 i samme mappe som AD health check script.
# dot source in the ADHealthCheck file. $PSScriptRoot\ADHealthCheck-NoResult.ps1$Grouped = $TestResults | Group-Object CategoryForeach($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 } } } }}
endelig Kør Invoke-Pester
nedenfor for at påberåbe Pester.ps1 fil og Gem resultaterne i NUnitXml
format.
PS51 > Invoke-Pester -Script @{Path = '.\Pester.ps1'} -OutputFile .\NunitReport.xml -OutputFormat NUnitXml
opbygning af en HTML-rapport med Udvidelsesværktøjet
når du har filen NUnit, kan du nu bruge denne fil til at overføre til et værktøj, der kan konvertere det til HTML. Et af disse værktøjer kaldes omfang. Omfang er et praktisk værktøj til at oprette HTML-rapporter fra NUnit.
Hent først omfang til den samme mappe som NunitReport.fil oprettet tidligere. Udfør derefter følgende kommandoer i en Strømshell-session. Disse kommandoer opretter biblioteket til at gemme HTML-filerne og derefter udføre omfang.for at gøre konverteringen.
# Create report directoryPS51> mkdir .\HTMLReports# Create the reportPS51> .\extent.exe -i .\NunitReport.xml -o .\HTMLReports\
når du er færdig, finder du to HTML-filer i htmlreports-mappen. Disse filer ser ud som nedenstående skærmbilleder, du åbner dem med en netsøgemaskine.
indtagelse AD Health Check resultater i PRTG
PRTG er et populært overvågningsværktøj udviklet af Paessler, som du kan bruge til at overvåge din infrastruktur og tjenester. I dette afsnit lærer du, hvordan du skubber resultaterne af sundhedstjek til PRTG, når sundhedstjekscriptet er kørt.
Pushing resultater til PRTG tager mere arbejde i stedet for at have værktøjet pull oplysninger, men du vil i sidste ende se opsætningen er værd at bruge tid.
forudsætninger
for at kunne oprette PRTG som et overvågningsværktøj til AD health check script bygget i denne artikel, skal du være sikker på at du har:
- PRTG installeret og konfigureret
- alle domænecontrollere oprettet i PRTG
- Send-AdhcResultToPrtg.ps1 – script hentet fra GitHub
- URL ‘ en og porten til y0ur PRTG-sensor
hvis du har udført hver af forudsætningerne, kan du derefter følge nedenstående trinvise instruktioner om, hvordan jeg anbefaler at skubbe disse ANNONCESUNDHEDSTJEKRESULTATER til PRTG.
- Opret en enhed i PRTG kaldet domæne eller hvilket navn du foretrækker.
- Opret en avanceret HTTP push sensor med en IdentityToken af directory-adhealthcheck. Bemærk, at dette er store og små bogstaver!
- for hver domænecontrollerenhed i PRTG skal du oprette en avanceret HTTP push-sensor. For hver IdentityToken, tilføje hver sensor med-adhealthcheck såsom dc01-adhealthcheck.
- tilføj indholdet af Send-AdhcResultToPrtg.ps1-scriptet til slutningen af ADHealthCheck-NoResult.ps1-scriptet, vi har dækket.
- Skift variablen
$PRTGUrl
til URL og port på din PRTG-sensor. - Udfør scriptet.
når du er færdig, når ad health check-scriptet er afsluttet, skal det nu skubbe status til dine PRTG-sensorer som vist nedenfor.
planlægning af Active Directory Health Check Script
overvågning af AD health er en løbende proces. Du skal køre tests hele tiden i stedet for ad hoc-forekomster. Lad os planlægge Active Directory health check script til at køre med hyppige intervaller.
den nemmeste måde at automatisere disse kontroller på er ved at tilføje scriptet til opgaveplanlæggeren og lade det køre under en ANNONCEBRUGERKONTO eller en Gruppestyret servicekonto.
brug af en Group Managed Service-konto (Gmsa) er den mere sikre måde at udføre planlagte opgaver autonomt, da kun specificerede computerkonti, der kan hente adgangskoden fra AD. Men nogle organisationer har muligvis ikke denne luksus.
oprettelse af en ANNONCEBRUGERKONTO
lad os først nedbryde, hvad der kræves for at få en ANNONCEBRUGERKONTO konfigureret til at køre den planlagte opgave.
hvis du skal køre en planlagt opgave som brugerkonto, skal du ikke køre den som din egen konto! Opret altid en separat brugerkonto til dette formål.
for at spare tid tid, vil du se en Strømshell script nedenfor. Dette er et eksempel på et script, du kan bruge til at oprette en ANNONCEBRUGERKONTO, der er en del af gruppen domæneadministratorer. Du kan derefter bruge denne konto til at køre planlagt opgave med.
# Change this to the OU of your service accounts$OU = "OU=Service Accounts,DC=contoso,DC=com"# Change this to the password that you want to use for the account$Password = "JägareTvå"$SecureString = $Password | ConvertTo-SecureString -AsPlainText -ForceNew-ADUser -Enabled $True -Path $OU -Name svcADHealthCheck -AccountPassword $SecureString# Restrict account to only Domain Controllers$DomainControllers = (Get-ADDomainController -Filter *).NameSet-ADAccount -Identity svcADHealthCheck -LogonWorkstations ($DomainControllers -Join ",")# Making it Domain Admin (Sorry)Add-ADGroupMember -Identity "Domain Admins" -Members svcADHealthCheck
oprettelse af en Gruppestyret servicekonto
brug af en gMSA til at køre sundhedstjekket er lidt mere vanskeligt, hvis du ikke allerede bruger gMSA i dit miljø, men det er langt mere sikkert.
oprettelse af en KDS-rodnøgle
for at oprette en gmsa-konto for at køre scriptet AD health check, skal du først tilføje en KDS-rodnøgle, hvis du ikke allerede har en. Du kan kontrollere, om du har en KDS-rodnøgle ved at køre kommandoen Get-KDSRootKey
på en domænecontroller.
hvis du ikke har en KDS-rodnøgle, opretter du en ved at køre Add-KDSRootKey -EffectiveImmediately
under en brugerkontodel af annoncegruppen Domain Admins på en 2012R2 eller nyere domænecontroller.
nøglen skal replikere ud til de andre domænecontrollere for at få fuld effekt. Flere oplysninger om denne proces findes i Microsoft-dokumentationen.
oprettelse af gmsa
når KDS-rodnøglen er oprettet, er du klar til at oprette gmsa-kontoen med Strømshell. Nedenfor kan du se et eksempel script til at bruge til at oprette gmsa konto kun tilladt at godkende fra en domænecontroller i domæneadministratorer gruppe.
# Change to your domain$Domain = "contoso.com"$AccountName = "svcadhealthcheck"# Create a GMSA called svcadhealthcheck (or in reality svcadhealthcheck$) and allow only Domain Controllers to fetch the passwordNew-ADServiceAccount $AccountName -DNSHostName "$AccountName.$Domain" –PrincipalsAllowedToRetrieveManagedPassword "Domain Controllers"# Add the GMSA to Domain Admins# Note that we're adding the the account by it's true SamAccountName 'svcadhealthcheck$'Add-ADGroupMember -Identity "Domain Admins" -Members "$AccountName`$"
installation og test af gMSA
nu er gMSA oprettet, det sidste trin er at installere og teste det på alle domænecontrollere. En måde at gøre dette på er ved at bruge kommandoen Invoke-Command
. Nedenfor kan du se et script, der installerer gMSA på alle DC ‘ er og sikrer, at det fungerer korrekt.
# This will run on all Domain ControllersInvoke-Command -ComputerName (Get-ADDomainController -Filter *).Name -ScriptBlock { $Account = Get-ADServiceAccount -Filter { Name -eq 'svcadhealthcheck'} Install-ADServiceAccount $Account # Tests that the GMSA works on the computer # Returns $True if tests are OK $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" }}
at give gmsa tilladelse til at køre som et batchjob
når gMSA er installeret, skal du nu give den tilladelse til at køre som et batchjob på DCs. Kontoen har brug for denne ret, da den kører autonomt i baggrunden i en planlagt opgave.
du kan indstille denne tilladelse via en eksisterende GPO eller ved at oprette en ny GPO og linke den til domænecontrollere OU. Hvis du ikke allerede har en GPO at bruge, nedenfor er nogle trin, du kan tage for at oprette en.
- start Group Policy Editor på en DC.
- Højreklik på domænecontrollere OU og vælg Opret GPO i dette domæne og link Det her.
- navngiv det DC – Logon som batch eller et andet navn, du foretrækker
- Højreklik på GPO og klik på Rediger.
- gå til Computerkonfiguration –> vinduer indstillinger –> sikkerhedsindstillinger –> tildeling af brugerrettigheder.
- venstreklik Log på som batchjob, og klik på Egenskaber.
- Klik på Tilføj bruger eller gruppe.
- Klik på objekttyper, vælg kun servicekonti og klik på OK.
- Søg efter den svcADHealthCheck-servicekonto, der blev oprettet tidligere, vælg den og klik på OK.
du skal nu se gMSA under listen over ANNONCEOBJEKTER som vist nedenfor.
oprettelse af den planlagte opgave
nu hvor du har oprettet en konto til at køre de planlagte opgaver, kan du nu oprette selve den planlagte opgave på en domænetilsluttet server efter eget valg.
du kan oprette den planlagte opgave via GUI, men det er for meget at klikke! I stedet anbefaler jeg at oprette det med Magtshell. Hvorfor? Fordi du blot kan kopiere den kode, du ser nedenfor, og være færdig med den.
nedenfor finder du to scripts; begge scripts er ens, men den ene antager en ANNONCEBRUGERKONTO, og den anden antager en gMSA. Sørg for at bruge det relevante script baseret på hvilken konto du bruger.
# Replace with the path to your script$ScriptPath = "C:\Scripts\ADHealthCheck.ps1"# Replace with the username of the account that you created to run the task$UserName = "svdADHealthCheck"# Replace with the password that you set for above account$Password = "JägareTvå!"# Create the action that launches the script$Action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-ExecutionPolicy bypass -File '$ScriptPath'"# Create the trigger that starts the task$Trigger = New-ScheduledTaskTrigger -Once -At "12:00" -RepetitionInterval (New-TimeSpan -Hours 12)# Create settings for the scheduled task$Settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -StartWhenAvailable -RunOnlyIfNetworkAvailable -DontStopOnIdleEnd# Create the scheduled task using a splat for readability$Splat = @{ User = "$env:USERDOMAIN$UserName" Password = $Password TaskName = "ADHealthCheck" Action = $Action Trigger = $Trigger RunLevel = "Highest" Settings = $Settings}Register-ScheduledTask @Splat
# Replace with the path to your script$ScriptPath = "C:\Scripts\ADHealthCheck.ps1"# Replace with the username of the account that you created to run the task$UserName = "svdADHealthCheck$"# Create the action that launches the script$Action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-ExecutionPolicy bypass -File '$ScriptPath'"# Create the trigger that starts the task$Trigger = New-ScheduledTaskTrigger -Once -At "12:00" -RepetitionInterval (New-TimeSpan -Hours 12)# Create settings for the scheduled task$Settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -StartWhenAvailable -RunOnlyIfNetworkAvailable -DontStopOnIdleEnd# Create principal that defines the GMSA$Principal = New-ScheduledTaskPrincipal -UserID "$env:USERDOMAIN$UserName" -LogonType Password -RunLevel Highest# Create the scheduled task using a splat for readability$Splat = @{ Principal = $Principal TaskName = "ADHealthCheck" Action = $Action Trigger = $Trigger RunLevel = "Highest" Settings = $Settings}Register-ScheduledTask @Splat
du er færdig! På dette tidspunkt udføres den planlagte opgave med det interval, der er angivet i et af scripts ovenfor.
Resume
Puha! Hvis du har fulgt hele vejen fra Del I, skal du nu vide, at ANNONCESUNDHED er et dybt emne. Der er så meget til dette ene emne, at ikke engang to lange blogindlæg kunne dække.
men nu skal du have nok viden og en forudbygget strømramme, som du kan tilslutte andre Active Directory-sundhedstjek, når de opstår.
yderligere læsning
- nogle ting, du måske ikke ved om AD og Disaster Recovery
- Hvad gør DCDIAG faktisk… gøre?