Skopiuj i wklej ten przykładowy skrypt i zmodyfikuj go zgodnie z potrzebami środowiska:

<# . STRESZCZENIE     Wdraża pakiet aranżacji bezpiecznego rozruchu jako zadanie zaplanowane w systemie Windows.

.DESCRIPTION     Tworzy zaplanowane zadanie, które uruchamia aranżacji nieprzerwanie w tle.Zadanie jest uruchamiane z zasadami obejścia wykonywania, więc nie są wyświetlane monity o zabezpieczenia.     Aranżator:     - Ankieta dotycząca aktualizacji urządzenia w określonym interwale     - Automatycznie generuj fale i wdrażaj obiekty GPO     - Kontynuuj do momentu zaktualizowania      wszystkich kwalifikujących się urządzeń     Monitorowanie postępu przy użyciu: Get-SecureBootRolloutStatus.ps1

.PARAMETER AggregationInputPath     Ścieżka UNC do danych urządzenia JSON (z gpo wykrywania)

.PARAMETER ReportBasePath     Ścieżka lokalna dla raportów i plików województwo

.PARAMETER TargetOU     OU do połączenia obiektów GPO (opcjonalnie — domyślnie do katalogu głównego domeny)

.PARAMETER PollIntervalMinutes     Minuty między sprawdzaniem stanu. Wartość domyślna: 30

.PARAMETER UseWinCS     Użyj wincs (system konfiguracji systemu Windows) zamiast AvailableUpdatesPolicy GPO.Po włączeniu wdraża WinCsFlags.exe zaplanowane zadanie w punktach końcowych zamiast w obiektach zasad grupy rejestru.

.PARAMETER WinCSKey     Klucz WinCS do konfiguracji bezpiecznego rozruchu. Domyślne: F33E0C8E002

.PARAMETER ServiceAccount     Konto do uruchomienia zadania. Domyślne: SYSTEM     W przypadku operacji na domenach użyj konta usługi administratora domeny.

.PARAMETER ScriptPath     Ścieżka do skryptu aranżacji. Domyślne: Ten sam folder co ten skrypt.

.PARAMETER Uninstall     Usuwanie zaplanowanego zadania

.EXAMPLE     .\Deploy-OrchestratorTask.ps1 -AggregationInputPath "\\server\SecureBootData$" -ReportBasePath "C:\SecureBootReports" -ServiceAccount "DOMAIN\svc_secureboot"

.EXAMPLE     .\Deploy-OrchestratorTask.ps1 -AggregationInputPath "\\server\SecureBootData$" -ReportBasePath "C:\SecureBootReports"

.EXAMPLE     # Wdrażanie przy użyciu metody WinCS zamiast AvailableUpdatesPolicy     .\Deploy-OrchestratorTask.ps1 -AggregationInputPath "\\server\SecureBootData$" -ReportBasePath "C:\SecureBootReports" -UseWinCS

.EXAMPLE     .\Deploy-OrchestratorTask.ps1 - Odinstaluj #>

[CmdletBinding()] param(     [Parameter(Mandatory = $false)]     [ciąg]$AggregationInputPath,     [Parameter(Mandatory = $false)]     [ciąg]$ReportBasePath,     [Parameter(Mandatory = $false)]     [ciąg]$TargetOU,     [Parameter(Mandatory = $false)]     [int]$PollIntervalMinutes = 30,     [Parameter(Mandatory = $false)]     [switch]$UseWinCS,     [Parameter(Mandatory = $false)]     [string]$WinCSKey = "F33E0C8E002",     [Parameter(Mandatory = $false)]     [string]$ServiceAccount = "SYSTEM",     [Parameter(Mandatory = $false)]     [ciąg]$ScriptPath,     [Parameter(Mandatory = $false)]     [switch]$Uninstall )                                        

$ErrorActionPreference = "Stop" $TaskName = "SecureBoot-Rollout-Orchestrator" $DownloadUrl = "https://aka.ms/getsecureboot" $DownloadSubPage = "Próbki wdrażania i monitorowania"

# ============================================================================ # SPRAWDZANIE POPRAWNOŚCI ZALEŻNOŚCI # ============================================================================

function Test-ScriptDependencies {     <#     . STRESZCZENIE         Sprawdza, czy są dostępne wszystkie wymagane skrypty.. OPIS         Sprawdza wymagane współzależności skryptów i udostępnia instrukcje pobierania, jeśli ich brakuje.#>     param(         [Parameter(Mandatory = $true)]         [ciąg]$ScriptDirectory,                  [Parameter(Mandatory = $true)]         [string[]]$RequiredScripts     )          $missingScripts = @()          foreach ($script w $RequiredScripts) {         $scriptPath = Join-Path $ScriptDirectory $script         if (-not (Test-Path $scriptPath)) {             $missingScripts += $script         }     }          if ($missingScripts.Count -gt 0) {         Write-Host ""         Write-Host ("=" * 70) -Pierwszy planKolor czerwony         Write-Host "MISSING DEPENDENCIES" -ForegroundColor Red         Write-Host ("=" * 70) -Pierwszy planKolor czerwony         Write-Host ""         Write-Host "Nie znaleziono następujących wymaganych skryptów:" -ForegroundColor Yellow         foreach ($script w $missingScripts) {             Write-Host " - $script" -ForegroundColor White         }         Write-Host ""         Write-Host "Proszę pobrać najnowsze skrypty z:" -ForegroundColor Cyan         adres URL Write-Host ": $DownloadUrl" -ForegroundColor White         Write-Host " Przejdź do: '$DownloadSubPage'" -ForegroundColor White         Write-Host ""         Write-Host "Wyodrębnij wszystkie skrypty do tego samego katalogu i uruchom ponownie". -Kolor pierwszego planu Żółty         Write-Host ""         $false zwrotu     }          $true zwrotu }

# Required scripts for orchestrator deployment $requiredScripts = @(     "Start-SecureBootRolloutOrchestrator.ps1",     "Aggregate-SecureBootData.ps1",     "Deploy-GPO-SecureBootCollection.ps1",     "Detect-SecureBootCertUpdateStatus.ps1",     "Get-SecureBootRolloutStatus.ps1",     "Enable-SecureBootUpdateTask.ps1" )

if (-not (Test-ScriptDependencies -ScriptDirectory $PSScriptRoot -RequiredScripts $requiredScripts)) {     wyjdź 1 }

# ============================================================================ # ODINSTALUJ # ============================================================================

if ($Uninstall) {     Write-Host ""     Write-Host "Usuwanie zaplanowanego zadania: $TaskName" —Kolor pierwszego planu— żółty     $existingTask = Get-ScheduledTask -TaskName $TaskName -ErrorAction SilentlyContinue     if ($existingTask) {         Stop-ScheduledTask -TaskName $TaskName -ErrorAction SilentlyContinue         Unregister-ScheduledTask —Nazwa_zadania $TaskName -Confirm:$false         Write-Host "Zadanie zostało pomyślnie usunięte". -Pierwszy planColor Green     } inaczej {         Write-Host "Nie można odnaleźć zadania". -Pierwszy planColor Gray     }     wyjdź 0 }     

# ============================================================================ # SPRAWDZANIE POPRAWNOŚCI # ============================================================================

if (-not $AggregationInputPath -or -not $ReportBasePath) {     Write-Host "ERROR: -AggregationInputPath and -ReportBasePath are required." -ForegroundColor Red     Write-Host ""     Write-Host "Example:" -ForegroundColor Yellow     Write-Host ' .\Deploy-OrchestratorTask.ps1 -AggregationInputPath "\\server\SecureBootData$" -ReportBasePath "C:\SecureBootReports"'     wyjdź 1 }

# Find orchestrator script if (-nie $ScriptPath) {     $ScriptPath = Join-Path $PSScriptRoot "Start-SecureBootRolloutOrchestrator.ps1" }

if (-not (Test-Path $ScriptPath)) {     Write-Host "ERROR: Orchestrator script not found: $ScriptPath" -ForegroundColor Red     wyjdź 1 }

# Find aggregation script (needed by orchestrator) $aggregateScript = Join-Path $PSScriptRoot "Aggregate-SecureBootData.ps1" if (-not (Test-Path $aggregateScript)) {     Write-Host "OSTRZEŻENIE: Aggregate-SecureBootData.ps1 nie można odnaleźć w katalogu skryptów" — Kolor pierwszego planu Żółty     Write-Host " Orchestrator may fail if it cannot find this script." -ForegroundColor Yellow }

Write-Host "" Write-Host ("=" * 70) -Pierwszy planColor Cyan Write-Host " Secure Boot Rollout Orchestrator - Task Deployment" -ForegroundColor Cyan Write-Host ("=" * 70) -Pierwszy planColor Cyan Write-Host ""

# For display, show relative paths (script names only) $displayScriptPath = Split-Path $ScriptPath -Liść

Write-Host "Configuration:" -ForegroundColor Yellow Write-Host " Nazwa zadania: $TaskName" Write-Host " Orchestrator: $displayScriptPath" Write-Host " Ścieżka wprowadzania: $AggregationInputPath" Write-Host " Ścieżka raportu: $ReportBasePath" Write-Host " Target OU: $(if ($TargetOU) { $TargetOU } else { '(domain root)' })" Write-Host " Interwał ankiety: $PollIntervalMinutes minut" Write-Host " Konto usługi: $ServiceAccount" Write-Host " Metoda wdrażania: $(if ($UseWinCS) { "WinCS (WinCsFlags.exe)" } inaczej { "AvailableUpdatesPolicy (GPO)" })" if ($UseWinCS) {     Write-Host " Klucz WinCS: $WinCSKey" } Write-Host ""

# ============================================================================ # WYKRYWANIE GPO — AUTOMATYCZNE WDRAŻANIE, JEŚLI NIE MA # ============================================================================

$CollectionGPOName = "SecureBoot-EventCollection" $deployGpoScript = Join-Path $PSScriptRoot "Deploy-GPO-SecureBootCollection.ps1"

# Check if GroupPolicy module is available if (Get-Module -ListAvailable -Name GroupPolicy) {     Import-Module GroupPolicy —ErrorAction SilentlyContinue     Write-Host "Checking for Detection GPO..." -ForegroundColor Yellow     wypróbuj {         # Pobierz domenę z programu AggregationInputPath (np. \\domain\share)         $domainFromPath = if ($AggregationInputPath -match '^\\\\([^\\\]+)\\') {             $matches[1]         } inaczej {             $env:USERDNSDOMAIN         }         # Sprawdź, czy obiekt zasad grupy istnieje         $existingGpo = Get-GPO -Name $CollectionGPOName -ErrorAction SilentlyContinue         if ($existingGpo) {             Write-Host " Wykryto obiekt zasad grupy wykrywania: $CollectionGPOName" -ForegroundColor Green         } inaczej {             Write-Host ""             Write-Host ("=" * 70) -Pierwszy planKolor żółty             Write-Host " DETECTION GPO NOT FOUND" -ForegroundColor Yellow             Write-Host ("=" * 70) —Kolor pierwszego planuColor Yellow             Write-Host ""             Write-Host "Nie znaleziono obiektu zasad grupy wykrywania "$CollectionGPOName". -Kolor pierwszego planu Żółty             Write-Host "Ten obiekt zasad grupy jest wymagany do zbierania danych o stanie urządzenia". -Kolor pierwszego planu Żółty             Write-Host ""             # Zapytaj użytkownika, czy chce teraz wdrożyć obiekt zasad grupy             Write-Host "Czy chcesz teraz wdrożyć obiekt zasad grupy wykrywania?                                          (Y/N)" -ForegroundColor Cyan             $response = Host              odczytu             if ($response -match '^[Yy]') {                 Write-Host ""                 Write-Host "Uruchomienie wdrożenia obiektu zasad grupy..." -ForegroundColor Cyan                 Write-Host ""                                  # Parametry kompilacji dla wdrożenia obiektu zasad grupy                 $gpoParams = @{                     DomainName = $domainFromPath                     CollectionSharePath = $AggregationInputPath                     ScriptSourcePath = Join-Path $PSScriptRoot "Detect-SecureBootCertUpdateStatus.ps1"                 }                                  if ($TargetOU) {                     $gpoParams.OUPath = $TargetOU                 } inaczej {                     # Użyj funkcji AutoDetectOU, aby umożliwić użytkownikowi wybranie pozycji                     $gpoParams.AutoDetectOU = $true                 }                                  # Uruchamianie skryptu wdrażania obiektu zasad grupy                                 & $deployGpoScript @gpoParams                 if ($LASTEXITCODE -ne 0) {                     Write-Host "Wdrożenie obiektu zasad grupy mogło napotkać problemy. Przejrzyj dane wyjściowe powyżej." -ForegroundColor Yellow                     Write-Host "Możesz kontynuować wdrażanie aranżacji lub nacisnąć klawisze Ctrl+C, aby przerwać". -Kolor pierwszego planu Żółty                     Write-Host ""                     Read-Host "Naciśnij klawisz Enter, aby kontynuować"                 } inaczej {                     Write-Host ""                     Write-Host "Pomyślnie wdrożono obiekt zasad grupy wykrywania!" —Pierwszy planColor Green                     Write-Host ""                 }             } inaczej {                 Write-Host ""                 Write-Host "Pomijanie wdrożenia obiektu zasad grupy. Aranżator nie otrzyma danych urządzenia" -ForegroundColor Yellow                 Write-Host "do czasu ręcznego wdrożenia obiektu zasad grupy wykrywania". -Kolor pierwszego planu Żółty                 Write-Host ""                 Write-Host "Aby wdrożyć gpo wykrywania później, uruchom:" -ForegroundColor Cyan                 Write-Host " .\Deploy-GPO-SecureBootCollection.ps1 -DomainName '"$domainFromPath'" -AutoDetectOU" -ForegroundColor White                 Write-Host ""             }         }     } złapać {         Write-Host " Nie można sprawdzić obiektu zasad grupy: $($_. Exception.Message)" -ForegroundColor Yellow         Write-Host " Kontynuowanie wdrażania aranżacji..." -ForegroundColor Gray     } } inaczej {     Write-Host " GroupPolicy module not available - skipping GPO check" -ForegroundColor Gray     Write-Host "Upewnij się, że obiekt zasad grupy wykrywania jest wdrożony oddzielnie". -Pierwszy planColor Gray }

Write-Host ""

# ============================================================================ # BUILD ARGUMENTY # ============================================================================

$arguments = @(     "-NoProfile"     "-ExecutionPolicy Bypass"     "-Plik '"$ScriptPath'""     "-AggregationInputPath '"$AggregationInputPath'""     "-ReportBasePath '"$ReportBasePath'""     "-PollIntervalMinutes $PollIntervalMinutes" )

if ($TargetOU) {     $arguments += "-TargetOU '"$TargetOU'"" }

if ($UseWinCS) {     $arguments += "-UseWinCS"     $arguments += "-WinCSKey '"$WinCSKey'"" }

$argumentString = $arguments -join " "

# Don't display raw arguments with full paths - it's confusing for published scripts # Zadanie użyje wewnętrznie pełnej ścieżki

# ============================================================================ # TWORZENIE ZAPLANOWANEGO ZADANIA # ============================================================================

# Check for existing task $existingTask = Get-ScheduledTask -TaskName $TaskName -ErrorAction SilentlyContinue if ($existingTask) {     Write-Host "Zadanie już istnieje. Aktualizowanie..." -Pierwszy planKolor żółty     Stop-ScheduledTask -TaskName $TaskName -ErrorAction SilentlyContinue     Unregister-ScheduledTask —Nazwa_zadania $TaskName -Confirm:$false }

# Create task action $action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument $argumentString -WorkingDirectory $PSScriptRoot

# Create trigger - run once, immediately (orchestrator loops internally) $trigger = New-ScheduledTaskTrigger -Raz -At (Get-Date). AddMinutes(1)

# Create principal if ($ServiceAccount -eq "SYSTEM") {     $principal = New-ScheduledTaskPrincipal -UserId "NT AUTHORITY\SYSTEM" -LogonType ServiceAccount -RunLevel Highest } inaczej {     # Monituj o hasło dla konta domeny     Write-Host "Wprowadź hasło do $ServiceAccount" —Kolor pierwszego planuColor Yellow     $cred = Get-Credential -Nazwa_użytkownika $ServiceAccount -Komunikat "Poświadczenia konta usługi dla zaplanowanego zadania"     $principal = New-ScheduledTaskPrincipal -UserId $ServiceAccount -LogonType Password -RunLevel Highest }

# Task settings $settings = New-ScheduledTaskSettingsSet '     -AllowStartIfOnBatteries '     -DontStopIfGoingOnBatteries '     -StartWhenAvailable '     -RunOnlyIfNetworkAvailable '     -RestartCount 3 '     -RestartInterval (New-TimeSpan -Minutes 5) '     -ExecutionTimeLimit (New-TimeSpan -Days 30) # Zezwalaj na długotrwałe

# Register task wypróbuj {     if ($ServiceAccount -eq "SYSTEM") {         Register-ScheduledTask -TaskName $TaskName -Action $action -Trigger $trigger -Principal $principal -Settings $settings -Description "Secure Boot Certificate Rollout - Automated GPO deployment"     } inaczej {         Register-ScheduledTask -TaskName $TaskName -Action $action -Trigger $trigger -Principal $principal -Settings $settings -Description "Secure Boot Certificate Rollout - Automated GPO deployment" -User $ServiceAccount -Password $cred. GetNetworkCredential(). Hasło     }     Write-Host "Pomyślnie utworzono zaplanowane zadanie!" — Kolor pierwszego planuColor Green } złapać {     Write-Host "Nie można utworzyć zaplanowanego zadania: $($_. Exception.Message)" -ForegroundColor Red     wyjdź 1 }

# ============================================================================ # CREATE STATUS SHORTCUT # ============================================================================

$statusScript = Join-Path $PSScriptRoot "Get-SecureBootRolloutStatus.ps1" if (Test-Path $statusScript) {     Write-Host ""     Write-Host "Aby sprawdzić stan wdrożenia, uruchom:" -Pierwszy planColor Yellow     Write-Host " .\Get-SecureBootRolloutStatus.ps1 -ReportBasePath '"$ReportBasePath'"" -ForegroundColor Cyan }

# ============================================================================ # OUTPUT # ============================================================================

Write-Host "" Write-Host ("=" * 70) -Pierwszy planKolor zielony Write-Host " DEPLOYMENT COMPLETE" -ForegroundColor Green Write-Host ("=" * 70) - Pierwszy planKolor zielony Write-Host "" Write-Host "Aranżacji rozpocznie się w około 1 minutę." -ForegroundColor White Write-Host "" Write-Host "MONITORING:" -Pierwszy planKolor żółty Write-Host " Wyświetl stan zadania: Get-ScheduledTask —Nazwa_zadania '$TaskName' | Wybierz województwo" Write-Host " Wyświetl dziennik zadań: Get-Content '$ReportBasePath\RolloutState\Orchestrator_$(Get-Date -Format 'yyyyMMdd').log' -Tail 50" Write-Host " Wyświetl stan wdrożenia: Get-Content '$ReportBasePath\RolloutState\RolloutState.json' | ConvertFrom-Json" Write-Host " Wyświetl pulpit nawigacyjny: Uruchamianie $ReportBasePath\Aggregation_*\SecureBoot_Dashboard*.html'" Write-Host " Szybki stan: .\Get-SecureBootRolloutStatus.ps1 -ReportBasePath '$ReportBasePath'" Write-Host "" Write-Host "MANAGEMENT:" -ForegroundColor Yellow Write-Host " Start manually: Start-ScheduledTask -TaskName '$TaskName'" Write-Host " Stop: Stop-ScheduledTask -TaskName '$TaskName'" Write-Host " Remove: .\Deploy-OrchestratorTask.ps1 -Uninstall" Write-Host ""  

Potrzebujesz dalszej pomocy?

Chcesz uzyskać więcej opcji?

Poznaj korzyści z subskrypcji, przeglądaj kursy szkoleniowe, dowiedz się, jak zabezpieczyć urządzenie i nie tylko.