75 lines
6.1 KiB
PowerShell
75 lines
6.1 KiB
PowerShell
# IT Nexus Announcement Watcher
|
||
# Wird alle 15 Sekunden als SYSTEM ausgefuehrt
|
||
# Zeigt Ankuendigungen als Desktop-Popup fuer den eingeloggten Benutzer
|
||
|
||
param()
|
||
$cfg = Get-Content 'C:\ProgramData\IT Nexus Agent\config.json' -Raw | ConvertFrom-Json
|
||
$url = $cfg.server_url.TrimEnd('/')
|
||
$key = $cfg.agent_key
|
||
|
||
function Show-AnnDialog($ann) {
|
||
$id = $ann.id
|
||
$dlg = "C:\ProgramData\IT Nexus Agent\ann_$id.ps1"
|
||
if (Test-Path $dlg) { return }
|
||
|
||
$title = ($ann.title -replace "'", "''")
|
||
$message = ($ann.message -replace "'", "''")
|
||
$accent = switch ($ann.type) { 'warning'{'220,50,50'} 'maintenance'{'245,158,11'} default{'99,102,241'} }
|
||
$label = switch ($ann.type) { 'warning'{'WICHTIGE WARNUNG'} 'maintenance'{'WARTUNGSANKUENDIGUNG'} default{'INFORMATION'} }
|
||
$ackUrl = "$url/api/announcements/$id/ack-agent"
|
||
$n = [System.Environment]::NewLine
|
||
|
||
$headerColor = switch ($ann.type) { 'warning'{'220,53,69'} 'maintenance'{'255,140,0'} default{'0,120,212'} }
|
||
$iconText = switch ($ann.type) { 'warning'{'⚠'} 'maintenance'{'🔧'} default{'ℹ'} }
|
||
|
||
$code = "Add-Type -AssemblyName System.Windows.Forms,System.Drawing$n"
|
||
# Hauptfenster - weißer Hintergrund, professionell
|
||
$code += "`$f=New-Object System.Windows.Forms.Form;`$f.Text='IT Nexus Mitteilung';`$f.Size=New-Object System.Drawing.Size(480,320);`$f.StartPosition='CenterScreen';`$f.FormBorderStyle='FixedSingle';`$f.MaximizeBox=`$false;`$f.MinimizeBox=`$false;`$f.TopMost=`$true;`$f.BackColor=[System.Drawing.Color]::White$n"
|
||
# Farbiger Header-Balken
|
||
$code += "`$hdr=New-Object System.Windows.Forms.Panel;`$hdr.Size=New-Object System.Drawing.Size(480,56);`$hdr.Location=New-Object System.Drawing.Point(0,0);`$hdr.BackColor=[System.Drawing.Color]::FromArgb($headerColor);`$f.Controls.Add(`$hdr)$n"
|
||
# Logo-Text links im Header
|
||
$code += "`$logo=New-Object System.Windows.Forms.Label;`$logo.Text='IT Nexus';`$logo.Font=New-Object System.Drawing.Font('Segoe UI',11,[System.Drawing.FontStyle]::Bold);`$logo.ForeColor=[System.Drawing.Color]::White;`$logo.Location=New-Object System.Drawing.Point(16,8);`$logo.Size=New-Object System.Drawing.Size(120,20);`$hdr.Controls.Add(`$logo)$n"
|
||
# Typ-Label im Header
|
||
$code += "`$lbl=New-Object System.Windows.Forms.Label;`$lbl.Text='$label';`$lbl.Font=New-Object System.Drawing.Font('Segoe UI',8);`$lbl.ForeColor=[System.Drawing.Color]::FromArgb(220,240,255);`$lbl.Location=New-Object System.Drawing.Point(16,30);`$lbl.Size=New-Object System.Drawing.Size(420,18);`$hdr.Controls.Add(`$lbl)$n"
|
||
# Titel
|
||
$code += "`$lt=New-Object System.Windows.Forms.Label;`$lt.Text='$title';`$lt.Font=New-Object System.Drawing.Font('Segoe UI',12,[System.Drawing.FontStyle]::Bold);`$lt.ForeColor=[System.Drawing.Color]::FromArgb(30,30,30);`$lt.Location=New-Object System.Drawing.Point(16,72);`$lt.Size=New-Object System.Drawing.Size(444,28);`$f.Controls.Add(`$lt)$n"
|
||
# Trennlinie
|
||
$code += "`$sep=New-Object System.Windows.Forms.Panel;`$sep.Size=New-Object System.Drawing.Size(448,1);`$sep.Location=New-Object System.Drawing.Point(16,104);`$sep.BackColor=[System.Drawing.Color]::FromArgb(220,220,220);`$f.Controls.Add(`$sep)$n"
|
||
# Nachricht
|
||
$code += "`$lm=New-Object System.Windows.Forms.Label;`$lm.Text='$message';`$lm.Font=New-Object System.Drawing.Font('Segoe UI',10);`$lm.ForeColor=[System.Drawing.Color]::FromArgb(60,60,60);`$lm.Location=New-Object System.Drawing.Point(16,112);`$lm.Size=New-Object System.Drawing.Size(444,120);`$lm.AutoSize=`$false;`$f.Controls.Add(`$lm)$n"
|
||
# Button
|
||
$code += "`$btn=New-Object System.Windows.Forms.Button;`$btn.Text='✓ Gelesen und bestätigt';`$btn.Font=New-Object System.Drawing.Font('Segoe UI',10,[System.Drawing.FontStyle]::Bold);`$btn.ForeColor=[System.Drawing.Color]::White;`$btn.BackColor=[System.Drawing.Color]::FromArgb($headerColor);`$btn.FlatStyle='Flat';`$btn.FlatAppearance.BorderSize=0;`$btn.Location=New-Object System.Drawing.Point(16,244);`$btn.Size=New-Object System.Drawing.Size(444,36);`$btn.DialogResult=[System.Windows.Forms.DialogResult]::OK;`$f.Controls.Add(`$btn);`$f.AcceptButton=`$btn$n"
|
||
$code += "if(`$f.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK){$n"
|
||
$code += " `$b=[System.Text.Encoding]::UTF8.GetBytes('{""hostname"":""+`$env:COMPUTERNAME+'""}')$n"
|
||
$code += " `$r=[System.Net.WebRequest]::Create('$ackUrl')$n"
|
||
$code += " `$r.Method='POST';`$r.ContentType='application/json';`$r.Headers.Add('X-Agent-Key','$key');`$r.ContentLength=`$b.Length$n"
|
||
$code += " `$s=`$r.GetRequestStream();`$s.Write(`$b,0,`$b.Length);`$s.Close()$n"
|
||
$code += " try{`$r.GetResponse().Close()}catch{}$n"
|
||
$code += " Remove-Item '$dlg' -Force -ErrorAction SilentlyContinue$n"
|
||
$code += "}$n"
|
||
|
||
$code | Out-File -FilePath $dlg -Encoding UTF8 -Force
|
||
|
||
$loggedUser = (Get-CimInstance Win32_ComputerSystem).UserName
|
||
if ($loggedUser) {
|
||
$tn = "ITNexus-AnnDlg-$id"
|
||
Unregister-ScheduledTask -TaskName $tn -Confirm:$false -ErrorAction SilentlyContinue
|
||
$a = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument "-ExecutionPolicy Bypass -WindowStyle Hidden -File `"$dlg`""
|
||
$t = New-ScheduledTaskTrigger -Once -At (Get-Date).AddSeconds(2)
|
||
$p = New-ScheduledTaskPrincipal -UserId $loggedUser -LogonType Interactive -RunLevel Limited
|
||
$s = New-ScheduledTaskSettingsSet -ExecutionTimeLimit (New-TimeSpan -Minutes 60) -StartWhenAvailable
|
||
Register-ScheduledTask -TaskName $tn -Action $a -Trigger $t -Principal $p -Settings $s -Force | Out-Null
|
||
}
|
||
}
|
||
|
||
try {
|
||
$body = [System.Text.Encoding]::UTF8.GetBytes('{"hostname":"'+$env:COMPUTERNAME+'"}')
|
||
$req = [System.Net.WebRequest]::Create("$url/api/monitoring/announcements-poll")
|
||
$req.Method = 'POST'; $req.ContentType = 'application/json'
|
||
$req.Headers.Add('X-Agent-Key', $key); $req.ContentLength = $body.Length
|
||
$st = $req.GetRequestStream(); $st.Write($body, 0, $body.Length); $st.Close()
|
||
$rd = New-Object System.IO.StreamReader($req.GetResponse().GetResponseStream())
|
||
$data = $rd.ReadToEnd() | ConvertFrom-Json
|
||
if ($data.announcements) { foreach ($a in $data.announcements) { Show-AnnDialog $a } }
|
||
} catch {}
|