Сделать конкретный значок в трее всегда показывать для всех профилей в Windows 7

13

Я настраиваю машину под управлением Windows 7, которая будет находиться под открытым небом и использоваться многими людьми. Я добавил ярлык в меню «Пуск» для всех пользователей, чтобы запустить программу, которая находится в системном трее. Я хочу, чтобы значок в трее для этой программы всегда был виден по умолчанию, независимо от того, кто входит в систему. Пользователь может отключить его в своем профиле, если он действительно этого хочет, но мне нужно, чтобы он хотя бы вначале был установлен как всегда видимый. Как я могу это сделать?

Я бы предпочел не показывать все значки, частично по той же причине, по которой они спрятаны в первую очередь: я не хочу беспорядка. Кроме того, поскольку это общедоступный компьютер, существует другая программа под названием DeepFreeze, на которой также есть значок в системном трее, и я не хочу, чтобы этот значок отображался постоянно.

Джоэл Коухорн
источник
Разве вы не можете показать значок / сообщение каким-либо другим механизмом, кроме системного трея?
Джалф

Ответы:

11

В скорлупе, в настоящее время, вы не можете сделать это.

Для этого не существует групповой политики или предпочтений, а то, как она отслеживается, делает ее специфичной для текущего пользователя и системы, делая «настройки» значительно различающимися в зависимости от экземпляра.

Они хранятся здесь (в реестре) , если вы хотите , чтобы проверить это: HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify.

От сюда :

Приложения не могут программно всегда показывать себя на верхнем уровне панели задач ни при первой установке, ни в любое время во время выполнения. Это одно из нескольких изменений, которые мы внесли в Windows 7, чтобы создать более чистый и тихий рабочий стол, который находится под контролем пользователя, чтобы настроить верхний уровень с помощью своих любимых приложений и значков.

Мы держим пользователя под контролем в области уведомлений, не допуская программного продвижения (кроме временного или показа уведомления). Предполагая, что машина достаточно тихая, при первом добавлении значка с помощью Shell_NotifyIcon (NIM_ADD, ...) он будет отображаться на панели задач в течение 45 секунд, а затем перейдет в переполнение. Если пользователь продвигает значок, он всегда будет жить на панели задач. Если пользователь понизит его, значок никогда не будет виден на панели задач. Любое продвижение должно быть инициировано пользователем. Мы сделали это намного проще в Windows 7 с помощью перетаскивания и с помощью панели управления значками области уведомлений, и то, что мы видели в исследованиях юзабилити и на основе отзывов бета-версии, заключается в том, что пользователи не испытывают затруднений при поиске способов настройки поведения уведомлений. и будет продвигать иконки, к которым они хотят получить быстрый доступ.

Проще всего показать все значки области уведомлений для всех пользователей. Это можно сделать, добавив (простую) запись реестра:

В HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorerсоздать новое значение DWORD с именем EnableAutoTrayи установить его , 0чтобы выключить уведомление района «Автоскрытие» черты.

С некоторой конфигурацией OU и сценариями вы можете использовать его также в контексте HKCU, если хотите, чтобы это происходило только для определенных пользователей / групп.

Смотрите здесь для получения дополнительной информации об этом.

Ƭᴇcʜιᴇ007
источник
Я бы предпочел не показывать все значки, но я это сделаю, если должен.
Джоэл Коухорн
10

Я искал в Интернете и нашел это случайно.

Короче говоря, комбинация PowerShell (предоставлен скрипт) и GPO.

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

Длинная история, создайте сценарий PowerShell, содержащий следующее:

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
    }
}

Сохраните его как файл ps1, используя выбранное вами имя.

Откройте MMC управления групповой политикой. Выберите выбранный объект групповой политики, щелкните правой кнопкой мыши и выберите «Изменить». В редакторе перейдите в «Конфигурация пользователя»> «Настройки Windows»> «Сценарии»> «Вход в систему» ​​и нажмите «Свойства экрана». Перейдите на вкладку PowerShell и нажмите «Просмотр файлов».

Скопируйте только что созданный скрипт в открывшееся окно проводника, а затем закройте его.

В окне свойств сценария входа в систему добавьте новый сценарий PowerShell, в имени сценария введите имя используемого вами сценария (пример: NotifyIcon.ps1), а затем в параметрах введите имя программы (с учетом регистра!), А затем настройкой использовать:

0 = показывать только уведомления 1 = скрывать значок и уведомления 2 = показывать значок и уведомления <--- Тот, который вам нужен

Например, если вам нужно, чтобы сервер RealVNC всегда появлялся, вы должны ввести:

winvnc4.exe 2

в качестве параметров

Вы можете узнать имя исполняемого файла несколькими способами, например, открыв диалоговое окно «Выполнить» и набрав msconfig и просмотрев программы, вручную перейдя в каталог установки C:\Program Files\{your program}или попытавшись найти нужную программу, просмотрев запущенную программу. процессы в диспетчере задач. 9 раз из 10 это приведет к успеху.

Чтобы это работало, пользователь должен предварительно запустить приложение, а затем правильно выйти из системы, чтобы explorer.exe получил возможность записать обновленную историю области уведомлений в реестр. При последующем входе в систему скрипт должен успешно найти программу в истории и обновить ее настройку, чтобы она всегда отображалась.

Вы также можете попробовать запустить скрипт вручную из командной строки PowerShell для отладки, но вы ДОЛЖНЫ убить explorer.exe ('taskkill / f / im explorer.exe') перед его запуском, в противном случае проводник не увидит ваше обновление и перезапишет это когда он уходит.

Я не беру на себя ответственность за этот процесс. Я не писал это, я просто нашел это. Кредит на сценарий достается Мике Роуланду . Кредит на процесс GPO достается Джеффу Кендалу

Джошуа Парнелл
источник
Я нахожусь вне офиса на некоторое время, и когда я вернусь, я забуду об этом. Если вы сможете @ ответить на этот комментарий в конце следующей недели, я смогу поближе взглянуть и, возможно, поменять принятый ответ.
Джоэл Коухорн
Ответы только на ссылки - нет-нет из-за возможного будущего гниения ссылок. Пожалуйста, включите соответствующую информацию в ваш ответ. Нам также все равно, если вы ответили на старый вопрос, это на самом деле ХОРОШО, поэтому рассмотрите возможность удаления ваших «извинений» и причин для публикации. :)
Ƭᴇcʜιᴇ007
@ techie007 Спасибо, отредактировано @ Joel Coehoorn Я напишу заметку, чтобы напомнить мне: P
Джошуа Парнелл
@JoelCoehoorn Вот твой @ ответ. Извините, что так долго, отвес забыл об этом.
Джошуа Парнелл
Он работает хорошо, но работает очень медленно: на моем достаточно быстром ПК требуется более 20 секунд.
Моцци
4

Я не знаю, можно ли установить порядок кэширования значков, учитывая, что он может постоянно меняться, если добавляются новые программы, но вы можете установить уведомление «Всегда показывать все значки и уведомления на панели задач».

Чтобы установить это значение по умолчанию, перейдите в этот раздел реестра:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer

Добавьте значение DWORD " EnableAutoTray", дважды щелкните его и установите шестнадцатеричное значение на " 0".

Я проверил это, и это сработало.

Интересное примечание: я сначала попытался добавить его к этому ключу:

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

Я всегда думал, что это был реестр по умолчанию для новых пользователей, но он не работал. Поэтому я отправился на поиски и обнаружил, что эта интересная статья разрушает мои давние мысли об этом ключе .DEFAULT.

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

Дополнение: лучшее, что я могу сказать, это то, что записи реестра здесь. Если вы собираетесь попробовать установить один значок, как если бы вы открыли " Control Panel\All Control Panel Items\Notification Area Icons":

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

Если вы посмотрите на них, они не очень понятны, поэтому я не уверен, насколько хорошо вы бы отредактировали их.

Я предлагаю вам рассмотреть возможность создания нового пользователя и его профиля, установите «Панель управления \ Все элементы панели управления \ Значки области уведомлений» для этого одного значка (как минимум) на «Показать значок и уведомления».

Затем перезагрузитесь, чтобы освободить профиль, и войдите в систему как администратор. Скопируйте этот профиль в профиль " C:\Users\Default". Вы можете сделать это либо вручную, используя Проводник, либо так, как мы это делали в " Control Panel\All Control Panel Items\System" " Advanced System Settings>Advanced>User Profiles>Copy to". Он будет недоступен, но вы можете использовать Windows Enabler, чтобы обойти это.

KCotreau
источник
Я бы предпочел не показывать все значки, но я это сделаю, если должен.
Джоэл Коухорн
Я собираюсь добавить к ответу.
Котро
Я видел Windows Enabler и другие решения для профилей копирования, но эксперименты показали, что это действительно сломано для Windows 7. Это меня огорчает :(
Джоэл Коухорн
Я согласен, Джоэл, ПОЧЕМУ они отключат эту функцию? Я до сих пор понятия не имею, кроме людей, пытающихся скопировать это в неправильное место.
Котро
@KCotreau: это было в блогах по развертыванию Windows. Он имеет отношение к определенным операциям, которые происходят только во время создания профиля, например, «Подготовка рабочего стола ...» Честно говоря, это отстой, но я могу понять, почему они пытаются отдалить всех от этого метода. Просто непредсказуемо, какими будут конечные результаты.
Surfasb
1

Запустите это как администратор:

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

Обратите внимание на HKLM вместо HKCU .

Проверьте эффект с помощью:

ps explorer | kill

Он показывает все значки для всех профилей.

majkinetor
источник
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"
        }
}
Павел
источник
К вашему сведению, есть оболочка формата блока кода, поэтому вам не нужно использовать <br>каждую строку.
Enigma
0

теперь она доступна в более поздних версиях групповой политики, см. опцию B

Все эти варианты доступны в User Configuration\Administrative Templates\Start Menu and Taskbar

Вы также можете:

A) Полностью отключите или полностью включите его («скрыть область уведомлений», работает как для XP, так и для 7).

B) Пусть он покажет все или продолжит отображать значки, указанные пользователем («отключить очистку области уведомлений, "работает как для XP, так и для 7).

C) Отключить только определенные значки, включенные в объект групповой политики по умолчанию, такие как Центр действий, Сеть, Индикатор заряда аккумулятора, Громкость. Насколько я могу судить, это единственные 4 значка области уведомлений, с которыми можно работать через стандартный объект групповой политики 2008R2 (и они работают только для Vista и выше или 7 и выше).

technonath
источник
1
Итак, то, о чем я спрашивал, недоступно через групповую политику, так как я хочу, чтобы определенный значок всегда отображался, а это не один из вариантов GPO, описанных здесь.
Джоэл Коухорн