Spraw, aby ikona określonego zasobnika zawsze wyświetlała się dla wszystkich profili w Windows 7

13

Konfiguruję komputer z systemem Windows 7, który będzie siedział na zewnątrz i będzie udostępniany przez wiele osób. Dodałem skrót do menu startowego wszystkich użytkowników, aby uruchomić program, który znajduje się w zasobniku systemowym. Chcę, aby ikona zasobnika dla tego programu była zawsze domyślnie widoczna, bez względu na to, kto się zaloguje. Użytkownik może wyłączyć go w swoim profilu, jeśli naprawdę tego chce, ale muszę go uruchomić przynajmniej tak, jak zawsze jest widoczny. W jaki sposób mogę to zrobić?

Wolałbym nie pokazywać wszystkich ikon, po części z tego samego powodu, dla którego są one ukryte: nie chcę bałaganu. Ponieważ jest to komputer publiczny, działa inny program o nazwie DeepFreeze, który ma również ikonę na pasku zadań i nie chcę, aby ta ikona była cały czas wyświetlana.

Joel Coehoorn
źródło
Czy nie możesz wyświetlić ikony / komunikatu za pomocą innego mechanizmu niż w zasobniku systemowym?
czerwiec

Odpowiedzi:

11

W skrócie, obecnie nie możesz tego zrobić.

Nie ma żadnych Zasad Grupy ani Preferencji, aby to ustawić, a sposób, w jaki śledzi, sprawia, że ​​jest specyficzny dla bieżącego użytkownika i systemu, dzięki czemu „ustawienia” różnią się znacznie w zależności od instancji.

Są one przechowywane tutaj (w rejestrze), jeśli chcesz, aby to sprawdzić: HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify.

Od tutaj :

Nie ma możliwości, aby aplikacje zawsze programowo pokazywały sobie najwyższy poziom w zasobniku systemowym podczas pierwszej instalacji lub w dowolnym momencie podczas uruchamiania. Jest to jedna z kilku zmian, które wprowadziliśmy w systemie Windows 7 w celu stworzenia czystszego, cichszego pulpitu, nad którym użytkownik ma kontrolę, aby dostosować najwyższy poziom za pomocą swoich ulubionych aplikacji i ikon.

Dajemy użytkownikowi kontrolę nad obszarem powiadomień, nie zezwalając na automatyczną promocję (inną niż tymczasowa lub wyświetlająca powiadomienie). Zakładając, że maszyna jest wystarczająco cicha, kiedy najpierw dodasz swoją ikonę za pomocą Shell_NotifyIcon (NIM_ADD, ...), będzie ona wyświetlana na pasku zadań przez 45 sekund, a następnie przejdzie do przepełnienia. Jeśli użytkownik promuje ikonę, zawsze będzie ona widoczna na pasku zadań. Jeśli użytkownik obniży to, ikona nigdy nie będzie widoczna na pasku zadań. Wszelkie promocje muszą być inicjowane przez użytkownika. Ułatwiliśmy to w Windows 7 poprzez przeciąganie / upuszczanie i panel sterowania ikon obszaru powiadomień, a to, co widzieliśmy w badaniach użyteczności i w oparciu o opinie beta, polega na tym, że użytkownicy nie mają trudności z odkryciem, jak dostosować zachowanie powiadomień i będą promować ikony, do których chcą szybkiego dostępu.

Najłatwiejszym rozwiązaniem jest pokazanie WSZYSTKICH ikon obszaru powiadomień dla wszystkich użytkowników. Można to zrobić, dodając (prosty) wpis rejestru:

W HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorerutworzyć nową wartość DWORD o nazwie EnableAutoTrayi ustawić go 0wyłączyć Notification Area dysponuje auto hide „”.

W przypadku niektórych konfiguracji OU i skryptów możesz używać go również w kontekście HKCU, jeśli chcesz, aby stało się to tylko dla niektórych użytkowników / grup.

Zobacz tutaj, aby uzyskać więcej informacji na ten temat.

Ƭᴇcʜιᴇ007
źródło
Wolałbym nie pokazywać wszystkich ikon, ale zrobię to, jeśli będę musiał.
Joel Coehoorn,
10

Szukałem online i znalazłem to losowo.

Krótko mówiąc, połączenie PowerShell (dostarczony skrypt) i GPO.

http://4sysops.com/archives/forcing-notification-area-icons-to-always-show-in-windows-7-or-windows-8/

Długa historia, utwórz skrypt PowerShell zawierający następujące elementy:

param(
    [Parameter(Mandatory=$true,HelpMessage='The name of the program')][string]$ProgramName,
    [Parameter(Mandatory=$true,HelpMessage='The setting (2 = show icon and notifications 1 = hide icon and notifications, 0 = only show notifications')]
        [ValidateScript({if ($_ -lt 0 -or $_ -gt 2) { throw 'Invalid setting' } return $true})]
        [Int16]$Setting
    )

$encText = New-Object System.Text.UTF8Encoding
[byte[]] $bytRegKey = @()
$strRegKey = ""
$bytRegKey = $(Get-ItemProperty $(Get-Item 'HKCU:\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify').PSPath).IconStreams
for($x=0; $x -le $bytRegKey.Count; $x++)
{
    $tempString = [Convert]::ToString($bytRegKey[$x], 16)
    switch($tempString.Length)
    {
        0 {$strRegKey += "00"}
        1 {$strRegKey += "0" + $tempString}
        2 {$strRegKey += $tempString}
    }
}
[byte[]] $bytTempAppPath = @()
$bytTempAppPath = $encText.GetBytes($ProgramName)
[byte[]] $bytAppPath = @()
$strAppPath = ""

Function Rot13($byteToRot)
{
    if($byteToRot -gt 64 -and $byteToRot -lt 91)
    {
        $bytRot = $($($byteToRot - 64 + 13) % 26 + 64)
        return $bytRot
    }
    elseif($byteToRot -gt 96 -and $byteToRot -lt 123)
    {
        $bytRot = $($($byteToRot - 96 + 13) % 26 + 96)
        return $bytRot
    }
    else
    {
        return $byteToRot
    }
}

for($x = 0; $x -lt $bytTempAppPath.Count * 2; $x++)
{
    If($x % 2 -eq 0)
    {
        $curbyte = $bytTempAppPath[$([Int]($x / 2))]
            $bytAppPath += Rot13($curbyte)

    }
    Else
    {
        $bytAppPath += 0
    }
}

for($x=0; $x -lt $bytAppPath.Count; $x++)
{
    $tempString = [Convert]::ToString($bytAppPath[$x], 16)
    switch($tempString.Length)
    {
        0 {$strAppPath += "00"}
        1 {$strAppPath += "0" + $tempString}
        2 {$strAppPath += $tempString}
    }
}
if(-not $strRegKey.Contains($strAppPath))
{
    Write-Host Program not found. Programs are case sensitive.
    break
}

[byte[]] $header = @()
$items = @{}
for($x=0; $x -lt 20; $x++)
{
    $header += $bytRegKey[$x]
}

for($x=0; $x -lt $(($bytRegKey.Count-20)/1640); $x++)
{
    [byte[]] $item=@()
    $startingByte = 20 + ($x*1640)
    $item += $bytRegKey[$($startingByte)..$($startingByte+1639)]
    $items.Add($startingByte.ToString(), $item)
}

foreach($key in $items.Keys)
{
$item = $items[$key]
    $strItem = ""
    $tempString = ""

    for($x=0; $x -le $item.Count; $x++)
    {
        $tempString = [Convert]::ToString($item[$x], 16)
        switch($tempString.Length)
        {
            0 {$strItem += "00"}
            1 {$strItem += "0" + $tempString}
            2 {$strItem += $tempString}
        }
    }
    if($strItem.Contains($strAppPath))
    {
        Write-Host Item Found with $ProgramName in item starting with byte $key
            $bytRegKey[$([Convert]::ToInt32($key)+528)] = $setting
            Set-ItemProperty $($(Get-Item 'HKCU:\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify').PSPath) -name IconStreams -value $bytRegKey
    }
}

Zapisz go jako plik ps1, używając wybranej nazwy.

Otwórz MMC Group Policy Management. Wybierz wybrany obiekt zasad grupy, kliknij prawym przyciskiem myszy i wybierz Edytuj. W edytorze przejdź do Konfiguracja użytkownika> Ustawienia systemu Windows> Skrypty> Logowanie i kliknij „Właściwości ekranu”. Przejdź do karty PowerShell i kliknij Wyświetl pliki.

Skopiuj właśnie utworzony skrypt do okna Eksploratora, które właśnie otworzyło, a następnie zamknij okno.

W oknie właściwości skryptu logowania dodaj nowy skrypt PowerShell, w nazwie skryptu wprowadź nazwę użytego skryptu (przykład: NotifyIcon.ps1), a następnie w parametrach wpisz nazwę programu (rozróżniana jest wielkość liter!), A następnie przez ustawienie do użycia:

0 = pokaż tylko powiadomienia 1 = ukryj ikonę i powiadomienia 2 = pokaż ikonę i powiadomienia <--- Ten, którego potrzebujesz

Przykład: jeśli potrzebujesz, aby serwer RealVNC zawsze się pojawiał, wpisz:

winvnc4.exe 2

jako paramenterzy

Nazwę pliku wykonywalnego można znaleźć na kilka różnych sposobów, na przykład otwierając okno dialogowe Uruchom, wpisując msconfigi przeglądając programy startowe, ręcznie przechodząc do katalogu instalacyjnego C:\Program Files\{your program}lub próbując dopasować żądany program, patrząc na działający program procesy w Menedżerze zadań. 9 razy na 10 przyniesie to sukces.

Aby to zadziałało, użytkownik musi wcześniej uruchomić aplikację, a następnie poprawnie się wylogować, aby program explorer.exe miał szansę zapisać zaktualizowaną historię obszaru powiadomień w rejestrze. Przy kolejnym logowaniu skrypt powinien pomyślnie zlokalizować program w historii i zaktualizować jego ustawienie, aby zawsze wyświetlało się.

Możesz także spróbować uruchomić skrypt ręcznie z wiersza polecenia programu PowerShell w celu debugowania, ale MUSISZ zabić explorer.exe („taskkill / f / im explorer.exe”) przed jego uruchomieniem, w przeciwnym razie eksplorator nie zobaczy twojej aktualizacji i nadpisze kiedy się kończy.

Nie biorę uznania za ten proces. Nie napisałem tego, właśnie to znalazłem. Podziękowania za scenariusz należą do Micheasza Rowlanda . Podziękowania dla procesu GPO należą się Geoffowi Kendalowi

Joshua Parnell
źródło
Przez jakiś czas jestem poza biurem i zanim wrócę, zapomnę o tym. Jeśli możesz odpowiedzieć na ten komentarz pod koniec przyszłego tygodnia, będę mógł przyjrzeć się bliżej i być może zmienić przyjętą odpowiedź.
Joel Coehoorn,
Odpowiedzi tylko dla linków są „nie-nie” z powodu możliwej zgnilizny w przyszłości. W odpowiedzi podaj odpowiednie informacje. Nie obchodzi nas również, czy odpowiedziałeś na stare pytanie, to w rzeczywistości DOBRA rzecz, więc rozważ usunięcie „przeprosin” i powodów opublikowania. :)
ᴇcʜιᴇ007
@ techie007 Dzięki, edytowano @ Joel Coehoorn Zamieszczę karteczkę z przypomnieniem: P
Joshua Parnell,
@JoelCoehoorn Oto twoja @ odpowiedź. Przepraszam, że to trwało tak długo, zapomniałem o tym.
Joshua Parnell,
Działa dobrze, ale działa bardzo wolno: wykonanie na moim rozsądnym szybkim komputerze zajmuje> 20 sekund.
Mozzis
4

Nie wiem, czy możesz ustawić kolejność pamięci podręcznej dla ikon, biorąc pod uwagę, że gdyby nowe programy były ciągle zmieniane, możesz ustawić powiadomienie na „Zawsze pokazuj wszystkie ikony i powiadomienia na pasku zadań”.

Aby ustawić tę wartość jako domyślną, przejdź do tego klucza rejestru:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer

Dodaj wartość DWORD „ EnableAutoTray”, kliknij ją dwukrotnie i ustaw wartość szesnastkową na „ 0”.

Przetestowałem to i zadziałało.

Ciekawa uwaga: najpierw próbowałem dodać go do tego klucza:

HKEY_USERS\.DEFAULT\Software\Microsoft\Windows\CurrentVersion\Explorer

Zawsze myślałem, że był to domyślny rejestr dla nowych użytkowników, ale nie działał. Poszedłem więc szukać i znalazłem ten interesujący artykuł niszczący moje długotrwałe przemyślenia na temat tego klucza .DEFAULT.

http://blogs.msdn.com/b/oldnewthing/archive/2007/03/02/1786493.aspx

Dodanie: najlepsze, co mogę powiedzieć, to to, że wpisy rejestru są tutaj. Jeśli zamierzałeś spróbować ustawić jedną ikonę tak, jak gdybyś otworzył „ Control Panel\All Control Panel Items\Notification Area Icons”:

HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify

Jeśli spojrzysz na nie, nie są one zbyt zrozumiałe, więc nie jestem pewien, jak dobrze byś je edytował.

Sugeruję rozważenie utworzenia nowego użytkownika i jego profilu, ustaw „Panel sterowania \ Wszystkie elementy panelu sterowania \ Ikony obszaru powiadomień” dla tej jednej ikony (przynajmniej) na „Pokaż ikonę i powiadomienia”.

Następnie uruchom ponownie, aby zwolnić profil i zaloguj się jako administrator. Skopiuj ten profil do profilu „ C:\Users\Default”. Możesz to zrobić ręcznie za pomocą Eksploratora lub w sposób, w jaki to robiliśmy w „ Control Panel\All Control Panel Items\System” „ Advanced System Settings>Advanced>User Profiles>Copy to”. Zostanie wyszarzony, ale możesz skorzystać z narzędzia Windows Enabler, aby obejść ten problem .

KCotreau
źródło
Wolałbym nie pokazywać wszystkich ikon, ale zrobię to, jeśli będę musiał.
Joel Coehoorn,
Dodam do odpowiedzi.
KCotreau
Widziałem Windows Enabler i inne rozwiązania profilu kopiowania, ale eksperymenty wykazały, że to naprawdę jest zepsute dla Windows 7. To mnie zasmuca :(
Joel Coehoorn
Zgadzam się, Joel, DLACZEGO mieliby wyłączyć tę funkcję? Nadal nie mam pojęcia, jak ludzie próbujący skopiować go w niewłaściwe miejsce.
KCotreau
@KCotreau: To było na blogach Windows Deployment. Ma to coś wspólnego z niektórymi operacjami, które mają miejsce tylko podczas tworzenia profilu, tj. „Przygotowywanie pulpitu ...”. Szczerze mówiąc, to do bani, ale rozumiem, dlaczego próbują odciągnąć wszystkich od tej metody. Po prostu nieprzewidywalne będą wyniki końcowe.
surfasb
1

Uruchom jako administrator:

Set-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer EnableAutoTray 0

Zauważ HKLM zamiast HKCU .

Sprawdź efekt za pomocą:

ps explorer | kill

Pokazuje wszystkie ikony dla wszystkich profili.

majkinetor
źródło
1
#this will grab all the SID on current user and apply across all.
Function Enable-Notifications
{
    Param
        (
        [parameter(Mandatory=$false)][string]$cpuName
        )


        if (Test-Connection $cpuName -Quiet)    
        {
Try
                {
                    $serviceName = "Remote Registry"  
                    Get-Service -ComputerName $cpuName -Name $serviceName | Start-Service
                }
                Catch
                {
                    Write-Host "Possible Error restarting $serviceName on $cpuName" -ForegroundColor Red
                }
                Try
                {
                    $root = [Microsoft.Win32.RegistryHive]::Users
                    $regKey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey($root, $cpuName)

                    $users = $regKey.GetSubKeyNames() | where { $_.Length -gt 10 -and $_.EndsWith("_Classes") -eq $false }
                    foreach ($usersid in $users)
                    {
                        $key = "$usersid\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer"
                        $regKey = $regKey.OpenSubKey($key, $true)
                        $regKey.SetValue("EnableAutoTray", "0", 'DWORD')
                    }
                    $ActiveUser = ([Environment]::UserDomainName + "\" + [Environment]::UserName)
                    $Time = Get-Date -format "MM-dd-yyyy @ HH:mm"
                    $WriteOut = "$ActiveUser enabled Notifcations on $cpuName at $Time"
                    $WriteOut >> "c:\scripts\Notification-Update-Enable.csv"
                    Write-Host "Enable Notifications on $cpuName" -ForegroundColor Green
                }       
                Catch
                {
                    $errormsg = $cpuName + ” is down/not responding.”
                    Write-Host $errorMsg -ForegroundColor Red
                    $errormsg >> "c:\scripts\Notification-Update-Enable_Off.csv"
                }
}
        else
        {
            Write-Host "$cpuName is Offline. Try again later." -ForegroundColor Red
            $errormsg >> "c:\scripts\Notification-Update-Enable_Off.csv"
        }
}
Paweł
źródło
Do Twojej dyspozycji jest opakowanie w formacie bloku kodu, więc nie musisz używać <br>w każdej linii.
Enigma,
0

jest teraz dostępny w zasadach grupowych późniejszych wersji, patrz opcja B

Wszystkie te opcje są dostępne w User Configuration\Administrative Templates\Start Menu and Taskbar

Możesz albo:

A) Wyłącz go całkowicie lub całkowicie („ukryj obszar powiadomień” działa zarówno dla XP, jak i 7)

B) Niech pokaż wszystko lub kontynuuj pokazywanie ikon określonych przez użytkownika („wyłącz czyszczenie obszaru powiadomień, ”działa zarówno dla XP, jak i 7)

C) Wyłącz tylko niektóre ikony zawarte w domyślnym obiekcie zasad grupy, takie jak Centrum akcji, Sieć, Miernik baterii, Głośność. O ile mi wiadomo, to jedyne 4 ikony obszaru powiadomień, z którymi możesz pracować za pomocą domyślnego obiektu zasad grupy 2008R2 (i te działają tylko w systemie Vista i nowszych lub 7 i nowszych).

technonath
źródło
1
Zatem to, o co prosiłem, nie jest dostępne za pośrednictwem zasad grupy, ponieważ chcę zmusić określoną ikonę do zawsze pokazywania, a to nie jest jedna z opisanych tutaj opcji GPO.
Joel Coehoorn