Kopioi ja liitä tämä esimerkkikomentosarja ja muokkaa sitä tarpeen mukaan ympäristössäsi:
<# . SYNOPSIS Suojatun käynnistyksen tapahtumakokoelman ryhmäkäytäntöobjektin käyttöönottokomentosarja Ryhmäkäytäntöobjektin luominen ja linkittäminen kokoelman komentosarjan käyttöönottoa varten ajoitettuna tehtävänä
.DESCRIPTION Tämä komentosarja automatisoi suojatun käynnistyksen tapahtumakokoelman käyttöönoton ryhmäkäytäntö kautta.Se luo ryhmäkäytäntöobjektin, jossa on: – Ajoitettu tehtävä, joka suorittaa kokoelman komentosarjan päivittäin - Oikeat käyttöoikeudet kirjoittamiseen keskitettyihin jakoihin - WMI-suodattimet tiettyjen käyttöjärjestelmäversioiden kohdistamista varten
.PARAMETER GPOName Uuden ryhmäkäytäntöobjektin nimi
.PARAMETER DomainName Kohdetoimialueen täydellinen toimialuenime
.PARAMETER OUPath Ryhmäkäytäntöobjektin linkittämiseen liittyvien OU:iden tunnus.Hyväksyy useita OU:t matriisina. Ei pakollinen, jos -AutoDetectOU on määritetty.
.PARAMETER AutoDetectOU Siirry vuorovaikutteisesti luetteloon ja valitse OUs Active Directorysta.Kun tämä on määritetty, -OUPath on valinnainen.
.PARAMETER CollectionSharePath UNC-polku, johon kokoelman tulokset tallennetaan
.PARAMETER ScriptSourcePath Polku, johon kokoelman komentosarja on tallennettu (kopioidaan SYSVOL-tiedostoon)
.PARAMETER RandomDelayHours Tuntimäärä, jonka avulla komentosarjojen suoritus levitetään satunnaisesti päätepisteisiin.Tämä estää kaikkia koneita kirjoittamasta jaettuun resurssiin samanaikaisesti.Oletus: 4 tuntia. Kelvollinen alue: 1–24 tuntia. Suositellut arvot: - 1–10 000 laitetta: 4 tuntia (oletus) - 10K-50K-laitteet: 8 tuntia - yli 50 000 laitetta: 12–24 tuntia
.EXAMPLE .\Deploy-GPO-SecureBootCollection.ps1 -DomainName "contoso.com" -OUPath "OU=Workstations,DC=contoso,DC=com"
.EXAMPLE .\Deploy-GPO-SecureBootCollection.ps1 -DomainName "contoso.com" -OUPath "OU=Workstations,DC=contoso,DC=com" -RandomDelayHours 8
.EXAMPLE .\Deploy-GPO-SecureBootCollection.ps1 -DomainName "contoso.com" -AutoDetectOU Näyttää kaikki toimialueen OU:t ja pyytää valintaa.
.EXAMPLE .\Deploy-GPO-SecureBootCollection.ps1 -DomainName "contoso.com" -OUPath @("OU=Workstations,DC=contoso,DC=com", "OU=Laptops,DC=contoso,DC=com") Linkittää ryhmäkäytäntöobjektin useisiin alkuperäisiin käyttäjiin yhdellä kertaa.
.NOTES Edellyttää: Active Directory PowerShell -moduuli, ryhmäkäytäntö-moduuli On suoritettava toimialueen Hallinta tai delegoiduilla ryhmäkäytäntöobjektin luontioikeuksilla #>
[CmdletBinding()] param( [Parameter(Mandatory = $false)] [merkkijono]$GPOName = "SecureBoot-EventCollection", [Parametri(Pakollinen = $false)] [merkkijono]$DomainName, [Parametri(Pakollinen = $false)] [merkkijono[]]$OUPath, [Parametri(Pakollinen = $false)] [switch]$AutoDetectOU, [Parameter(Mandatory = $false)] [string]$CollectionSharePath = "\\$DomainName\NETLOGON\SecureBootLogs", [Parametri(Pakollinen = $false)] [merkkijono]$ScriptSourcePath = ".\Detect-SecureBootCertUpdateStatus.ps1", [Parametri(Pakollinen = $false)] [ValidateSet("Daily", "Weekly", "AtStartup")] [merkkijono]$Schedule = "Päivittäin", [Parametri(Pakollinen = $false)] [merkkijono]$ScheduleTime = "14:00", [Parameter(Mandatory = $false)] [ValidateRange(1, 24)] [int]$RandomDelayHours = 4 )
#Requires -Modules ActiveDirectory, GroupPolicy #Requires -versio 5.1
$ErrorActionPreference = "Stop" $DownloadUrl = "https://aka.ms/getsecureboot" $DownloadSubPage = Käyttöönotto- ja valvontanäytteet
# ============================================================================ # DEPENDENCY VALIDATION # ============================================================================
function Test-ScriptDependencies { param( [Parametri(Pakollinen = $true)] [merkkijono]$ScriptDirectory, [Parametri(Pakollinen = $true)] [merkkijono[]]$RequiredScripts ) $missingScripts = @() foreach ($script in $RequiredScripts) { $scriptPath = Join-Path $ScriptDirectory $script if (-not (Test-Path $scriptPath)) { $missingScripts += $script } } if ($missingScripts.Count -gt 0) { Write-Host "" Write-Host ("=" * 70) -EtualallaColor Punainen Write-Host " PUUTTUVAT RIIPPUVUUDET" -EtualallaColor Punainen Write-Host ("=" * 70) -EtualallaColor Punainen Write-Host "" Write-Host "Seuraavia pakollisia komentosarjoja ei löytynyt:" -EtualallaVäri keltainen foreach ($script in $missingScripts) { Write-Host " - $script" -Edustaväri Valkoinen } Write-Host "" Write-Host "Lataa uusimmat komentosarjat kohteesta:" -ForegroundColor Cyan Write-Host "URL: $DownloadUrl" -Edustaväri Valkoinen Write-Host " Siirry kohteeseen: '$DownloadSubPage'" -Edustaväri Valkoinen Write-Host "" Write-Host "Pura kaikki komentosarjat samaan hakemistoon ja suorita uudelleen". -ForegroundColor Yellow Write-Host "" palauta $false } palauta $true }
# The Detect script is required - it gets deployed to endpoints via GPO $requiredScripts = @( "Detect-SecureBootCertUpdateStatus.ps1" )
if (-not (Test-ScriptDependencies -ScriptDirectory $PSScriptRoot -RequiredScripts $requiredScripts)) { exit 1 }
# ============================================================================ # TUNNISTA TOIMIALUEEN NIMI AUTOMAATTISESTI # ============================================================================
if (-not $DomainName) { $DomainName = $env:USERDNSDOMAIN jos (ei $DomainName) { # Yritä päästä AD-moduulista kokeile { Import-Module ActiveDirectory -ErrorAction Stop $DomainName = (Get-ADDomain). DNSRoot } saalis { Write-Host "VIRHE: toimialueen nimeä ei voitu tunnistaa automaattisesti". -Edustaväri Punainen Write-Host "Please specify -DomainName parameter". -ForegroundColor Yellow Write-Host "" Write-Host "Esimerkki:" -EdustaVäri harmaa Write-Host ".\Deploy-GPO-SecureBootCollection.ps1 -DomainName contoso.com -AutoDetectOU" -ForegroundColor White exit 1 } } Write-Host "Automaattisesti tunnistettu toimialue: $DomainName" -EdustaväriVäri vihreä }
# Set CollectionSharePath default if not explicitly provided if (-not $PSBoundParameters.ContainsKey('CollectionSharePath')) { $CollectionSharePath = "\\$DomainName\NETLOGON\SecureBootLogs" }
Write-Host "============================================" -ForegroundColor Cyan Write-Host "Secure Boot Collection - GPO Deployment" -ForegroundColor Cyan Write-Host "============================================" -Edustavärisyan
# Validate prerequisites Write-Host "'n[1/6] Validing prerequisites..." -ForegroundColor Yellow
if (-not (Get-Module -ListAvailable -Name ActiveDirectory)) { heitä "ActiveDirectory-moduulia ei löydy. Asenna RSAT-työkalut." }
if (-not (Get-Module -ListAvailable -Name GroupPolicy)) { heitä "GroupPolicy-moduulia ei löydy. Asenna RSAT-työkalut." }
Import-Module ActiveDirectory Import-Module GroupPolicy
# Validate domain connectivity kokeile { $domain = Get-ADDomain -Server $DomainName Write-Host " Yhdistetty toimialueeseen: $($domain. DNSRoot)" -ForegroundColor Green } saalis { kirjoita "Toimialueeseen ei voi muodostaa yhteyttä: $DomainName. Virhe: $_" }
# Handle OU selection jos ($AutoDetectOU) { Write-Host "'n Discovering OUs in domain..." -ForegroundColor Cyan $allOUs = Get-ADOrganizationalUnit -Filter * -Server $DomainName | Sort-Object DistinguishedName | Select-Object @{N='Indeksi'; E={0}}, Nimi, DistinguishedName # Määritä indeksit kohteelle ($i = 0; $i -lt $allOUs.Count; $i++) { $allOUs[$i]. Indeksi = $i + 1 } Write-Host "'n Available OUs:" -ForegroundColor Yellow Write-Host " ---------------------------------------------------------------------" -Edustaväri TummaGray $allOUs | ForEach-Object { Write-Host (" {0,3}) {1}" -f $_. Indeksi, $_. DistinguishedName) -ForegroundColor White } Write-Host "---------------------------------------------------------------------" -ForegroundColor DarkGray Write-Host " Vihje: Kirjoita pilkuilla erotetut numerot useiden OU:iden valitsemiseksi (esim. 1,3,5)" -EtualallaColor DarkGray Write-Host " Enter 'A', jos haluat valita KAIKKI OU:t" -EtualallaColor DarkGray Write-Host "" $selection = Read-Host " Linkitä ryhmäkäytäntöobjekti valitsemalla OU(t) jos ($selection -eq 'A' -tai $selection -eq 'a') { $OUPath = $allOUs.DistinguishedName Write-Host " Selected ALL $($OUPath.Count) OUs" -ForegroundColor Green } muu { $indices = $selection -split ',' | ForEach-Object { [int]$_. Trim() } $OUPath = @() foreach ($idx in $indices) { $selected = $allOUs | Where-Object { $_. Index -eq $idx } jos ($selected) { $OUPath += $selected. DistinguishedName } muu { Write-Warning "Virheellinen indeksi: $idx – ohittaminen" } } } jos ($OUPath.Count -eq 0) { heitä "Ei OU:ita valittuna. Keskeytetään." } Write-Host "'n Valittu $($OUPath.Count) OU(t):" -EtualallaColor Green $OUPath | ForEach-Object { Write-Host " - $_" -ForegroundColor Gray } } elseif (ei $OUPath -tai $OUPath.Count -eq 0) { kirjoita "Joko -OUPath tai -AutoDetectOU on määritettävä.". } muu { # Vahvista, että jokainen OU on olemassa foreach ($path in $OUPath) { kokeile { $ou = Get-ADOrganizationalUnit -Identity $path -Server $DomainName Write-Host " Target OU found: $($ou. Nimi)" -EdustaVäri vihreä } saalis { heitä "OU ei löydy: $path" } } }
# Validate source script exists if (-not (Test-Path $ScriptSourcePath)) { heitä "Kokoelman komentosarjaa ei löydy: $ScriptSourcePath" }
# Step 2: Create collection share structure Write-Host "'n[2/6] Kokoelmaresurssin määrittäminen..." -EtualallaColor Keltainen
$sysvolScriptPath = "\\$DomainName\SYSVOL\$DomainName\Scripts\SecureBootCollection"
# Create SYSVOL script folder if (-not (Test-Path $sysvolScriptPath)) { New-Item -ItemType Directory -Path $sysvolScriptPath -Force | Out-Null Write-Host " Created SYSVOL script folder: $sysvolScriptPath" -ForegroundColor Green }
# Copy collection script to SYSVOL $destScript = Join-Path $sysvolScriptPath "Detect-SecureBootCertUpdateStatus.ps1"
# Remove existing destination if it's a directory (fix for Copy-Item bug) if (Test-Path $destScript -PathType Container) { Remove-Item $destScript -Recurse -Force }
Copy-Item -Path $ScriptSourcePath -Destination $destScript -Force Write-Host " Kopioitu kokoelman komentosarja SYSVOL:iin" -EtualallaColor Green
# Create a wrapper script that calls the main script with parameters $wrapperScript = @" # Suojatun käynnistyksen tapahtumakokoelman rivitys # Deploy-GPO-SecureBootCollection.ps1 automaattisesti luoma
`$ErrorActionPreference = 'SilentlyContinue'
# Configuration '$CollectionShare = '$CollectionSharePath' '$ScriptPath = '$sysvolScriptPath\Detect-SecureBootCertUpdateStatus.ps1'
# Run collection with -OutputPath parameter if (Test-Path '$ScriptPath) { & $ScriptPath -OutputPath -$CollectionShare } muu { Write-EventLog -LogName Application -Source "SecureBootCollection" -EventId 1001 -EntryType Error -Message "Collection script not found: '$ScriptPath' } " @
$wrapperPath = Join-Path $sysvolScriptPath "Run-SecureBootCollection.ps1" $wrapperScript | Out-File -FilePath $wrapperPath -Encoding UTF8 -Force Write-Host " Luotu rivityskomentosarja" -EdustaväriVäri vihreä
# Create collection share (if on a file server) Write-Host " Kokoelman jakamispolku: $CollectionSharePath" -EtualallaVärisyan Write-Host " HUOMAUTUS: Varmista, että tämä jako on olemassa toimialueen tietokoneiden kirjoitusoikeuden kanssa" -ForegroundColor Yellow
# Step 3: Create the GPO Write-Host "'n[3/6] Creating ryhmäkäytäntö Object..." -ForegroundColor Yellow
# Check if GPO already exists $existingGPO = Get-GPO -Name $GPOName -Domain $DomainName -ErrorAction SilentlyContinue
if ($existingGPO) { Write-Host ryhmäkäytäntöobjektin $GPOName on jo olemassa. Päivitetään..." -EtualallaColor Keltainen $gpo = $existingGPO } muu { $gpo = New-GPO -Name $GPOName -Domain $DomainName -Comment "Deploys Secure Boot event collection script to endpoints" Write-Host " Luotu ryhmäkäytäntöobjekti: $GPOName" -EtualallaColor Green }
# Step 4: Configure Scheduled Task via GPO Preferences Write-Host "'n[4/6] Ajoitetun tehtävän määrittäminen..." -EtualallaColor Keltainen
# Build the scheduled task XML # RandomDelay levittää suoritusta päätepisteisiin palvelimen ylikuormituksen estämiseksi Write-Host " Satunnainen viive: $RandomDelayHours tuntia (levittää kuormitusta kalustoon)" -EtualallaColor Cyan
$taskTrigger = switch ($Schedule) { "Päivittäin" { @" <CalendarTrigger> <StartBoundary>2024-01-01T${ScheduleTime}:00</StartBoundary> <Käytössä>tosi</Käytössä> <ScheduleByDay> <DaysInterval>1</DaysInterval> </ScheduleByDay-> <RandomDelay>PT${RandomDelayHours}H</RandomDelay> </CalendarTrigger> "@ } "Viikoittain" { @" <CalendarTrigger> <StartBoundary>2024-01-01T${ScheduleTime}:00</StartBoundary> <Käytössä>tosi</Käytössä> <ScheduleByWeek> <WeeksInterval>1</WeeksInterval> <DaysOfWeek> <keskiviikko /> </DaysOfWeek> </ScheduleByWeek> <RandomDelay>PT${RandomDelayHours}H</RandomDelay> </CalendarTrigger> "@ } "AtStartup" { # Käynnistyskäynnistimiä varten lisää satunnainen alkamisaika viiveellä # Jokainen kone käynnistyy 5–(5 + RandomDelayHours*60) minuutin kuluttua käynnistyksen jälkeen $maxDelayMinutes = 5 + ($RandomDelayHours * 60) @" <BootTrigger> <Käytössä>tosi</Käytössä> <viive>PT5M</Delay> <RandomDelay>PT${RandomDelayHours}H</RandomDelay> </BootTrigger> "@ } }
$scheduledTaskXML = @" <?xml version="1.0" encoding="UTF-16"?> <Tehtävän versio="1.4" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"> <RegistrationInfo> <kuvaus>kerää suojatun käynnistyksen tapahtumatiedot yrityksen väestönlaskentaa varten</Description> <Author>Enterprise Security</Author> </RegistrationInfo> <käynnistää> $taskTrigger </Triggers> <principals> <Principal id="Author"> <UserId>S-1-5-18</UserId> <RunLevel>HighestAvailable</RunLevel> </Principal> </Principals> <Asetukset-> <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy> <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries> <StopIfGoingOnBatteries>false</StopIfGoingOnBatteries> <AllowHardTerminate>tosi</AllowHardTerminate> <AloitusValintojen>tosi</StartWhenAvailable> <RunOnlyIfNetworkAvailable>true</RunOnlyIfNetworkAvailable> <IdleSettings> <StopOnIdleEnd>false</StopOnIdleEnd> <RestartOnIdle>false</RestartOnIdle> </IdleSettings-> <AllowStartOnDemand>tosi</AllowStartOnDemand> <Käytössä>tosi</Käytössä> <Piilotettu>epätosi</Piilotettu> <RunOnlyIfIdle>false</RunOnlyIfIdle> <DisallowStartOnRemoteAppSession>false</DisallowStartOnRemoteAppSession> <UseUnifiedSchedulingEngine>true</UseUnifiedSchedulingEngine> <WakeToRun>epätosi</WakeToRun> <ExecutionTimeLimit>PT1H</ExecutionTimeLimit> <Prioriteetti>7</Priority> </Settings> <Toiminnot Context="Tekijä"> <Exec> <Komento>powershell.exe</Komento-> <argumentit>-NoProfile -ExecutionPolicy Bypass -File "$wrapperPath"</Arguments> </Exec> </Actions> </Task> " @
# Save task XML to SYSVOL for reference/backup $taskXmlPath = Join-Path $sysvolScriptPath "SecureBootCollection-Task.xml" $scheduledTaskXML | Out-File -FilePath $taskXmlPath -Koodaus Unicode -Force Write-Host " Tallennettu ajoitettu tehtävän XML SYSVOL-muotoon (varmuuskopiointi)" -EdustaväriVäri vihreä
# Inject scheduled task into GPO Preferences Write-Host " Ajoitetun tehtävän lisääminen ryhmäkäytäntöobjektiasetuksiin..." -EtualallaColor Cyan
$gpoId = $gpo.Id.ToString() $gpoPrefPath = "\\$DomainName\SYSVOL\$DomainName\Policies\{$gpoId}\Machine\Preferences\ScheduledTasks"
# Create Preferences folder structure if (-not (Test-Path $gpoPrefPath)) { New-Item -ItemType Directory -Path $gpoPrefPath -Force | Out-Null }
# Generate unique GUID for the task $taskGuid = [guid]::NewGuid(). ToString("B"). Toupper()
# Build GPO Preferences ScheduledTasks.xml format # Tämä eroaa tehtävien ajoituksen XML-vakiomuodosta – se on GPP-muoto $gppScheduledTasksXml = @" <?xml version="1.0" encoding="utf-8"?> <ScheduledTasks clsid="{CC63F200-7309-4ba0-B154-A71CD118DBCC}"> <TaskV2 clsid="{D8896631-B747-47a7-84A6-C155337F3BC8}" name="SecureBoot-EventCollection" image="0" changed="$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')" uid="$taskGuid" userContext="0" removePolicy="0"> <Ominaisuudet-toiminto="C" name="SecureBoot-EventCollection" runAs="NT AUTHORITY\System" logonType="S4U"> <Tehtävän versio="1.3"> <RegistrationInfo> <Author>Enterprise Security</Author> <kuvaus>kerää suojatun käynnistyksen varmenteen tilan yrityksen vaatimustenmukaisuuden valvontaa varten</Description> </RegistrationInfo> <principals> <Principal id="Author"> <UserId>NT AUTHORITY\System</UserId> <LogonType>S4U</LogonType> <RunLevel>HighestAvailable</RunLevel> </Principal> </Principals> <Asetukset-> <IdleSettings> <Kesto>PT10M</Duration> <WaitTimeout>PT1H</WaitTimeout> <StopOnIdleEnd>false</StopOnIdleEnd> <RestartOnIdle>false</RestartOnIdle> </IdleSettings-> <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy> <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries> <StopIfGoingOnBatteries>false</StopIfGoingOnBatteries> <AllowHardTerminate>tosi</AllowHardTerminate> <AloitusValintojen>tosi</StartWhenAvailable> <RunOnlyIfNetworkAvailable>true</RunOnlyIfNetworkAvailable> <AllowStartOnDemand>tosi</AllowStartOnDemand> <Käytössä>tosi</Käytössä> <Piilotettu>epätosi</Hidden> <RunOnlyIfIdle>false</RunOnlyIfIdle> <WakeToRun>epätosi</WakeToRun> <ExecutionTimeLimit>PT1H</ExecutionTimeLimit> <Prioriteetti>7</Priority> </Settings> <käynnistää> $taskTrigger </Triggers> <Toiminnot Context="Tekijä"> <Exec> <Komento>powershell.exe</Komento> <argumentit>-NoProfile -ExecutionPolicy Bypass -File "$wrapperPath"</Arguments> </Exec> </Actions> </Task> </Properties> </TaskV2> </ScheduledTasks> " @
# Write GPP ScheduledTasks.xml to GPO $gppXmlPath = Join-Path $gpoPrefPath "ScheduledTasks.xml" $gppScheduledTasksXml | Out-File -FilePath $gppXmlPath -Encoding UTF8 -Force Write-Host " [OK] Ajoitettu tehtävä lisätty ryhmäkäytäntöobjektiin" -EtualallaColor Green Write-Host " Tehtävien aikataulu: $Schedule $ScheduleTime $RandomDelayHours tunnin satunnaisviiveellä" -Edustaväri Harmaa
# Step 5: Link GPO to OU(s) Write-Host "'n[5/6] Linking GPO to OU(s)..." -ForegroundColor Yellow
$linkedCount = 0 $skippedCount = 0
foreach ($targetOU in $OUPath) { $existingLink = Get-GPInheritance -Target $targetOU -Domain $DomainName | Select-Object -ExpandProperty GpoLinks | Where-Object { $_. DisplayName -eq $GPOName }
if (-not $existingLink) { New-GPLink -Name $GPOName -Target $targetOU -Domain $DomainName -LinkEnabled Yes | Out-Null Write-Host " [OK] Linkitetty: $targetOU" -EtualallaColor Green $linkedCount++ } muu { Write-Host " - Jo linkitetty: $targetOU" -Edustaväri Keltainen $skippedCount++ } }
Write-Host "`n Summary: $linkedCount new links, $skippedCount already existed" -ForegroundColor Cyan
# Step 6: Create WMI Filter (optional - for Windows 10/11 only) Write-Host "'n[6/6] Creating WMI filter..." -ForegroundColor Yellow
$wmiFilterName = "Windows 10 and 11 Workstations" $wmiQuery = 'SELECT * FROM Win32_OperatingSystem WHERE Version LIKE "10.%" AND ProductType = "1"'
Write-Host @" [HUOMAUTUS] VALINNAINEN: WMI-suodattimen luominen GPMC:ssä Suodattimen nimi: $wmiFilterName Kysely: $wmiQuery Tämä suodattaa ryhmäkäytäntöobjektin niin, että se koskee vain Windows 10/11-työasemia.
"@ -ForegroundColor Yellow
# Summary Write-Host "'n============================================" -Edustavärisyan Write-Host "DEPLOYMENT COMPLETE" -ForegroundColor Green Write-Host "============================================" -EdustaVärisyan Write-Host @"
Summary: - Ryhmäkäytäntöobjektin nimi: $GPOName - Target OU: $OUPath - Kokoelman jakaminen: $CollectionSharePath - Komentosarjan sijainti: $sysvolScriptPath - Aikataulu: $Schedule $ScheduleTime
Next Steps: 1. Jaetun kokoelman luominen oikeilla käyttöoikeuksilla: - Jaa: $CollectionSharePath - Käyttöoikeudet: toimialueen tietokoneet (kirjoitus), toimialueen järjestelmänvalvojat (täydet)
2. Complete the scheduled task configuration in GPMC (see instructions above)
3. Run 'gpupdate /force' on a test machine to verify deployment
4. Monitor collection results in: $CollectionSharePath
5. Run aggregation script to generate reports: .\Aggregate-SecureBootData.ps1 -InputPath "$CollectionSharePath"
"@ -ForegroundColor White