derwowusste
Goto Top

Popup erzeugen in Windows, dessen Inhalt nicht mitgeloggt wird

Moin.

Kurz und Knapp:
msg * test
Sendet eine Bildschirmnachricht an alle Sitzungen. Der Inhalt (hier: "test") landet im Systemeventlog.

Wie erreiche ich das Selbe ohne dass es geloggt wird?
Add-Type -AssemblyName PresentationFramework;[System.Windows.MessageBox]::Show('Hello World')  
wird offenbar nicht geloggt, geht aber nicht an alle Sitzungen, sondern nur an die eigene - wie wäre dort die Syntax für "an alle"?

Content-Key: 611175

Url: https://administrator.de/contentid/611175

Printed on: April 19, 2024 at 14:04 o'clock

Mitglied: 146189
146189 Oct 08, 2020 updated at 10:17:39 (UTC)
Goto Top
Member: DerWoWusste
DerWoWusste Oct 08, 2020 updated at 11:33:13 (UTC)
Goto Top
Hi.

Ich habe mit dem ersten ein paar Probleme:

Wenn ich das BalloonTest.ps1 mittels
psexec -s -i 6 powershell.exe D:\test\BalloonTest.ps1
starte, dann kommt der Output in der richtigen Session (hier: 6) an, aber es ist kein bleibendes Popup, was der Nutzer quittieren muss, sondern ein Toast/Ballontipp, der nach 5 Sekunden verschwindet und das auch unabhängig von der gesetzten Zahl an Milliseconds (Wird warum auch immer ignoriert)
Dass ich die Sitzungsnummern suchen muss, ist auch nicht schön, (besser wäre, an alle), aber zu verschmerzen.
Weißt Du, wie ich die Dauer anpasse?

Das zweite setzt voraus, dass Import-Module RemoteDesktop funktioniert, was aber nicht überall gegeben ist - außer auf Terminalservern, da natürlich passend. Wäre schön, wenn es auf Clients ginge - wie installiere ich dort das Modul nach?
Mitglied: 146189
Solution 146189 Oct 08, 2020 updated at 11:41:10 (UTC)
Goto Top
Zitat von @DerWoWusste:
Wenn ich das BalloonTest.ps1 mittels
psexec -s -i 6 powershell.exe D:\test\BalloonTest.ps1
starte, dann kommt der Output in der richtigen Session (hier: 6) an, aber es ist kein bleibendes Popup, was der Nutzer quittieren muss,
Bau dir halt stattdessen ein Powershell-Window mit Always-OnTop.
https://www.windowspro.de/script/grafische-oberflaeche-gui-fuer-powershe ...
Das zweite setzt voraus, dass Import-Module RemoteDesktop funktioniert, was aber nicht überall gegeben ist - außer auf Terminalservern, da natürlich passend. Wäre schön, wenn es auf Clients ginge - wie installiere ich dort das Modul nach?
Über RSAT
https://www.windowspro.de/tipp/remotedesktop-modul-fuer-powershell-windo ...
Member: DerWoWusste
DerWoWusste Oct 08, 2020 at 12:03:22 (UTC)
Goto Top
Danke!

RSAT kann ich hier nicht mehr allgemein nutzen, da online-Verbindungen genehmigt werden müssen. Wie ich von einem genehmigten Rechner die Module extrahiere, werde ich aber noch rausfinden.

Eichs Code (windowspro) funktioniert. Lediglich noch die Frage, wie kann ich das an alle Sitzungen senden? Vermutlich gar nicht, ohne die SessionIDs auszulesen. Das ist aber nicht weiter schlimm.
Mitglied: 146189
146189 Oct 08, 2020 updated at 15:04:21 (UTC)
Goto Top
Vermutlich gar nicht, ohne die SessionIDs auszulesen.
Jepp Session s auslesen und an psexec übergeben.
Member: DerWoWusste
DerWoWusste Oct 08, 2020 updated at 15:18:15 (UTC)
Goto Top
Jou.

Das erstgenannte PS-Kommando von mir würde es ja auch tun in Verbindung mit psexec, leider landet auch bei diesem der Popuptext im Eventlog (nicht im Systemlog, aber im Powershell--Log).
Das windowspro-Teil hingegen scheint sich nirgendwo zu verewigen, habe alle Logs nach dem String durchsuchen lassen.

Insofern: gelöst. Danke!
Member: colinardo
colinardo Oct 09, 2020 updated at 17:21:45 (UTC)
Goto Top
Servus DWW,
wenn es eine aktuelle Maschine ist (Windows 8.1/10/Server 2016/2019) kannst du die Benachrichtigung auch als modernen "Toast" an alle angemeldeten Benutzer hiermit abfeuern:
# title of toast message
$title = 'Test'  
# message of toast
$message = 'Meine Nachricht'  

# restart elevated if not
if(!(new-object System.Security.Principal.WindowsPrincipal([System.Security.Principal.WindowsIdentity]::GetCurrent())).IsInRole(544)){
    start powershell -Verb runas -ArgumentList '-File',$MyInvocation.MyCommand.Definition  
    exit
}
# create vbs wrapper for full silent operation
@"  
CreateObject("WScript.Shell").Run "powershell.exe -EP Bypass -NoProfile -C ""[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime];`$xml = [xml]([Windows.UI.Notifications.ToastNotificationManager]::GetTemplateContent([Windows.UI.Notifications.ToastTemplateType]::ToastText02)).GetXML();`$xml.SelectSingleNode('/toast/visual/binding/text[@id=1]').InnerText = '$title';`$xml.SelectSingleNode('/toast/visual/binding/text[@id=2]').InnerText = '$message';`$cmds = `$xml.CreateElement('commands');`$cmd = `$xml.CreateElement('command');`$cmd.SetAttribute('id','dismiss');`$cmds.AppendChild(`$cmd);`$xml.DocumentElement.AppendChild(`$cmds);`$dom = New-Object Windows.Data.Xml.Dom.XmlDocument;`$dom.LoadXml(`$xml.OuterXml);[Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier('PowerShell').Show((New-Object Windows.UI.Notifications.ToastNotification `$dom -Property @{Tag = 'PowerShell';Group = 'PowerShell';ExpirationTime = [DateTimeOffset]::Now.AddHours(24);Priority = 'High'})) """,0,false  
"@ | sc "C:\Users\Public\toast.vbs"  
# create scheduled task to run vbs interactive in "Users" Group context  
$task = Register-ScheduledTask -TaskName "ToastToAllUsers" -Action (New-ScheduledTaskAction -Execute "wscript" -Argument "C:\Users\Public\toast.vbs") -Principal (New-ScheduledTaskPrincipal -GroupId 'S-1-5-32-545')  
# start scheduled task
$task | Start-ScheduledTask
# remove scheduled task
$task | Unregister-ScheduledTask -Confirm:$false
dem Toast kann man auch noch andere Dinge wie Logos, weitere Buttons etc. hinzufügen wenn man will, die Anzeigezeit lässt sich ebenso anpassen, und auch ob die Nachricht einen Reboot überleben soll. Details siehe https://docs.microsoft.com/en-us/uwp/api/windows.ui.notifications.toastn ...

Das ganze kann man zwar auch per Token Duplication und Impersonation machen, aber der Code wird dann doch um einiges länger face-wink, das sollte hier aber für deinen Zweck reichen.

Grüße Uwe
Member: DerWoWusste
DerWoWusste Oct 09, 2020 at 16:45:36 (UTC)
Goto Top
Hi Uwe.

Ich finde auf den ersten Blick nicht, wie ich den Toast dauerhaft einblenden lasse, bis der Nutzer ihn quittiert. geht das überhaupt?
Member: colinardo
colinardo Oct 09, 2020 updated at 16:56:00 (UTC)
Goto Top
Zitat von @DerWoWusste:
Ich finde auf den ersten Blick nicht, wie ich den Toast dauerhaft einblenden lasse, bis der Nutzer ihn quittiert. geht das überhaupt?
Da haben wir uns wohl missverstanden, mit Dauerhaft meinte ich in der "Toast-Notification-Area". Aber das obige kannst du ja mit einer beliebigen Powershell Form die sich dann eben nicht ausblendet. Wenn du willst mach ich dir dafür auch mal ein Beispiel etwa mit einer FullScreen Form.
Member: DerWoWusste
DerWoWusste Oct 09, 2020 at 17:07:34 (UTC)
Goto Top
Da sag ich natürlich nicht nein, gerne!
Member: colinardo
Solution colinardo Oct 09, 2020 updated at 17:19:04 (UTC)
Goto Top
Den Fenster-Code habe ich mal Base64 kodiert eingebaut damit ich hier nicht escapen muss wie ein Wilder. Kann man natürlich auch über ne externe PS1 bauen wie man halt lustig ist face-smile,
# message to show
$message = 'Donec commodo eget felis sed vehicula. Suspendisse pretium ultrices quam in iaculis. Aliquam a vulputate nisl.'  

# restart elevated if not
if(!(new-object System.Security.Principal.WindowsPrincipal([System.Security.Principal.WindowsIdentity]::GetCurrent())).IsInRole(544)){
    start powershell -Verb runas -ArgumentList '-File',$MyInvocation.MyCommand.Definition  
    exit
}

# create vbs wrapper for silent operation
@"  
CreateObject("WScript.Shell").Run "powershell.exe -EP Bypass -NoProfile -C iex ([System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String('LntBZGQtVHlwZSAtQSAnU3lzdGVtLldpbmRvd3MuRm9ybXMnLCdTeXN0ZW0uRHJhd2luZyc7JGZvcm0gPSBOZXctT2JqZWN0IFN5c3RlbS5XaW5kb3dzLkZvcm1zLkZvcm0gLVByb3BlcnR5IEB7U2l6ZSA9ICcyMDAsMjAwJzs7V2luZG93U3RhdGUgPSAnTWF4aW1pemVkJztUb3BNb3N0ID0gJHRydWU7QmFja0NvbG9yID0gW1N5c3RlbS5EcmF3aW5nLkNvbG9yXTo6Qmx1ZTtDb250cm9sQm94ID0gJGZhbHNlO0Zvcm1Cb3JkZXJTdHlsZSA9J05vbmUnfTskdHh0SW5mbyA9IE5ldy1PYmplY3QgU3lzdGVtLldpbmRvd3MuRm9ybXMuTGFiZWwgLVByb3BlcnR5IEB7RG9jayA9IFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5Eb2NrU3R5bGVdOjpGaWxsO1RleHRBbGlnbiA9ICdNaWRkbGVDZW50ZXInO0ZvbnQgPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLkZvbnQoIkNhbGlicmkiLDI1LFtTeXN0ZW0uRHJhd2luZy5Gb250U3R5bGVdOjpSZWd1bGFyKTtUZXh0ID0gJGFyZ3NbMF07Rm9yZUNvbG9yID0gW1N5c3RlbS5EcmF3aW5nLkNvbG9yXTo6V2hpdGU7U2l6ZSA9ICcyMDAsMjAwJ307JGJ0biA9IE5ldy1PYmplY3QgU3lzdGVtLldpbmRvd3MuRm9ybXMuQnV0dG9uIC1Qcm9wZXJ0eSBAe1NpemUgPSAnMTUwLDUwJztMb2NhdGlvbiA9ICcwLDAnO1RleHQgPSAnT0snO0ZvbnQgPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLkZvbnQoIkNhbGlicmkiLDE1LFtTeXN0ZW0uRHJhd2luZy5Gb250U3R5bGVdOjpCb2xkKTtGb3JlQ29sb3IgPSBbU3lzdGVtLkRyYXdpbmcuQ29sb3JdOjpXaGl0ZTtCYWNrQ29sb3IgPSBbU3lzdGVtLkRyYXdpbmcuQ29sb3JdOjpHcmVlbn07JGZvcm0uYWRkX0xvYWQoeyRidG4uTGVmdCA9IChbU3lzdGVtLldpbmRvd3MuRm9ybXMuU2NyZWVuXTo6UHJpbWFyeVNjcmVlbi5Cb3VuZHMuV2lkdGggLyAyKSAtICgkYnRuLldpZHRoLzIpOyRidG4uVG9wID0gW1N5c3RlbS5XaW5kb3dzLkZvcm1zLlNjcmVlbl06OlByaW1hcnlTY3JlZW4uQm91bmRzLkhlaWdodCAtIDIwMH0pOyRidG4uYWRkX0NsaWNrKHskZm9ybS5DbG9zZSgpfSk7JGZvcm0uQ29udHJvbHMuQWRkKCRidG4pOyRmb3JtLkNvbnRyb2xzLkFkZCgkdHh0SW5mbyk7JGZvcm0uU2hvd0RpYWxvZygpIHwgb3V0LW51bGx9')) + \""'$message'\"") """,0,false  
"@ | sc "C:\Users\Public\toast.vbs"  
# create scheduled task to run vbs interactive in "Users" Group context 
$task = Register-ScheduledTask -TaskName "ToastToAllUsers" -Action (New-ScheduledTaskAction -Execute "wscript" -Argument "C:\Users\Public\toast.vbs") -Principal (New-ScheduledTaskPrincipal -GroupId 'S-1-5-32-545')  
# start scheduled task
$task | Start-ScheduledTask
# remove scheduled task
$task | Unregister-ScheduledTask -Confirm:$false


Hier nur als Ergänzung das was im Grunde im Base64 Code drin steht, ein FullScreen-Fenster ohne Rand mit Text und Button:
Add-Type -A System.Windows.Forms
$form = New-Object System.Windows.Forms.Form -Property @{
    Size = '200,200'  
    WindowState = 'Maximized'  
    TopMost = $true
    BackColor = [System.Drawing.Color]::Blue
    ControlBox = $false
    FormBorderStyle ='None'  
}
$txtInfo = New-Object System.Windows.Forms.Label -Property @{
    Dock = [System.Windows.Forms.DockStyle]::Fill
    TextAlign = 'MiddleCenter'  
    Font = New-Object System.Drawing.Font("Calibri",25,[System.Drawing.FontStyle]::Regular)  
    Text = "Donec commodo eget felis sed vehicula. Suspendisse pretium ultrices quam in iaculis. Aliquam a vulputate nisl. Etiam quam nunc, dictum ac nulla vel, posuere hendrerit metus. Quisque ante lacus, adipiscing id elit vel, ornare consectetur nisi. Etiam pretium, sapien vitae lobortis tempor, nibh justo cursus orci, non dapibus magna sapien quis enim. Phasellus rutrum elit justo, id pellentesque magna tempus dapibus. Etiam sed augue eros. Cras nec varius eros. Aenean sodales tincidunt dolor. Nunc ac metus tristique, porttitor justo eu, luctus diam. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Ut egestas libero quis velit volutpat, at scelerisque mauris porttitor."  
    ForeColor = [System.Drawing.Color]::White
    Size = '200,200'  
}
$btn = New-Object System.Windows.Forms.Button -Property @{
    Size = '150,50'  
    Location = '0,0'  
    Text = 'OK'  
    Font = New-Object System.Drawing.Font("Calibri",15,[System.Drawing.FontStyle]::Bold)  
    ForeColor = [System.Drawing.Color]::White
    BackColor = [System.Drawing.Color]::Green
}
$form.add_Load({
    $btn.Left = ([System.Windows.Forms.Screen]::PrimaryScreen.Bounds.Width / 2) - ($btn.Width/2)
    $btn.Top = [System.Windows.Forms.Screen]::PrimaryScreen.Bounds.Height - 200
})
$btn.add_Click({
    $form.Close()
})
$form.Controls.Add($btn)
$form.Controls.Add($txtInfo)

$form.ShowDialog() | out-null
Sieht dann so aus
screenshot
Member: DerWoWusste
DerWoWusste Oct 09, 2020 at 17:48:37 (UTC)
Goto Top
Boah, "entdecke die Möglichkeiten" face-wink
Sehr gut, herzlichen Dank, dann komme ich auch ohne psexec und Sitzungsauslesen aus.
Member: DerWoWusste
DerWoWusste Oct 10, 2020 at 12:20:21 (UTC)
Goto Top
Uwe, ich merke gerade, dass dieses Skript an der Anforderung vorbeigeht, dass der Inhalt des Popups nicht geloggt werden soll. Es landet leider in "Application and services Logs - Microsoft-Windows-PowerShell/Operational). Hast Du auch dafür eine Lösung?

Grüße und schönes WE
DWW
Member: colinardo
colinardo Oct 10, 2020 updated at 12:45:59 (UTC)
Goto Top
Dann schalt das Modul Logging halt ab...
Computer Configuration -> Administrative Templates -> Windows Components -> Windows PowerShell

Oder lösche den Eventlogeintrag mit der PS hinterher im Skript.
Member: DerWoWusste
DerWoWusste Oct 10, 2020 updated at 12:56:25 (UTC)
Goto Top
Ich habe diese Policy schon disabled - es wird trotzdem geloggt.
Das ganze Log zu löschen, ist nicht schön und einzelne Einträge kann man nicht löschen.
Da hilft wohl nur Logverschlüsselung wie beschrieben unter https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell. ...

Edit: ups, da ist ja noch eine 2. Policy...Moment...
Member: DerWoWusste
DerWoWusste Oct 10, 2020 at 12:58:28 (UTC)
Goto Top
Ah, das passt ja doch: "Turn on Powershell Script Block Logging" muss disabled werden.
Member: DerWoWusste
DerWoWusste Oct 22, 2020 at 14:18:28 (UTC)
Goto Top
Hallo Uwe.

Ich möchte dir nochmals danken. Ich habe dich auch in meinem Artikel, wo ich das Skript einsetze, dankend verlinkt: https://www.experts-exchange.com/articles/33771/We-have-bitlocker-so-we- ...
Member: Lochkartenstanzer
Lochkartenstanzer Oct 22, 2020 at 17:31:58 (UTC)
Goto Top
Zitat von @DerWoWusste:

Hallo Uwe.

Ich möchte dir nochmals danken. Ich habe dich auch in meinem Artikel, wo ich das Skript einsetze, dankend verlinkt: https://www.experts-exchange.com/articles/33771/We-have-bitlocker-so-we- ...


Hallo DWW, bin mal dem Link auf dem Tatschfon gefolgt und bekam den Bildschirm mit der Anzeige von "Continue Growing Your Skills and Your Career" vollgemüllt, so daß überhaupt kein Content zu sehen war. Im Browser am PC nimmt diese Banner/Popin immer noch die Hälfte des Fensters ein, so daß man außer der Überschrift des Artikels kaum was sieht.

Ich denke Ihr solltet Euer Design mal überarbeiten. So "verführt" Ihr die Leute nur, möglichst schnell die Seite wieder zuzumachen.

lks
Member: DerWoWusste
DerWoWusste Oct 22, 2020 at 17:51:26 (UTC)
Goto Top
Ist nicht mein Forum. Aber im Handy kann ich den Banner wegschieben (kleiner Pfeil) und am PC sicher auch.

Werde das Feedback aber weitergeben und die darauf hinweisen, dass nicht jeder solche Pfeile versteht.
Member: Lochkartenstanzer
Lochkartenstanzer Oct 22, 2020 at 18:11:14 (UTC)
Goto Top
Zitat von @DerWoWusste:

Ist nicht mein Forum. Aber im Handy kann ich den Banner wegschieben (kleiner Pfeil) und am PC sicher auch.

Werde das Feedback aber weitergeben und die darauf hinweisen, dass nicht jeder solche Pfeile versteht.


Daß man das wegschieben kann, ist mir schon klar, aber wenn ich erst etwas wegklicken muß, damit man das wichtige sieht, läuft etwas falsch.

lks