12

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

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

6 ответов6

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, если хотите, чтобы это происходило только для определенных пользователей / групп.

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

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 достается Джеффу Кендалу

4

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

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

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer

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

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

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

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

Я всегда думал, что это был реестр по умолчанию для новых пользователей, но он не работал. Поэтому я отправился на поиски и обнаружил, что эта интересная статья разрушает мои давние мысли об этом.Ключ ПО УМОЛЧАНИЮ.

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, чтобы обойти это.

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

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

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

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

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

ps explorer | kill

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

0

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

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

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .