Αντιγράψτε και επικολλήστε αυτό το δείγμα δέσμης ενεργειών και τροποποιήστε το ανάλογα με τις ανάγκες σας για το περιβάλλον σας:
<# . ΣΎΝΟΨΗ Αναπτύσσει το Secure Boot Rollout Orchestrator ως προγραμματισμένη εργασία των Windows.
.DESCRIPTION Δημιουργεί μια προγραμματισμένη εργασία που εκτελεί συνεχώς τον ενορχηστρωτή στο παρασκήνιο.Η εργασία εκτελείται με την πολιτική εκτέλεσης παράκαμψης, ώστε να μην εμφανίζονται μηνύματα ασφαλείας. Ο ενορχηστρωτής: - Ψηφοφορία για ενημερώσεις συσκευής στο καθορισμένο χρονικό διάστημα - Δημιουργεί αυτόματα κύματα και αναπτύσσει GPO - Συνεχίστε μέχρι να ενημερωθούν όλες οι κατάλληλες συσκευές Παρακολούθηση της προόδου με τη χρήση: Get-SecureBootRolloutStatus.ps1
.PARAMETER AggregationInputPath Διαδρομή UNC προς δεδομένα συσκευής JSON (από το GPO εντοπισμού)
.PARAMETER ReportBasePath Τοπική διαδρομή για αναφορές και κρατικά αρχεία
.PARAMETER TargetOU OU για τη σύνδεση GPO (προαιρετικό - προεπιλογές στη ρίζα τομέα)
.PARAMETER PollIntervalMinutes Λεπτά μεταξύ ελέγχων κατάστασης. Προεπιλογή: 30
.PARAMETER UseWinCS Χρησιμοποιήστε το WinCS (Σύστημα ρύθμισης παραμέτρων των Windows) αντί για το GPO AvailableUpdatesPolicy.Όταν είναι ενεργοποιημένη, αναπτύσσει WinCsFlags.exe προγραμματισμένη εργασία σε τελικά σημεία αντί για το αντικείμενο πολιτικής ομάδας (GPO) μητρώου.
.PARAMETER WinCSKey Το πλήκτρο WinCS για τη ρύθμιση παραμέτρων ασφαλούς εκκίνησης. Προεπιλογή: F33E0C8E002
.PARAMETER ServiceAccount Λογαριασμός για την εκτέλεση της εργασίας. Προεπιλογή: ΣΥΣΤΗΜΑ Για λειτουργίες τομέα, χρησιμοποιήστε ένα λογαριασμό υπηρεσίας διαχείρισης τομέα.
.PARAMETER ScriptPath Διαδρομή για το σενάριο του ενορχηστρωτή. Προεπιλογή: Ίδιος φάκελος με αυτήν τη δέσμη ενεργειών.
.PARAMETER Uninstall Κατάργηση της προγραμματισμένης εργασίας
.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 # Ανάπτυξη με χρήση της μεθόδου WinCS αντί της availableUpdatesPolicy .\Deploy-OrchestratorTask.ps1 -AggregationInputPath "\\server\SecureBootData$" -ReportBasePath "C:\SecureBootReports" -UseWinCS
.EXAMPLE .\Deploy-OrchestratorTask.ps1 -Κατάργηση εγκατάστασης #>
[CmdletBinding()] param( [Parameter(Mandatory = $false)] [συμβολοσειρά]$AggregationInputPath, [Parameter(Mandatory = $false)] [συμβολοσειρά]$ReportBasePath, [Parameter(Mandatory = $false)] [συμβολοσειρά]$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)] [συμβολοσειρά]$ScriptPath, [Parameter(Mandatory = $false)] [switch]$Uninstall )
$ErrorActionPreference = "Stop" $TaskName = "SecureBoot-Rollout-Orchestrator" $DownloadUrl = "https://aka.ms/getsecureboot" $DownloadSubPage = "Δείγματα ανάπτυξης και παρακολούθησης"
# ============================================================================ # ΕΠΙΚΎΡΩΣΗ ΕΞΑΡΤΉΣΕΩΝ # ============================================================================
function Test-ScriptDependencies { <# . ΣΎΝΟΨΗ Επικυρώνει ότι υπάρχουν όλες οι απαιτούμενες δέσμες ενεργειών.. ΠΕΡΙΓΡΑΦΉ Ελέγχει για απαιτούμενες εξαρτήσεις δέσμης ενεργειών και παρέχει οδηγίες λήψης, εάν λείπουν.#> param( [Parameter(Mandatory = $true)] [συμβολοσειρά]$ScriptDirectory, [Parameter(Mandatory = $true)] [συμβολοσειρά[]]$RequiredScripts ) $missingScripts = @() foreach ($script στο $RequiredScripts) { $scriptPath = Join-Path $ScriptDirectory $script if (-not (Test-Path $scriptPath)) { $missingScripts += $script } } if ($missingScripts.Count -gt 0) { Write-Host "" Write-Host ("=" * 70) -Χρώμα πρώτου πλάνου Κόκκινο Write-Host " MISSING DEPENDENCIES" -ForegroundColor Red Write-Host ("=" * 70) -Χρώμα πρώτου πλάνου Κόκκινο Write-Host "" Write-Host "Δεν βρέθηκαν οι ακόλουθες απαιτούμενες δέσμες ενεργειών:" -ForegroundColor Yellow foreach ($script στο $missingScripts) { Write-Host " - $script" -Χρώμα πρώτου πλάνου Λευκό } Write-Host "" Write-Host "Κατεβάστε τις πιο πρόσφατες δέσμες ενεργειών από:" -ForegroundColor Cyan Write-Host " URL: $DownloadUrl" -ForegroundColor White Write-Host " Μεταβείτε στο: '$DownloadSubPage'" -Χρώμα πρώτου πλάνου Λευκό Write-Host "" Write-Host "Εξαγάγετε όλες τις δέσμες ενεργειών στον ίδιο κατάλογο και εκτελέστε ξανά." -ForegroundColor Yellow Write-Host "" επιστροφή $false } επιστροφή $true }
# 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)) { έξοδος 1 }
# ============================================================================ # UNINSTALL (ΚΑΤΆΡΓΗΣΗ ΕΓΚΑΤΆΣΤΑΣΗς) # ============================================================================
if ($Uninstall) { Write-Host "" Write-Host "Κατάργηση προγραμματισμένης εργασίας: $TaskName" -Χρώμα πρώτου πλάνου Κίτρινο $existingTask = Get-ScheduledTask -Όνομα_εργασίας $TaskName -ErrorAction SilentlyContinue if ($existingTask) { Stop-ScheduledTask -TaskName $TaskName -ErrorAction SilentlyContinue Unregister-ScheduledTask -Όνομα_εργασίας $TaskName -Επιβεβαίωση:$false Write-Host "Η εργασία καταργήθηκε με επιτυχία." -ForegroundColor Green } άλλος { Write-Host "Η εργασία δεν βρέθηκε". -Χρώμα πρώτου πλάνου Γκρι } έξοδος 0 }
# ============================================================================ # ΕΠΙΚΎΡΩΣΗ # ============================================================================
if (-not $AggregationInputPath -or -not $ReportBasePath) { Write-Host "ΣΦΑΛΜΑ: -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"' έξοδος 1 }
# Find orchestrator script if (-not $ScriptPath) { $ScriptPath = Join-Path $PSScriptRoot "Start-SecureBootRolloutOrchestrator.ps1" }
if (-not (Test-Path $ScriptPath)) { Write-Host "ΣΦΑΛΜΑ: Η δέσμη ενεργειών Orchestrator δεν βρέθηκε: $ScriptPath" -ForegroundColor Red έξοδος 1 }
# Find aggregation script (needed by orchestrator) $aggregateScript = Join-Path $PSScriptRoot "Aggregate-SecureBootData.ps1" if (-not (Test-Path $aggregateScript)) { Write-Host "ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Aggregate-SecureBootData.ps1 δεν βρέθηκε στον κατάλογο δέσμης ενεργειών" -ForegroundColor Yellow Write-Host " Το Orchestrator μπορεί να αποτύχει εάν δεν μπορεί να βρει αυτό το σενάριο." -ForegroundColor Yellow }
Write-Host "" Write-Host ("=" * 70) -ForegroundColor Cyan Write-Host " Secure Boot Rollout Orchestrator - Task Deployment" -ForegroundColor Cyan Write-Host ("=" * 70) -ForegroundColor Cyan Write-Host ""
# For display, show relative paths (script names only) $displayScriptPath = Split-Path $ScriptPath -Φύλλο
Write-Host "Configuration:" -ForegroundColor Yellow Write-Host " Όνομα εργασίας: $TaskName" Write-Host " Orchestrator: $displayScriptPath" Write-Host " Διαδρομή εισόδου: $AggregationInputPath" Write-Host " Διαδρομή αναφοράς: $ReportBasePath" Write-Host " Target OU: $(if ($TargetOU) { $TargetOU } else { '(domain root)' })" Write-Host " Χρονικό διάστημα ψηφοφορίας: $PollIntervalMinutes λεπτά" Write-Host " Λογαριασμός υπηρεσίας: $ServiceAccount" Write-Host " Μέθοδος ανάπτυξης: $(if ($UseWinCS) { "WinCS (WinCsFlags.exe)" } else { "AvailableUpdatesPolicy (GPO)" })" if ($UseWinCS) { Write-Host " Πλήκτρο WinCS: $WinCSKey" } Write-Host ""
# ============================================================================ Εντοπισμός # GPO - ΑΥΤΌΜΑΤΗ ΑΝΆΠΤΥΞΗ ΕΆΝ ΛΕΊΠΕΙ # ============================================================================
$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 "Έλεγχος για GPO εντοπισμού..." -ForegroundColor Yellow δοκιμάστε το { # Λήψη του τομέα από το AggregationInputPath (π.χ., \\domain\share) $domainFromPath = if ($AggregationInputPath -match '^\\\\\([^\\]+)\\') { $matches[1] } άλλος { $env:USERDNSDOMAIN } # Ελέγξτε εάν υπάρχει αντικείμενο πολιτικής ομάδας (GPO) $existingGpo = Get-GPO -Name $CollectionGPOName -ErrorAction SilentlyContinue if ($existingGpo) { Write-Host " Εντοπίστηκε GPO ανίχνευσης: $CollectionGPOName" -ForegroundColor Green } άλλος { Write-Host "" Write-Host ("=" * 70) -Χρώμα πρώτου πλάνου Κίτρινο Write-Host " DETECTION GPO NOT FOUND" -ForegroundColor Yellow Write-Host ("=" * 70) -Χρώμα πρώτου πλάνου Κίτρινο Write-Host "" Write-Host "Το GPO εντοπισμού "$CollectionGPOName" δεν βρέθηκε." -ForegroundColor Yellow Write-Host "Αυτό το αντικείμενο πολιτικής ομάδας (GPO) απαιτείται για τη συλλογή δεδομένων κατάστασης συσκευής." -Κίτρινο χρώμα πρώτου πλάνου Write-Host "" # Ρωτήστε τον χρήστη εάν θέλει να αναπτύξει το αντικείμενο πολιτικής ομάδας (GPO) τώρα Write-Host "Θέλετε να αναπτύξετε τώρα το αντικείμενο πολιτικής ομάδας εντοπισμού; (Y/N)" -ForegroundColor Cyan $response = Read-Host if ($response -match '^[Yy]') { Write-Host "" Write-Host "Εκκίνηση ανάπτυξης GPO..." -ForegroundColor Cyan Write-Host "" # Παράμετροι δόμησης για ανάπτυξη GPO $gpoParams = @{ DomainName = $domainFromPath CollectionSharePath = $AggregationInputPath ScriptSourcePath = Join-Path $PSScriptRoot "Detect-SecureBootCertUpdateStatus.ps1" } if ($TargetOU) { $gpoParams.OUPath = $TargetOU } άλλος { # Use AutoDetectOU to let user select $gpoParams.AutoDetectOU = $true } # Εκτέλεση της δέσμης ενεργειών ανάπτυξης GPO & $deployGpoScript @gpoParams if ($LASTEXITCODE -ne 0) { Write-Host "Η ανάπτυξη GPO ενδέχεται να αντιμετώπισε προβλήματα. Ελέγξτε την έξοδο παραπάνω." -ForegroundColor Yellow Write-Host "Μπορείτε να συνεχίσετε με την ανάπτυξη του ενορχηστρωτή ή να πατήσετε το συνδυασμό πλήκτρων Ctrl+C για ματαίωση". -ForegroundColor Yellow Write-Host "" Read-Host "Πατήστε το πλήκτρο Enter για να συνεχίσετε" } άλλος { Write-Host "" Write-Host "Το GPO ανίχνευσης αναπτύχθηκε με επιτυχία!" -ForegroundColor Green Write-Host "" } } άλλος { Write-Host "" Write-Host "Παράλειψη ανάπτυξης GPO. Ο ενορχηστρωτής δεν θα λαμβάνει δεδομένα συσκευής" -ForegroundColor Yellow Write-Host "μέχρι να αναπτυχθεί με μη αυτόματο τρόπο το GPO εντοπισμού". -Κίτρινο χρώμα πρώτου πλάνου Write-Host "" Write-Host "Για να αναπτύξετε το GPO ανίχνευσης αργότερα, εκτελέστε:" -ForegroundColor Cyan Write-Host " .\Deploy-GPO-SecureBootCollection.ps1 -DomainName '"$domainFromPath'" -AutoDetectOU" -ForegroundColor White Write-Host "" } } } αλίευση { Write-Host " Δεν είναι δυνατός ο έλεγχος για αντικείμενο πολιτικής ομάδας (GPO): $($_. Exception.Message)" -ForegroundColor Yellow Write-Host " Συνέχιση της ανάπτυξης του ενορχηστρωτή..." -ForegroundColor Gray } } άλλος { Write-Host " Η λειτουργική μονάδα GroupPolicy δεν είναι διαθέσιμη - παράλειψη ελέγχου GPO" -ForegroundColor Gray Write-Host " Βεβαιωθείτε ότι το GPO εντοπισμού αναπτύσσεται ξεχωριστά." -ForegroundColor Gray }
Write-Host ""
# ============================================================================ # ΔΗΜΙΟΥΡΓΊΑ ΟΡΙΣΜΆΤΩΝ # ============================================================================
$arguments = @( "-NoProfile" "-ExecutionPolicy Bypass" "-Αρχείο '"$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 # Η εργασία θα χρησιμοποιήσει την πλήρη διαδρομή εσωτερικά
# ============================================================================ # ΔΗΜΙΟΥΡΓΊΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΈΝΗς ΕΡΓΑΣΊΑς # ============================================================================
# Check for existing task $existingTask = Get-ScheduledTask -Όνομα_εργασίας $TaskName -ErrorAction SilentlyContinue if ($existingTask) { Write-Host "Η εργασία υπάρχει ήδη. Ενημέρωση..." -Κίτρινο χρώμα πρώτου πλάνου Stop-ScheduledTask -TaskName $TaskName -ErrorAction SilentlyContinue Unregister-ScheduledTask -Όνομα_εργασίας $TaskName -Επιβεβαίωση:$false }
# Create task action $action = New-ScheduledTaskAction -Εκτέλεση "powershell.exe" -$argumentString ορίσματος -Επεξεργασία $PSScriptRoot
# Create trigger - run once, immediately (orchestrator loops internally) $trigger = New-ScheduledTaskTrigger -Μία φορά -Σε (Ημερομηνία λήψης). AddMinutes(1)
# Create principal if ($ServiceAccount -eq "SYSTEM") { $principal = New-ScheduledTaskPrincipal -UserId "NT AUTHORITY\SYSTEM" -LogonType ServiceAccount -RunLevel Highest } άλλος { # Ερώτηση για κωδικό πρόσβασης για λογαριασμό τομέα Write-Host "Εισαγωγή κωδικού πρόσβασης για $ServiceAccount" -Κίτρινο χρώμα πρώτου πλάνου $cred = Get-Credential -UserName $ServiceAccount -Μήνυμα "Διαπιστευτήρια λογαριασμού υπηρεσίας για την προγραμματισμένη εργασία" $principal = New-ScheduledTaskPrincipal -UserId $ServiceAccount -Κωδικός πρόσβασης LogonType -Υψηλότερο επίπεδο εκτέλεσης }
# Task settings $settings = New-ScheduledTaskSettingsSet ' -AllowStartIfOnBatteries ' -DontStopIfGoingOnBatteries ' -StartWhenAvailable ' -RunOnlyIfNetworkAvailable ' -RestartCount 3 ' -RestartInterval (New-TimeSpan -Minutes 5) ' -ExecutionTimeLimit (New-TimeSpan -Days 30) # Allow long-running
# Register task δοκιμάστε το { if ($ServiceAccount -eq "SYSTEM") { Register-ScheduledTask -TaskName $TaskName -Action $action -Trigger $trigger -Principal $principal -Settings $settings -Περιγραφή "Secure Boot Certificate Rollout - Automated GPO deployment" } άλλος { Register-ScheduledTask -Όνομα_εργασίας $TaskName -$action ενεργειών -Trigger $trigger -Principal $principal -Settings $settings -Περιγραφή "Secure Boot Certificate Rollout - Automated GPO deployment" -User $ServiceAccount -Password $cred. GetNetworkCredential(). Κωδικό πρόσβασης } Write-Host "Η προγραμματισμένη εργασία δημιουργήθηκε με επιτυχία!" -ForegroundColor Green } αλίευση { Write-Host "Απέτυχε η δημιουργία προγραμματισμένης εργασίας: $($_. Exception.Message)" -ForegroundColor Red έξοδος 1 }
# ============================================================================ # CREATE STATUS SHORTCUT # ============================================================================
$statusScript = Join-Path $PSScriptRoot "Get-SecureBootRolloutStatus.ps1" if (Test-Path $statusScript) { Write-Host "" Write-Host "Για να ελέγξετε την κατάσταση παράδοσης, εκτέλεση:" -Πρώτο πλάνοΧρήση κίτρινο Write-Host " .\Get-SecureBootRolloutStatus.ps1 -ReportBasePath '"$ReportBasePath'"" -ForegroundColor Cyan }
# ============================================================================ # ΈΞΟΔΟς # ============================================================================
Write-Host "" Write-Host ("=" * 70) -Πράσινο χρώμα πρώτου πλάνου Write-Host " DEPLOYMENT COMPLETE" -ForegroundColor Green Write-Host ("=" * 70) -Πράσινο χρώμα πρώτου πλάνου Write-Host "" Write-Host "Ο ενορχηστρωτής θα ξεκινήσει σε περίπου 1 λεπτό." -ForegroundColor White Write-Host "" Write-Host "MONITORING:" -ForegroundColor Yellow Write-Host " Προβολή κατάστασης εργασίας: Get-ScheduledTask -Όνομα_εργασίας '$TaskName' | Select State" Write-Host " Προβολή αρχείου καταγραφής εργασιών: Get-Content '$ReportBasePath\RolloutState\Orchestrator_$(Get-Date -Format 'yyyMMdd').log' -Tail 50" Write-Host " Προβολή κατάστασης παράδοσης: Get-Content '$ReportBasePath\RolloutState\RolloutState.json' | ConvertFrom-Json" Write-Host " Προβολή πίνακα εργαλείων: Έναρξη '$ReportBasePath\Aggregation_*\SecureBoot_Dashboard*.html'" Write-Host " Γρήγορη κατάσταση: .\Get-SecureBootRolloutStatus.ps1 -ReportBasePath '$ReportBasePath'" Write-Host "" Write-Host "MANAGEMENT:" -ForegroundColor Yellow Write-Host " Ξεκινήστε με μη αυτόματο τρόπο: Start-ScheduledTask -Όνομα εργασίας '$TaskName'" Write-Host " Διακοπή: Stop-ScheduledTask -Όνομα_εργασίας '$TaskName'" Write-Host " Κατάργηση: .\Deploy-OrchestratorTask.ps1 -Κατάργηση εγκατάστασης" Write-Host ""