Files
MrTrust/scripts/Start-MrTrustGui.ps1
MrSphay f5303fc536
All checks were successful
Build MrTrust / build (push) Successful in 5m57s
Modernize MrTrust GUI
2026-05-16 13:43:52 +02:00

673 lines
27 KiB
PowerShell

[CmdletBinding()]
param()
$ErrorActionPreference = "Stop"
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
$script:RootPath = Split-Path -Parent (Split-Path -Parent $MyInvocation.MyCommand.Path)
$script:RootCertificatePath = Join-Path $script:RootPath "assets\certificates\MrSphay-LocalTrust-Root.cer"
$script:PublisherCertificatePath = Join-Path $script:RootPath "assets\certificates\MrSphay-CodeSigning.cer"
$script:IconPath = Join-Path $script:RootPath "assets\MrTrust.ico"
$script:SelectedFilePath = $null
$script:CurrentAccent = 0
$colors = @{
Background = [Drawing.Color]::FromArgb(15, 20, 20)
Shell = [Drawing.Color]::FromArgb(20, 27, 27)
Panel = [Drawing.Color]::FromArgb(27, 36, 35)
PanelAlt = [Drawing.Color]::FromArgb(34, 45, 43)
PanelSelected = [Drawing.Color]::FromArgb(31, 64, 49)
Border = [Drawing.Color]::FromArgb(53, 66, 64)
Text = [Drawing.Color]::FromArgb(239, 244, 241)
Muted = [Drawing.Color]::FromArgb(157, 172, 166)
Green = [Drawing.Color]::FromArgb(0, 175, 91)
GreenHover = [Drawing.Color]::FromArgb(0, 199, 104)
GreenSoft = [Drawing.Color]::FromArgb(34, 76, 52)
Orange = [Drawing.Color]::FromArgb(242, 153, 74)
Red = [Drawing.Color]::FromArgb(235, 87, 87)
Blue = [Drawing.Color]::FromArgb(82, 166, 255)
}
function Test-IsAdministrator {
$identity = [Security.Principal.WindowsIdentity]::GetCurrent()
$principal = [Security.Principal.WindowsPrincipal]::new($identity)
$principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
}
function Get-MrTrustCertificate {
param([Parameter(Mandatory)][string]$Path)
if (-not (Test-Path -LiteralPath $Path)) {
throw "Certificate file not found: $Path"
}
[System.Security.Cryptography.X509Certificates.X509Certificate2]::new($Path)
}
function Get-TrustScope {
if ($script:AllUsersCheckBox.Checked) { "LocalMachine" } else { "CurrentUser" }
}
function Get-StorePath {
param(
[Parameter(Mandatory)][string]$Scope,
[Parameter(Mandatory)][string]$Store
)
"Cert:\$Scope\$Store"
}
function Test-CertificateInstalled {
param(
[Parameter(Mandatory)]$Certificate,
[Parameter(Mandatory)][string]$Scope,
[Parameter(Mandatory)][string]$Store
)
$storePath = Get-StorePath -Scope $Scope -Store $Store
@(Get-ChildItem -Path $storePath | Where-Object Thumbprint -eq $Certificate.Thumbprint).Count -gt 0
}
function Set-Busy {
param([bool]$Busy)
$script:ProgressBar.Visible = $Busy
if ($Busy) {
$script:ProgressBar.Style = "Marquee"
}
}
function Set-StatusText {
param(
[Parameter(Mandatory)][string]$Text,
[Parameter(Mandatory)][Drawing.Color]$Color
)
$script:StatusLabel.Text = $Text
$script:StatusPill.BackColor = $Color
}
function Add-AnimatedButton {
param(
[Parameter(Mandatory)][Windows.Forms.Button]$Button,
[Parameter(Mandatory)][Drawing.Color]$Normal,
[Parameter(Mandatory)][Drawing.Color]$Hover
)
$normalColor = $Normal
$hoverColor = $Hover
$textColor = $colors.Text
$borderColor = $colors.Border
$Button.FlatStyle = "Flat"
$Button.FlatAppearance.BorderColor = $borderColor
$Button.FlatAppearance.BorderSize = 1
$Button.BackColor = $normalColor
$Button.ForeColor = $textColor
$Button.Cursor = [Windows.Forms.Cursors]::Hand
$Button.Add_MouseEnter({ param($sender, $eventArgs) $sender.BackColor = $hoverColor }.GetNewClosure())
$Button.Add_MouseLeave({ param($sender, $eventArgs) $sender.BackColor = $normalColor }.GetNewClosure())
}
function New-Label {
param(
[string]$Text,
[int]$X,
[int]$Y,
[int]$Width = 220,
[int]$Height = 24,
[Drawing.Color]$Color = $colors.Muted,
[Drawing.Font]$Font = $null
)
$label = [Windows.Forms.Label]::new()
$label.Text = $Text
$label.Location = [Drawing.Point]::new($X, $Y)
$label.Size = [Drawing.Size]::new($Width, $Height)
$label.ForeColor = $Color
if ($Font) { $label.Font = $Font }
$label
}
function New-Card {
param(
[int]$X,
[int]$Y,
[int]$Width,
[int]$Height,
[Drawing.Color]$BackColor = $colors.Panel
)
$panel = [Windows.Forms.Panel]::new()
$panel.Location = [Drawing.Point]::new($X, $Y)
$panel.Size = [Drawing.Size]::new($Width, $Height)
$panel.BackColor = $BackColor
$panel.BorderStyle = "FixedSingle"
$panel.Anchor = "Top,Left,Right"
$panel
}
function New-PageTitle {
param(
[string]$Title,
[string]$Description
)
$titleLabel = New-Label -Text $Title -X 0 -Y 0 -Width 760 -Height 34 -Color $colors.Text -Font ([Drawing.Font]::new("Segoe UI", 15, [Drawing.FontStyle]::Bold))
$descriptionLabel = New-Label -Text $Description -X 1 -Y 38 -Width 850 -Height 24 -Color $colors.Muted
[pscustomobject]@{
Title = $titleLabel
Description = $descriptionLabel
}
}
function New-NavButton {
param(
[Parameter(Mandatory)][string]$Key,
[Parameter(Mandatory)][string]$Text,
[Parameter(Mandatory)][int]$Y
)
$button = [Windows.Forms.Button]::new()
$button.Text = $Text
$button.Tag = $Key
$button.Size = [Drawing.Size]::new(174, 44)
$button.Location = [Drawing.Point]::new(22, $Y)
$button.TextAlign = "MiddleLeft"
$button.Padding = [Windows.Forms.Padding]::new(14, 0, 0, 0)
$button.Font = [Drawing.Font]::new("Segoe UI", 10, [Drawing.FontStyle]::Bold)
$button.FlatStyle = "Flat"
$button.FlatAppearance.BorderSize = 1
$button.FlatAppearance.BorderColor = $colors.Shell
$button.BackColor = $colors.Shell
$button.ForeColor = $colors.Muted
$button.Cursor = [Windows.Forms.Cursors]::Hand
$button.Add_MouseEnter({ param($sender, $eventArgs) if ($script:ActivePage -ne $sender.Tag) { $sender.BackColor = $colors.PanelAlt } }.GetNewClosure())
$button.Add_MouseLeave({ param($sender, $eventArgs) if ($script:ActivePage -ne $sender.Tag) { $sender.BackColor = $colors.Shell } }.GetNewClosure())
$button.Add_Click({ param($sender, $eventArgs) Show-MrTrustPage -Key $sender.Tag })
$button
}
function Show-MrTrustPage {
param([Parameter(Mandatory)][string]$Key)
$script:ActivePage = $Key
foreach ($pageKey in $script:Pages.Keys) {
$script:Pages[$pageKey].Visible = $pageKey -eq $Key
}
foreach ($buttonKey in $script:NavButtons.Keys) {
$button = $script:NavButtons[$buttonKey]
if ($buttonKey -eq $Key) {
$button.BackColor = $colors.PanelSelected
$button.FlatAppearance.BorderColor = $colors.Green
$button.ForeColor = $colors.Text
}
else {
$button.BackColor = $colors.Shell
$button.FlatAppearance.BorderColor = $colors.Shell
$button.ForeColor = $colors.Muted
}
}
}
function Update-TrustStatus {
try {
Set-Busy $true
$rootCertificate = Get-MrTrustCertificate -Path $script:RootCertificatePath
$publisherCertificate = Get-MrTrustCertificate -Path $script:PublisherCertificatePath
$scope = Get-TrustScope
$rootInstalled = Test-CertificateInstalled -Certificate $rootCertificate -Scope $scope -Store "Root"
$publisherInstalled = Test-CertificateInstalled -Certificate $publisherCertificate -Scope $scope -Store "TrustedPublisher"
$script:RootThumbprintLabel.Text = $rootCertificate.Thumbprint
$script:PublisherThumbprintLabel.Text = $publisherCertificate.Thumbprint
$script:ExpiryLabel.Text = $rootCertificate.NotAfter.ToString("yyyy-MM-dd")
$script:ScopeValueLabel.Text = $scope
if ($rootInstalled -and $publisherInstalled) {
Set-StatusText -Text "Trusted" -Color $colors.Green
$script:TrustSummaryLabel.Text = "MrSphay public trust is installed for $scope."
}
else {
Set-StatusText -Text "Not installed" -Color $colors.Orange
$script:TrustSummaryLabel.Text = "Trust is not fully installed for $scope."
}
}
catch {
Set-StatusText -Text "Error" -Color $colors.Red
$script:TrustSummaryLabel.Text = $_.Exception.Message
}
finally {
Set-Busy $false
}
}
function Install-MrTrustCertificates {
$scope = Get-TrustScope
if ($scope -eq "LocalMachine" -and -not (Test-IsAdministrator)) {
[Windows.Forms.MessageBox]::Show("All-users trust requires running MrTrust as Administrator.", "MrTrust", "OK", "Warning") | Out-Null
return
}
$rootCertificate = Get-MrTrustCertificate -Path $script:RootCertificatePath
$publisherCertificate = Get-MrTrustCertificate -Path $script:PublisherCertificatePath
$message = "Install MrSphay trust for $scope?`r`n`r`nRoot:`r`n$($rootCertificate.Thumbprint)`r`n`r`nPublisher:`r`n$($publisherCertificate.Thumbprint)`r`n`r`nThis does not disable Defender or SmartScreen."
$result = [Windows.Forms.MessageBox]::Show($message, "Install MrTrust", "YesNo", "Warning")
if ($result -ne [Windows.Forms.DialogResult]::Yes) { return }
Set-Busy $true
Import-Certificate -FilePath $script:RootCertificatePath -CertStoreLocation (Get-StorePath -Scope $scope -Store "Root") | Out-Null
Import-Certificate -FilePath $script:PublisherCertificatePath -CertStoreLocation (Get-StorePath -Scope $scope -Store "TrustedPublisher") | Out-Null
Update-TrustStatus
}
function Remove-MrTrustCertificates {
$scope = Get-TrustScope
if ($scope -eq "LocalMachine" -and -not (Test-IsAdministrator)) {
[Windows.Forms.MessageBox]::Show("All-users removal requires running MrTrust as Administrator.", "MrTrust", "OK", "Warning") | Out-Null
return
}
$result = [Windows.Forms.MessageBox]::Show("Remove MrSphay trust for $scope?", "Remove MrTrust", "YesNo", "Question")
if ($result -ne [Windows.Forms.DialogResult]::Yes) { return }
Set-Busy $true
$rootCertificate = Get-MrTrustCertificate -Path $script:RootCertificatePath
$publisherCertificate = Get-MrTrustCertificate -Path $script:PublisherCertificatePath
$targets = @(
[pscustomobject]@{ Store = "Root"; Thumbprint = $rootCertificate.Thumbprint },
[pscustomobject]@{ Store = "TrustedPublisher"; Thumbprint = $publisherCertificate.Thumbprint }
)
foreach ($target in $targets) {
$storePath = Get-StorePath -Scope $scope -Store $target.Store
Get-ChildItem -Path $storePath |
Where-Object Thumbprint -eq $target.Thumbprint |
Remove-Item
}
Update-TrustStatus
}
function Test-MarkOfTheWeb {
param([Parameter(Mandatory)][string]$Path)
try {
$stream = Get-Content -LiteralPath $Path -Stream Zone.Identifier -ErrorAction Stop
($stream -join "`n") -match "ZoneId\s*=\s*[3-4]"
}
catch {
$false
}
}
function Get-SmartScreenExplanation {
param(
[bool]$SignedByMrSphay,
[bool]$HasMotw
)
if ($SignedByMrSphay -and $HasMotw) {
"Publisher trust can be valid while SmartScreen still warns because the downloaded file has Internet origin and low Microsoft reputation."
}
elseif ($SignedByMrSphay) {
"The publisher matches MrSphay. SmartScreen may still warn until Microsoft reputation builds for this exact app and publisher."
}
elseif ($HasMotw) {
"This file came from the Internet and is not signed by MrSphay. SmartScreen warnings are expected."
}
else {
"MrTrust can only help with MrSphay-signed files. SmartScreen reputation is separate from local certificate trust."
}
}
function Test-SelectedFile {
param([Parameter(Mandatory)][string]$Path)
Set-Busy $true
try {
if (-not (Test-Path -LiteralPath $Path -PathType Leaf)) {
throw "File not found: $Path"
}
$signature = Get-AuthenticodeSignature -LiteralPath $Path
$hasMotw = Test-MarkOfTheWeb -Path $Path
$signer = $signature.SignerCertificate
$signedByMrSphay = $false
if ($signer) {
$signedByMrSphay = $signer.Thumbprint -eq "A024A89200469F099EC4A172B4F96F6428AFD41B" -or $signer.Subject -like "*MrSphay*"
}
$script:FileNameLabel.Text = [IO.Path]::GetFileName($Path)
$script:FilePathLabel.Text = $Path
$script:SignatureStatusLabel.Text = "$($signature.Status)"
$script:SignerLabel.Text = if ($signer) { $signer.Subject } else { "No signer certificate" }
$script:MrSphayMatchLabel.Text = if ($signedByMrSphay) { "Yes" } else { "No" }
$script:MotwLabel.Text = if ($hasMotw) { "Yes" } else { "No" }
$script:SmartScreenLabel.Text = Get-SmartScreenExplanation -SignedByMrSphay $signedByMrSphay -HasMotw $hasMotw
if ($signedByMrSphay -and $signature.Status -eq "Valid") {
$script:FileVerdictLabel.Text = "Looks good: signed by MrSphay and locally valid."
$script:FileVerdictLabel.ForeColor = $colors.Green
}
elseif ($signedByMrSphay) {
$script:FileVerdictLabel.Text = "Signed by MrSphay, but local validation is not fully valid: $($signature.Status)"
$script:FileVerdictLabel.ForeColor = $colors.Orange
}
else {
$script:FileVerdictLabel.Text = "Not a MrSphay-signed file."
$script:FileVerdictLabel.ForeColor = $colors.Red
}
}
catch {
$script:FileVerdictLabel.Text = $_.Exception.Message
$script:FileVerdictLabel.ForeColor = $colors.Red
}
finally {
Set-Busy $false
}
}
[Windows.Forms.Application]::EnableVisualStyles()
$form = [Windows.Forms.Form]::new()
$form.Text = "MrTrust"
$form.StartPosition = "CenterScreen"
$form.ClientSize = [Drawing.Size]::new(1120, 720)
$form.MinimumSize = [Drawing.Size]::new(1040, 680)
$form.BackColor = $colors.Background
$form.Font = [Drawing.Font]::new("Segoe UI", 10)
if (Test-Path -LiteralPath $script:IconPath) {
$form.Icon = [Drawing.Icon]::new($script:IconPath)
}
$header = [Windows.Forms.Panel]::new()
$header.Dock = "Top"
$header.Height = 96
$header.BackColor = $colors.Background
$form.Controls.Add($header)
$brandLine = [Windows.Forms.Panel]::new()
$brandLine.Dock = "Bottom"
$brandLine.Height = 1
$brandLine.BackColor = $colors.Border
$header.Controls.Add($brandLine)
$logoBox = [Windows.Forms.PictureBox]::new()
$logoBox.Size = [Drawing.Size]::new(42, 42)
$logoBox.Location = [Drawing.Point]::new(28, 26)
$logoBox.SizeMode = "StretchImage"
if (Test-Path -LiteralPath $script:IconPath) {
$logoBox.Image = [Drawing.Icon]::new($script:IconPath).ToBitmap()
}
$header.Controls.Add($logoBox)
$title = New-Label -Text "MrTrust" -X 86 -Y 20 -Width 260 -Height 36 -Color $colors.Text -Font ([Drawing.Font]::new("Segoe UI", 18, [Drawing.FontStyle]::Bold))
$header.Controls.Add($title)
$subtitle = New-Label -Text "Local certificate trust for MrSphay signed Windows apps" -X 88 -Y 56 -Width 520 -Height 24 -Color $colors.Muted
$header.Controls.Add($subtitle)
$statusCard = [Windows.Forms.Panel]::new()
$statusCard.Anchor = "Top,Right"
$statusCard.Location = [Drawing.Point]::new(780, 20)
$statusCard.Size = [Drawing.Size]::new(300, 56)
$statusCard.BackColor = $colors.Panel
$statusCard.BorderStyle = "FixedSingle"
$header.Controls.Add($statusCard)
$statusText = New-Label -Text "Trust status" -X 18 -Y 7 -Width 130 -Height 20 -Color $colors.Muted -Font ([Drawing.Font]::new("Segoe UI", 8.5))
$statusCard.Controls.Add($statusText)
$script:StatusPill = [Windows.Forms.Panel]::new()
$script:StatusPill.Size = [Drawing.Size]::new(14, 14)
$script:StatusPill.Location = [Drawing.Point]::new(18, 31)
$script:StatusPill.BackColor = $colors.Orange
$statusCard.Controls.Add($script:StatusPill)
$script:StatusLabel = New-Label -Text "Checking..." -X 40 -Y 26 -Width 210 -Height 24 -Color $colors.Text -Font ([Drawing.Font]::new("Segoe UI", 10, [Drawing.FontStyle]::Bold))
$script:StatusLabel.AutoEllipsis = $true
$statusCard.Controls.Add($script:StatusLabel)
$script:ProgressBar = [Windows.Forms.ProgressBar]::new()
$script:ProgressBar.Anchor = "Top,Left,Right"
$script:ProgressBar.Location = [Drawing.Point]::new(28, 86)
$script:ProgressBar.Size = [Drawing.Size]::new(1052, 4)
$script:ProgressBar.Visible = $false
$header.Controls.Add($script:ProgressBar)
$shell = [Windows.Forms.Panel]::new()
$shell.Dock = "Fill"
$shell.BackColor = $colors.Background
$form.Controls.Add($shell)
$sidebar = [Windows.Forms.Panel]::new()
$sidebar.Dock = "Left"
$sidebar.Width = 220
$sidebar.BackColor = $colors.Shell
$shell.Controls.Add($sidebar)
$sideAccent = [Windows.Forms.Panel]::new()
$sideAccent.Dock = "Left"
$sideAccent.Width = 4
$sideAccent.BackColor = $colors.Green
$sidebar.Controls.Add($sideAccent)
$navTitle = New-Label -Text "Navigation" -X 24 -Y 26 -Width 160 -Height 22 -Color $colors.Muted -Font ([Drawing.Font]::new("Segoe UI", 8.5, [Drawing.FontStyle]::Bold))
$sidebar.Controls.Add($navTitle)
$script:NavButtons = @{}
$script:NavButtons.Trust = New-NavButton -Key "Trust" -Text "Trust" -Y 58
$script:NavButtons.Diagnostics = New-NavButton -Key "Diagnostics" -Text "File scan" -Y 110
$script:NavButtons.SmartScreen = New-NavButton -Key "SmartScreen" -Text "SmartScreen" -Y 162
foreach ($navButton in $script:NavButtons.Values) {
$sidebar.Controls.Add($navButton)
}
$sideNote = New-Label -Text "Installs public certificates only. No Defender, SmartScreen, UAC, firewall, or policy bypasses." -X 24 -Y 510 -Width 164 -Height 96 -Color $colors.Muted -Font ([Drawing.Font]::new("Segoe UI", 8.5))
$sideNote.Anchor = "Left,Bottom"
$sidebar.Controls.Add($sideNote)
$contentHost = [Windows.Forms.Panel]::new()
$contentHost.Dock = "Fill"
$contentHost.BackColor = $colors.Background
$contentHost.Padding = [Windows.Forms.Padding]::new(34, 30, 34, 30)
$shell.Controls.Add($contentHost)
$script:Pages = @{}
$trustPage = [Windows.Forms.Panel]::new()
$trustPage.Dock = "Fill"
$trustPage.BackColor = $colors.Background
$contentHost.Controls.Add($trustPage)
$script:Pages.Trust = $trustPage
$trustTitle = New-PageTitle -Title "Trust" -Description "Install, remove, and verify the MrSphay public trust certificates."
$trustPage.Controls.Add($trustTitle.Title)
$trustPage.Controls.Add($trustTitle.Description)
$trustPanel = New-Card -X 0 -Y 82 -Width 820 -Height 236
$trustPage.Controls.Add($trustPanel)
$scopeLabel = New-Label -Text "Scope" -X 24 -Y 22 -Width 160 -Height 22 -Color $colors.Muted -Font ([Drawing.Font]::new("Segoe UI", 8.5, [Drawing.FontStyle]::Bold))
$trustPanel.Controls.Add($scopeLabel)
$script:AllUsersCheckBox = [Windows.Forms.CheckBox]::new()
$script:AllUsersCheckBox.Text = "All users (LocalMachine, requires Administrator)"
$script:AllUsersCheckBox.ForeColor = $colors.Text
$script:AllUsersCheckBox.Location = [Drawing.Point]::new(24, 46)
$script:AllUsersCheckBox.AutoSize = $true
$script:AllUsersCheckBox.FlatStyle = "Flat"
$script:AllUsersCheckBox.Add_CheckedChanged({ Update-TrustStatus })
$trustPanel.Controls.Add($script:AllUsersCheckBox)
$trustPanel.Controls.Add((New-Label -Text "Root thumbprint" -X 24 -Y 90 -Width 170 -Height 24))
$script:RootThumbprintLabel = New-Label -Text "-" -X 210 -Y 90 -Width 560 -Height 24 -Color $colors.Text -Font ([Drawing.Font]::new("Consolas", 9))
$script:RootThumbprintLabel.AutoEllipsis = $true
$trustPanel.Controls.Add($script:RootThumbprintLabel)
$trustPanel.Controls.Add((New-Label -Text "Publisher thumbprint" -X 24 -Y 124 -Width 170 -Height 24))
$script:PublisherThumbprintLabel = New-Label -Text "-" -X 210 -Y 124 -Width 560 -Height 24 -Color $colors.Text -Font ([Drawing.Font]::new("Consolas", 9))
$script:PublisherThumbprintLabel.AutoEllipsis = $true
$trustPanel.Controls.Add($script:PublisherThumbprintLabel)
$trustPanel.Controls.Add((New-Label -Text "Expires" -X 24 -Y 158 -Width 170 -Height 24))
$script:ExpiryLabel = New-Label -Text "-" -X 210 -Y 158 -Width 180 -Height 24 -Color $colors.Text
$trustPanel.Controls.Add($script:ExpiryLabel)
$trustPanel.Controls.Add((New-Label -Text "Active scope" -X 24 -Y 192 -Width 170 -Height 24))
$script:ScopeValueLabel = New-Label -Text "-" -X 210 -Y 192 -Width 200 -Height 24 -Color $colors.Text
$trustPanel.Controls.Add($script:ScopeValueLabel)
$summaryPanel = New-Card -X 0 -Y 338 -Width 820 -Height 76 -BackColor $colors.PanelAlt
$trustPage.Controls.Add($summaryPanel)
$script:TrustSummaryLabel = New-Label -Text "Checking trust state..." -X 22 -Y 18 -Width 760 -Height 34 -Color $colors.Text -Font ([Drawing.Font]::new("Segoe UI", 10, [Drawing.FontStyle]::Bold))
$summaryPanel.Controls.Add($script:TrustSummaryLabel)
$installButton = [Windows.Forms.Button]::new()
$installButton.Text = "Install trust"
$installButton.Size = [Drawing.Size]::new(160, 44)
$installButton.Location = [Drawing.Point]::new(0, 438)
Add-AnimatedButton -Button $installButton -Normal $colors.Green -Hover $colors.GreenHover
$installButton.Add_Click({ Install-MrTrustCertificates })
$trustPage.Controls.Add($installButton)
$removeButton = [Windows.Forms.Button]::new()
$removeButton.Text = "Remove trust"
$removeButton.Size = [Drawing.Size]::new(160, 44)
$removeButton.Location = [Drawing.Point]::new(176, 438)
Add-AnimatedButton -Button $removeButton -Normal $colors.PanelAlt -Hover $colors.Border
$removeButton.Add_Click({ Remove-MrTrustCertificates })
$trustPage.Controls.Add($removeButton)
$refreshButton = [Windows.Forms.Button]::new()
$refreshButton.Text = "Refresh"
$refreshButton.Size = [Drawing.Size]::new(124, 44)
$refreshButton.Location = [Drawing.Point]::new(352, 438)
Add-AnimatedButton -Button $refreshButton -Normal $colors.PanelAlt -Hover $colors.Border
$refreshButton.Add_Click({ Update-TrustStatus })
$trustPage.Controls.Add($refreshButton)
$note = New-Label -Text "Trust actions are reversible and scoped to the selected Windows certificate store." -X 0 -Y 508 -Width 820 -Height 26 -Color $colors.Muted
$trustPage.Controls.Add($note)
$diagnosticsPage = [Windows.Forms.Panel]::new()
$diagnosticsPage.Dock = "Fill"
$diagnosticsPage.BackColor = $colors.Background
$diagnosticsPage.Visible = $false
$contentHost.Controls.Add($diagnosticsPage)
$script:Pages.Diagnostics = $diagnosticsPage
$diagnosticsTitle = New-PageTitle -Title "File scan" -Description "Inspect a Windows executable, installer, catalog, or DLL for signature and origin signals."
$diagnosticsPage.Controls.Add($diagnosticsTitle.Title)
$diagnosticsPage.Controls.Add($diagnosticsTitle.Description)
$filePanel = New-Card -X 0 -Y 82 -Width 820 -Height 420
$diagnosticsPage.Controls.Add($filePanel)
$chooseButton = [Windows.Forms.Button]::new()
$chooseButton.Text = "Choose file"
$chooseButton.Size = [Drawing.Size]::new(150, 42)
$chooseButton.Location = [Drawing.Point]::new(24, 24)
Add-AnimatedButton -Button $chooseButton -Normal $colors.Green -Hover $colors.GreenHover
$filePanel.Controls.Add($chooseButton)
$scanButton = [Windows.Forms.Button]::new()
$scanButton.Text = "Scan again"
$scanButton.Size = [Drawing.Size]::new(130, 42)
$scanButton.Location = [Drawing.Point]::new(190, 24)
Add-AnimatedButton -Button $scanButton -Normal $colors.PanelAlt -Hover $colors.Border
$filePanel.Controls.Add($scanButton)
$script:FileVerdictLabel = New-Label -Text "Choose a Windows app or installer to inspect." -X 24 -Y 88 -Width 760 -Height 30 -Color $colors.Muted -Font ([Drawing.Font]::new("Segoe UI", 11, [Drawing.FontStyle]::Bold))
$filePanel.Controls.Add($script:FileVerdictLabel)
$filePanel.Controls.Add((New-Label -Text "File" -X 24 -Y 136 -Width 170 -Height 24))
$script:FileNameLabel = New-Label -Text "-" -X 210 -Y 136 -Width 560 -Height 24 -Color $colors.Text
$script:FileNameLabel.AutoEllipsis = $true
$filePanel.Controls.Add($script:FileNameLabel)
$filePanel.Controls.Add((New-Label -Text "Path" -X 24 -Y 170 -Width 170 -Height 24))
$script:FilePathLabel = New-Label -Text "-" -X 210 -Y 170 -Width 560 -Height 40 -Color $colors.Text
$script:FilePathLabel.AutoEllipsis = $true
$filePanel.Controls.Add($script:FilePathLabel)
$filePanel.Controls.Add((New-Label -Text "Signature status" -X 24 -Y 222 -Width 170 -Height 24))
$script:SignatureStatusLabel = New-Label -Text "-" -X 210 -Y 222 -Width 560 -Height 24 -Color $colors.Text
$filePanel.Controls.Add($script:SignatureStatusLabel)
$filePanel.Controls.Add((New-Label -Text "Signer" -X 24 -Y 256 -Width 170 -Height 24))
$script:SignerLabel = New-Label -Text "-" -X 210 -Y 256 -Width 560 -Height 36 -Color $colors.Text
$script:SignerLabel.AutoEllipsis = $true
$filePanel.Controls.Add($script:SignerLabel)
$filePanel.Controls.Add((New-Label -Text "MrSphay match" -X 24 -Y 306 -Width 170 -Height 24))
$script:MrSphayMatchLabel = New-Label -Text "-" -X 210 -Y 306 -Width 160 -Height 24 -Color $colors.Text
$filePanel.Controls.Add($script:MrSphayMatchLabel)
$filePanel.Controls.Add((New-Label -Text "Mark-of-the-Web" -X 390 -Y 306 -Width 160 -Height 24))
$script:MotwLabel = New-Label -Text "-" -X 560 -Y 306 -Width 160 -Height 24 -Color $colors.Text
$filePanel.Controls.Add($script:MotwLabel)
$filePanel.Controls.Add((New-Label -Text "SmartScreen note" -X 24 -Y 352 -Width 170 -Height 24))
$script:SmartScreenLabel = New-Label -Text "-" -X 210 -Y 352 -Width 560 -Height 48 -Color $colors.Muted
$filePanel.Controls.Add($script:SmartScreenLabel)
$chooseButton.Add_Click({
$dialog = [Windows.Forms.OpenFileDialog]::new()
$dialog.Filter = "Windows apps and installers (*.exe;*.msi;*.dll;*.cat)|*.exe;*.msi;*.dll;*.cat|All files (*.*)|*.*"
if ($dialog.ShowDialog() -eq [Windows.Forms.DialogResult]::OK) {
$script:SelectedFilePath = $dialog.FileName
Test-SelectedFile -Path $script:SelectedFilePath
}
})
$scanButton.Add_Click({
if ($script:SelectedFilePath) {
Test-SelectedFile -Path $script:SelectedFilePath
}
})
$helpPage = [Windows.Forms.Panel]::new()
$helpPage.Dock = "Fill"
$helpPage.BackColor = $colors.Background
$helpPage.Visible = $false
$contentHost.Controls.Add($helpPage)
$script:Pages.SmartScreen = $helpPage
$helpTitle = New-PageTitle -Title "SmartScreen" -Description "Understand what MrTrust can verify and what Windows reputation still controls."
$helpPage.Controls.Add($helpTitle.Title)
$helpPage.Controls.Add($helpTitle.Description)
$helpPanel = New-Card -X 0 -Y 82 -Width 820 -Height 330
$helpPage.Controls.Add($helpPanel)
$helpPanel.Controls.Add((New-Label -Text "Local trust" -X 24 -Y 24 -Width 180 -Height 24 -Color $colors.Text -Font ([Drawing.Font]::new("Segoe UI", 11, [Drawing.FontStyle]::Bold))))
$helpPanel.Controls.Add((New-Label -Text "MrTrust installs the public MrSphay root and publisher certificates into the selected Windows certificate stores." -X 24 -Y 54 -Width 740 -Height 42 -Color $colors.Muted))
$helpPanel.Controls.Add((New-Label -Text "Windows reputation" -X 24 -Y 118 -Width 220 -Height 24 -Color $colors.Text -Font ([Drawing.Font]::new("Segoe UI", 11, [Drawing.FontStyle]::Bold))))
$helpPanel.Controls.Add((New-Label -Text "SmartScreen can still warn for a new or rarely downloaded file, even when the signature is valid and the publisher is recognized." -X 24 -Y 148 -Width 740 -Height 42 -Color $colors.Muted))
$helpPanel.Controls.Add((New-Label -Text "What to check" -X 24 -Y 212 -Width 180 -Height 24 -Color $colors.Text -Font ([Drawing.Font]::new("Segoe UI", 11, [Drawing.FontStyle]::Bold))))
$helpPanel.Controls.Add((New-Label -Text "Use File scan to verify signature status, MrSphay signer matching, and Mark-of-the-Web. MrTrust never disables SmartScreen." -X 24 -Y 242 -Width 740 -Height 46 -Color $colors.Muted))
$pulseTimer = [Windows.Forms.Timer]::new()
$pulseTimer.Interval = 100
$pulseTimer.Add_Tick({
$script:CurrentAccent = ($script:CurrentAccent + 1) % 40
$value = 130 + [Math]::Abs(20 - $script:CurrentAccent) * 4
$sideAccent.BackColor = [Drawing.Color]::FromArgb(0, [Math]::Min(205, $value), 91)
})
$pulseTimer.Start()
$form.Add_Shown({
Show-MrTrustPage -Key "Trust"
Update-TrustStatus
})
[Windows.Forms.Application]::Run($form)