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-ID: 611175

Url: https://administrator.de/forum/popup-erzeugen-in-windows-dessen-inhalt-nicht-mitgeloggt-wird-611175.html

Ausgedruckt am: 26.12.2024 um 23:12 Uhr

146189
146189 08.10.2020 aktualisiert um 12:17:39 Uhr
Goto Top
DerWoWusste
DerWoWusste 08.10.2020 aktualisiert um 13:33:13 Uhr
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?
146189
Lösung 146189 08.10.2020 aktualisiert um 13:41:10 Uhr
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 ...
DerWoWusste
DerWoWusste 08.10.2020 um 14:03:22 Uhr
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.
146189
146189 08.10.2020 aktualisiert um 17:04:21 Uhr
Goto Top
Vermutlich gar nicht, ohne die SessionIDs auszulesen.
Jepp Session s auslesen und an psexec übergeben.
DerWoWusste
DerWoWusste 08.10.2020 aktualisiert um 17:18:15 Uhr
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!
colinardo
colinardo 09.10.2020 aktualisiert um 19:21:45 Uhr
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
DerWoWusste
DerWoWusste 09.10.2020 um 18:45:36 Uhr
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?
colinardo
colinardo 09.10.2020 aktualisiert um 18:56:00 Uhr
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.
DerWoWusste
DerWoWusste 09.10.2020 um 19:07:34 Uhr
Goto Top
Da sag ich natürlich nicht nein, gerne!
colinardo
Lösung colinardo 09.10.2020 aktualisiert um 19:19:04 Uhr
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
DerWoWusste
DerWoWusste 09.10.2020 um 19:48:37 Uhr
Goto Top
Boah, "entdecke die Möglichkeiten" face-wink
Sehr gut, herzlichen Dank, dann komme ich auch ohne psexec und Sitzungsauslesen aus.
DerWoWusste
DerWoWusste 10.10.2020 um 14:20:21 Uhr
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
colinardo
colinardo 10.10.2020 aktualisiert um 14:45:59 Uhr
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.
DerWoWusste
DerWoWusste 10.10.2020 aktualisiert um 14:56:25 Uhr
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...
DerWoWusste
DerWoWusste 10.10.2020 um 14:58:28 Uhr
Goto Top
Ah, das passt ja doch: "Turn on Powershell Script Block Logging" muss disabled werden.
DerWoWusste
DerWoWusste 22.10.2020 um 16:18:28 Uhr
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- ...
Lochkartenstanzer
Lochkartenstanzer 22.10.2020 um 19:31:58 Uhr
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
DerWoWusste
DerWoWusste 22.10.2020 um 19:51:26 Uhr
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.
Lochkartenstanzer
Lochkartenstanzer 22.10.2020 um 20:11:14 Uhr
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