Files
firefox-addin-manager/MVVM/ViewModels/DiagnosticViewModel.ps1
T
2026-06-10 21:57:55 +02:00

114 lines
5.7 KiB
PowerShell

class DiagnosticViewModel : FirefoxAddinManager.ObservableBase {
[System.Collections.ObjectModel.ObservableCollection[PolicyCheckModel]] $PolicyChecks
[System.Windows.Input.ICommand] $RunCheckCommand
[System.Windows.Input.ICommand] $FixSelectedCommand
[System.Windows.Input.ICommand] $FixAllErrorsCommand
[System.Windows.Input.ICommand] $OpenAboutPoliciesCommand
[System.Windows.Input.ICommand] $ImportRegCommand
hidden [PolicyCheckModel] $_selectedCheck = $null
hidden [string] $_statusMessage = ""
hidden [bool] $_isIntuneManaged = $false
[PolicyCheckModel] $SelectedCheck {
get { return $this._selectedCheck }
set { $this._selectedCheck = $value; $this.OnPropertyChanged("SelectedCheck") }
}
[string] $StatusMessage {
get { return $this._statusMessage }
set { $this._statusMessage = $value; $this.OnPropertyChanged("StatusMessage") }
}
[bool] $IsIntuneManaged {
get { return $this._isIntuneManaged }
set { $this._isIntuneManaged = $value; $this.OnPropertyChanged("IsIntuneManaged") }
}
DiagnosticViewModel() {
$this.PolicyChecks = [System.Collections.ObjectModel.ObservableCollection[PolicyCheckModel]]::new()
$this.IsIntuneManaged = [FirefoxService]::IsIntuneManaged()
$this._InitCommands()
}
hidden [void] _InitCommands() {
$vm = $this
$this.RunCheckCommand = [FirefoxAddinManager.RelayCommand]::new({
$vm.PolicyChecks.Clear()
[PolicyService]::RunChecks() | ForEach-Object { $vm.PolicyChecks.Add($_) }
$errors = ($vm.PolicyChecks | Where-Object { $_.Status -eq "FEHLER" }).Count
$vm.StatusMessage = if ($errors -gt 0) { "$errors Fehler gefunden." } else { "Keine Fehler gefunden." }
}, { $true })
$this.FixSelectedCommand = [FirefoxAddinManager.RelayCommand]::new({
if (-not $vm.SelectedCheck) { return }
if (-not [FirefoxService]::IsAdmin()) {
[System.Windows.MessageBox]::Show("Administratorrechte erforderlich.", "Kein Admin", "OK", "Warning")
return
}
[PolicyService]::FixError($vm.SelectedCheck)
$vm.RunCheckCommand.Execute($null)
$vm.StatusMessage = "Korrektur angewendet. Firefox neu starten."
}, { return $null -ne $this.SelectedCheck -and $this.SelectedCheck.Status -eq "FEHLER" })
$this.FixAllErrorsCommand = [FirefoxAddinManager.RelayCommand]::new({
if (-not [FirefoxService]::IsAdmin()) {
[System.Windows.MessageBox]::Show("Administratorrechte erforderlich.", "Kein Admin", "OK", "Warning")
return
}
$errors = $vm.PolicyChecks | Where-Object { $_.Status -eq "FEHLER" }
foreach ($e in $errors) { [PolicyService]::FixError($e) }
$vm.RunCheckCommand.Execute($null)
$vm.StatusMessage = "$($errors.Count) Fehler behoben. Firefox neu starten."
}, { return ($this.PolicyChecks | Where-Object { $_.Status -eq "FEHLER" }).Count -gt 0 })
$this.OpenAboutPoliciesCommand = [FirefoxAddinManager.RelayCommand]::new({
try { Start-Process "firefox" "about:policies" }
catch { [System.Windows.MessageBox]::Show("Firefox konnte nicht gestartet werden.", "Fehler", "OK", "Error") }
}, { $true })
$this.ImportRegCommand = [FirefoxAddinManager.RelayCommand]::new({
if (-not [FirefoxService]::IsAdmin()) {
[System.Windows.MessageBox]::Show("Administratorrechte erforderlich.", "Kein Admin", "OK", "Warning")
return
}
$dlg = New-Object Microsoft.Win32.OpenFileDialog
$dlg.Filter = "Registry-Datei (*.reg)|*.reg"
if (-not $dlg.ShowDialog()) { return }
$lines = Get-Content $dlg.FileName -Encoding Unicode -ErrorAction SilentlyContinue
if (-not $lines) { $lines = Get-Content $dlg.FileName -Encoding UTF8 -ErrorAction SilentlyContinue }
$currentKey = $null; $applied = 0; $skipped = 0
foreach ($line in $lines) {
$line = $line.Trim()
if ($line -eq "" -or $line.StartsWith(";") -or $line.StartsWith("Windows")) { continue }
if ($line -match '^\[(.+)\]$') {
$rawKey = $Matches[1]
if ($rawKey -match 'SOFTWARE\\Policies\\Mozilla\\Firefox') {
$currentKey = $rawKey -replace '^HKEY_LOCAL_MACHINE','HKLM:' -replace '^HKEY_CURRENT_USER','HKCU:'
} else { $currentKey = $null; $skipped++ }
continue
}
if (-not $currentKey) { continue }
if ($line -match '^"(.+)"=dword:(.+)$') {
if (-not (Test-Path $currentKey)) { New-Item -Path $currentKey -Force | Out-Null }
Set-ItemProperty $currentKey -Name $Matches[1] -Value ([Convert]::ToInt32($Matches[2],16)) -Type DWord
$applied++
} elseif ($line -match '^"(.+)"="(.*)"$') {
if (-not (Test-Path $currentKey)) { New-Item -Path $currentKey -Force | Out-Null }
Set-ItemProperty $currentKey -Name $Matches[1] -Value ($Matches[2] -replace '\\"','"') -Type String
$applied++
} elseif ($line -match '^"-(.+)"$') {
Remove-ItemProperty $currentKey -Name $Matches[1] -ErrorAction SilentlyContinue
$applied++
}
}
$vm.RunCheckCommand.Execute($null)
$vm.StatusMessage = "REG-Import: $applied Werte gesetzt, $skipped Keys uebersprungen. Firefox neu starten."
}, { $true })
}
}