Den Schalter "Bitte nicht Stören" per Skript ausschalten

Reinhard77

Lieutenant
Registriert
Feb. 2019
Beiträge
999
Hallo,

es gibt ja in den Windows 11 Einstellungen den Schalter "Bitte nicht stören" unter Einstellungen -> System - Benachrichtigungen:

Bitte nicht stören.png


Diesen Schalter will ich per Skript ausschalten.

Dazu hatte ich ursprünglich folgendes Skript entwickelt:

PowerShell:
# "Bitte nicht stören" deaktivieren
if (!(Test-Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\CloudStore\Store\Cache\DefaultAccount\$$windows.data.notifications.quiethourssettings\Current')) {                  
    New-Item -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\CloudStore\Store\Cache\DefaultAccount\$$windows.data.notifications.quiethourssettings' -Name "Current" | Out-Null                  
    New-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\CloudStore\Store\Cache\DefaultAccount\$$windows.data.notifications.quiethourssettings\Current' -Name "Data" -Value (&{'02,00,00,00,69,78,60,36,2d,9f,db,01,00,00,00,00,43,42,01,00,d2,14,28,4d,00,69,00,63,00,72,00,6f,00,73,00,6f,00,66,00,74,00,2e,00,51,00,75,00,69,00,65,00,74,00,48,00,6f,00,75,00,72,00,73,00,50,00,72,00,6f,00,66,00,69,00,6c,00,65,00,2e,00,55,00,6e,00,72,00,65,00,73,00,74,00,72,00,69,00,63,00,74,00,65,00,64,00,ca,28,00,00'.split(",") | %{"0x"+$_}})  -Type BINARY | Out-Null                                         
    Write-Host "Bitte nicht stoeren deaktiviert."                  
                     
}                  
else                  
{                  
    Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\CloudStore\Store\Cache\DefaultAccount\$$windows.data.notifications.quiethourssettings\Current' -Name "Data" -Value (&{'02,00,00,00,69,78,60,36,2d,9f,db,01,00,00,00,00,43,42,01,00,d2,14,28,4d,00,69,00,63,00,72,00,6f,00,73,00,6f,00,66,00,74,00,2e,00,51,00,75,00,69,00,65,00,74,00,48,00,6f,00,75,00,72,00,73,00,50,00,72,00,6f,00,66,00,69,00,6c,00,65,00,2e,00,55,00,6e,00,72,00,65,00,73,00,74,00,72,00,69,00,63,00,74,00,65,00,64,00,ca,28,00,00'.split(",") | %{"0x"+$_}})  -Type BINARY | Out-Null                    
    Write-Host "Bitte nicht stoeren deaktiviert"              
}

Dieser Schritt funktioniert auch, aber leider nicht immer. Und da ich nicht weiß, was sich Microsoft bei diesen binären Werten für dieses Menü gedacht hat, komme ich da nicht weiter. Dazu müsste ich wiesen, welcher der ganzen Werte genau für den Schalter zuständig ist und das weiß ich nicht. Wo in der Registry sich diese Werte verstecken, hatte ich mit Sysinternals Process Monitor herausgefunden.

Dann lag die noch einzig mögliche Lösung daran, ein VBS Skript zu erstellen, welches in PowerShell eingebettet wird. D.h. ich packe das VBS Skript in eine Variable, gebe es als Datei aus und starte die Datei an der richtigen Stelle. Dazu habe ich folgendes PowerShell Skript erstellt, welches auch einwandfrei funktioniert:

PowerShell:
#########################temp VBS Script fuer die Installation####################
 
$vbsScriptBNS = 'set WshShell = CreateObject("WScript.Shell")

WScript.Sleep 2000
WshShell.SendKeys "{TAB}"
WScript.Sleep 400
WshShell.SendKeys "{TAB}"
WScript.Sleep 400      
WshShell.SendKeys " "
WScript.Sleep 400
'  
#########################Bitte nicht stoeren deaktivieren#############################
 
Write-Host "-----------------------------------------------------"
Write-Host -ForegroundColor Yellow "Bitte nicht stoeren wird deaktiviert!...Bitte warten.";
Write-Host "-----------------------------------------------------"
 
# Menü "Einstellung" -> "Benachrichtigungen" aufrufen    
Start-Process ms-settings:notifications      
# VBS Skript als Datei ablegen
$vbsScriptBNS | Out-File -FilePath "C:\vbsScriptBNS.vbs"
# VBS Skript ausfuehren
Start-Process -wait "C:\vbsScriptBNS.vbs" | Out-Null
Write-Host -ForegroundColor Green "Bitte nicht stoeren wurde installiert."
Write-Host "-----------------------------------------------------"
# VBS Skript wieder loeschen
Remove-Item "C:\vbsScriptBNS.vbs"
Start-Sleep -Seconds 2

Das Problem, was ich nun habe, ist, es ist nicht immer eindeutig, wie die ursprüngliche Position des Schalters "Bitte nicht stören" ist. D.h. es kann sein, das, wenn der Schalter schon aus ist, dieses VBS Skript den Schalter wieder einschaltet, was nicht gewünscht ist. Mit den binären Werten in der ersten Version komme ich auch nicht wirklich weiter, da ich nicht weiß, welcher Wert für den Schalter zuständig ist. Es werden auch immer gleich vier binäre Werte gleichzeitig geändert, wenn der Schalter betätigt wird.

Soweit ich weiß, gibt es auch keine GPO bzw. einen Registry Key, der explizit für diesen Schalter zuständig ist?!

Hat jemand eine Lösung für dieses Problem? Wenn ja, schon mal vielen Dank!
 
Zuletzt bearbeitet:
Habs via Powershell gelöst.

Off
Code:
Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Notifications\Settings" -Name "NOC_GLOBAL_SETTING_DND" -Value 0 -Force

On
Code:
Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Notifications\Settings" -Name "NOC_GLOBAL_SETTING_DND" -Value 1 -Force
 
  • Gefällt mir
Reaktionen: kuddlmuddl
Warum ein Script?
Ich klick in der Taskleiste auf -Uhr/Datumanzeige und oben
bei Benachrichtigungen auf die Glocke.
 
  • Gefällt mir
Reaktionen: kuddlmuddl
TheZonk88 schrieb:
Habs via Powershell gelöst.

Off
Code:
Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Notifications\Settings" -Name "NOC_GLOBAL_SETTING_DND" -Value 0 -Force

On
Code:
Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Notifications\Settings" -Name "NOC_GLOBAL_SETTING_DND" -Value 1 -Force

Und was genau schaltet dieser Key? Es setzt auf aber nicht den gezeigten Schalter auf aus. Das ist bestimmt ein übergeordneter Registry Key. Mir geht es explizit um diesen Schalter, so dass ggf. die Glocke mit dem Z aus der Taskleiste verschwindet.

hybridlite schrieb:
Warum ein Script?
Ich klick in der Taskleiste auf -Uhr/Datumanzeige und oben
bei Benachrichtigungen auf die Glocke.

Weil es für die automatisierte Installation von einigen Geräten gebraucht wird und nicht jedesmal manuell gemacht werden soll.
 
Zuletzt bearbeitet:
Reinhard77 schrieb:
Weil es für die automatisierte Installation von einigen Geräten gebraucht wird und nicht jedesmal manuell gemacht werden soll.

Wir hatten dann im Laufe des Nachmittags schon eine funktionierende Lösung gefunden, mit der Hilfe von Copilot. Den entscheidenden Hinweis, dass es sich bei dem Schalter um einen
PowerShell:
ToggleSwitch
handelt, musste man Copilot noch geben und dann hat es funktioniert. Hier dazu die Aussage vom Copilot:

Jawohl – das ist der entscheidende Hinweis! 🎯In der Windows UI Automation-Welt ist ein ToggleSwitch technisch gesehen ein spezieller Typ von Custom oder Button, je nach Framework. Leider gibt es keinen eigenen ControlType.ToggleSwitch, aber wir können das umgehen, indem wir gezielt nach einem ControlType.Button oder ControlType.Custom mit dem Namen „Bitte nicht stören“ suchen und prüfen, ob er ein TogglePattern unterstützt.

Außerdem gab es vorher den Stolperstein, dass es auch ein Textfeld namens "Bitte nicht stören" gibt, welches in der ersten Variante von Copilot gefunden und weiter verarbeitet wurde, was dazu führt, dass der Button "Bitte nicht stören" nicht gefunden wird.

Dann habe ich nachher noch für mich auch noch eine weitere Variante mithilfe von Copilot ohne Account erstellt und angepasst. Ist im Prinzip das gleiche, nur mit einer Funktion namens "FindToggleSwitchByName". Funktioniert einwandfrei. Hier der Code:

PowerShell:
Add-Type -AssemblyName UIAutomationClient
Add-Type -AssemblyName UIAutomationTypes

function FindToggleSwitchByName($elementRoot, $name) {
    $conditionName = New-Object System.Windows.Automation.PropertyCondition `
        ([System.Windows.Automation.AutomationElement]::NameProperty, $name)

    $candidates = $elementRoot.FindAll(
        [System.Windows.Automation.TreeScope]::Descendants,
        $conditionName
    )

    foreach ($el in $candidates) {
        $patterns = $el.GetSupportedPatterns()
        if ($patterns -contains [System.Windows.Automation.TogglePatternIdentifiers]::Pattern) {
            return $el
        }
    }

    # Wenn kein TogglePattern gefunden wurde, aber Elemente existieren
    if ($candidates.Count -gt 0) {
        return "NoToggle"
    }

    return $null
}

# Starte die Einstellungen-App
Start-Process "ms-settings:notifications"
Start-Sleep -Seconds 3

# Hole das Root-Element
$desktop = [System.Windows.Automation.AutomationElement]::RootElement

# Warte auf das Fenster "Einstellungen"
$settingsWindow = $null
for ($i = 0; $i -lt 10; $i++) {
    $settingsWindow = $desktop.FindFirst(
        [System.Windows.Automation.TreeScope]::Children,
        (New-Object System.Windows.Automation.PropertyCondition(
            [System.Windows.Automation.AutomationElement]::NameProperty, "Einstellungen"))
    )
    if ($settingsWindow -ne $null) { break }
    Start-Sleep -Seconds 1
}

if ($settingsWindow -eq $null) {
    Write-Output "❌ Einstellungen-Fenster nicht gefunden."
    exit
}

# Suche nach dem ToggleSwitch
$toggleSwitch = FindToggleSwitchByName $settingsWindow "Bitte nicht stören"

# Hole das TogglePattern
$pattern = $toggleSwitch.GetCurrentPattern([System.Windows.Automation.TogglePatternIdentifiers]::Pattern)

# Status prüfen und ggf. deaktivieren
if ($pattern.Current.ToggleState -eq [System.Windows.Automation.ToggleState]::On) {
    Write-Output "🔕 'Bitte nicht stören' ist AKTIV. Wird jetzt deaktiviert..."
    $pattern.Toggle()
    Start-Sleep -Seconds 1
    Write-Output "✅ 'Bitte nicht stören' wurde deaktiviert."
} else {
    Write-Output "🔔 'Bitte nicht stören' ist bereits deaktiviert."
}
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: trb85
Zurück
Oben