Tornar o ícone específico da bandeja sempre exibido para todos os perfis no Windows 7

12

Estou configurando uma máquina com Windows 7 que ficará aberta e será compartilhada por muitas pessoas. Adicionei um atalho ao menu Iniciar de todos os usuários para executar um programa localizado na bandeja do sistema. Quero que o ícone da bandeja para este programa esteja sempre visível por padrão, independentemente de quem faça login. Um usuário pode desativá-lo em seu perfil, se realmente quiser, mas preciso que ele comece pelo menos como sempre visível. Como posso fazer isso?

Prefiro não mostrar todos os ícones, em parte pela mesma razão pela qual eles estão ocultos: eu não quero a bagunça. Além disso, como este é um computador público, existe outro programa chamado DeepFreeze em execução que também possui um ícone na bandeja do sistema, e eu não quero que esse ícone seja exibido o tempo todo.

Joel Coehoorn
fonte
Você não pode mostrar o ícone / mensagem por outro mecanismo que não a bandeja do sistema?
jalf

Respostas:

11

Em uma casca de noz, atualmente, você não pode fazer isso.

Não há Diretiva de Grupo ou Preferência para definir isso, e o modo como ele o acompanha especifica o usuário atual e o sistema, fazendo as 'configurações' variarem muito de instância para instância.

Eles são armazenados aqui (no Registro) se você quiser confira: HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify.

A partir daqui :

Não há como os aplicativos sempre se mostrarem de nível programático na bandeja do sistema na primeira instalação ou a qualquer momento durante o tempo de execução. Essa é uma das várias alterações que fizemos no Windows 7, em um esforço para produzir uma área de trabalho mais limpa e silenciosa que esteja sob o controle do usuário para personalizar o nível superior com seus aplicativos e ícones favoritos.

Mantemos o usuário no controle da área de notificação, não permitindo a promoção programática (exceto temporariamente ou para mostrar uma notificação). Supondo que a máquina esteja suficientemente silenciosa, quando você adiciona seu ícone pela primeira vez com o Shell_NotifyIcon (NIM_ADD, ...), ele será mostrado na barra de tarefas por 45 segundos e depois será movido para o estouro. Se o usuário promover um ícone, ele sempre estará na barra de tarefas. Se o usuário rebaixá-lo, o ícone nunca será visto na barra de tarefas. Qualquer promoção precisa ser iniciada pelo usuário. Facilitamos isso muito mais fácil no Windows 7 por meio do recurso arrastar / soltar e pelo painel de controle Ícones da área de notificação, e o que vimos nos estudos de usabilidade e com base no feedback beta é que os usuários não têm dificuldade em descobrir como personalizar o comportamento da notificação e promoverá os ícones aos quais eles desejam acesso rápido.

A sua aposta mais fácil é mostrar TODOS os ícones da Área de Notificação para todos os usuários. Isso pode ser feito adicionando uma entrada de registro (simples):

Em HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorercriar um novo valor DWORD chamado EnableAutoTraye defina-o 0para desligar o 'auto esconder' características Área de Notificação do.

Com algumas configurações e scripts da OU, você também pode usá-lo em um contexto HKCU, se desejar que isso aconteça para determinados usuários / grupos.

Veja aqui para mais informações sobre isso.

Ƭᴇcʜιᴇ007
fonte
Prefiro não mostrar todos os ícones, mas mostrarei se for necessário.
Joel Coehoorn
10

Eu estava pesquisando on-line e realmente encontrei isso aleatoriamente.

Para encurtar a história, uma combinação do PowerShell (script fornecido) e GPO.

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

Longa história, crie um script do PowerShell contendo o seguinte:

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

Salve-o como um arquivo ps1 usando o nome de sua escolha.

Abra o MMC de Gerenciamento de Diretiva de Grupo. Selecione o Objeto de Diretiva de Grupo escolhido, clique com o botão direito do mouse e selecione Editar. No editor, navegue para Configuração do usuário> Configurações do Windows> Scripts> Logon e clique em "Exibir propriedades". Vá para a guia PowerShell e clique em Exibir arquivos.

Copie o script que você acabou de criar na janela do Explorer que acabou de abrir e feche a janela.

Na janela de propriedades do script de logon, adicione um novo script do PowerShell, no nome do script, insira o nome do script usado (exemplo: NotifyIcon.ps1) e, nos parâmetros, insira o nome do programa (diferencia maiúsculas de minúsculas!) Seguido pela configuração a ser usada:

0 = mostrar apenas notificações 1 = ocultar ícone e notificações 2 = mostrar ícone e notificações <--- O que você precisa

Por exemplo, se você precisar que o servidor RealVNC sempre apareça, insira:

winvnc4.exe 2

como os paramenters

Você pode descobrir o nome do executável de duas maneiras diferentes, como abrir uma caixa de diálogo Executar e digitar msconfige ver os programas de inicialização, navegando manualmente para o diretório de instalação C:\Program Files\{your program}ou tentando corresponder ao programa desejado observando a execução. processos no Gerenciador de tarefas. 9 em 10 vezes isso resultará em sucesso.

Para que isso funcione, o usuário deve ter executado o aplicativo anteriormente e depois desconectado corretamente, para que o explorer.exe tenha a chance de gravar o histórico atualizado da área de notificação no Registro. Em um logon subsequente, o script deve localizar com sucesso o programa no histórico e atualizar sua configuração para sempre ser exibida.

Você também pode tentar executar o script manualmente a partir de um prompt do PowerShell para depuração, mas DEVE matar o explorer.exe ('taskkill / f / im explorer.exe') antes de executá-lo, caso contrário, o Explorer não verá sua atualização e substituirá quando parar.

Não aceito crédito por esse processo. Eu não escrevi, apenas encontrei. O crédito para o script vai para Micah Rowland . O crédito para o processo de GPO vai para Geoff Kendal

Joshua Parnell
fonte
Estou fora do escritório por um tempo e, quando voltar, já me esqueci disso. Se você puder responder este comentário no final da semana que vem, poderei dar uma olhada mais de perto e talvez mudar a resposta aceita.
Joel Coehoorn
As respostas somente de link são um não-não devido a uma possível rot-link futura. Inclua informações pertinentes em sua resposta. Também não nos importamos se você respondeu a uma pergunta antiga, é realmente uma coisa BOM, então considere remover seu "pedido de desculpas" e os motivos da postagem. :)
Sepcʜιᴇ007
@ techie007 Obrigado, editado @ Joel Coehoorn Vou postar um lembrete para me lembrar: P
Joshua Parnell
@JoelCoehoorn Aqui está sua resposta @. Desculpe, demorou tanto tempo, prumo esqueceu.
Joshua Parnell
Funciona bem, mas corre muito devagar: leva> 20 segundos para ser concluído no meu PC rápido e razoável.
Mozzis 28/03
4

Não sei se você pode definir a ordem do cache dos ícones, considerando que pode ser alterado constantemente se novos programas forem adicionados, mas você pode definir a notificação como "Sempre mostrar todos os ícones e notificações na barra de tarefas".

Para definir como padrão, acesse esta chave do Registro:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer

Adicione o valor DWORD " EnableAutoTray", clique duas vezes nele e defina o valor hexadecimal como " 0".

Eu testei isso e funcionou.

Nota interessante: tentei adicioná-lo a esta chave:

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

Eu sempre pensei que era o registro padrão para novos usuários, mas não funcionou. Por isso, procurei e encontrei este artigo interessante que acabou com meus pensamentos antigos sobre a chave .DEFAULT.

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

Além disso: o melhor que posso dizer é que as entradas do registro estão aqui. Se você tentasse definir um ícone como faria se abrisse " Control Panel\All Control Panel Items\Notification Area Icons":

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

Se você olhar para eles, eles não são muito compreensíveis, então não tenho certeza de quão bem você os editaria.

Sugiro que você considere criar um novo usuário e seu perfil, defina o "Painel de controle \ Todos os itens do painel de controle \ Ícones da área de notificação" para esse ícone (pelo menos) como "Mostrar ícone e notificações".

Em seguida, reinicie para liberar o perfil e efetue login como administrador. Copie esse perfil para o " C:\Users\Default" perfil. Você pode fazer isso manualmente usando o Explorer ou da maneira que costumávamos fazer " Control Panel\All Control Panel Items\System" " Advanced System Settings>Advanced>User Profiles>Copy to". Ele ficará acinzentado, mas você pode usar o Windows Enabler para contornar isso.

KCotreau
fonte
Prefiro não mostrar todos os ícones, mas mostrarei se for necessário.
Joel Coehoorn
Eu vou adicionar à resposta.
KCotreau
Eu vi a outras soluções perfil cópia Enabler e Windows, mas a experimentação mostrou que isso realmente está quebrado para o Windows 7. Isso me deixa triste :(
Joel Coehoorn
Concordo Joel, POR QUE eles desabilitariam essa função? Ainda não tenho nenhuma idéia além de pessoas tentando copiá-lo para o lugar errado.
KCotreau
@KCotreau: Estava nos blogs de implantação do Windows. Tem algo a ver com certas operações que acontecem apenas durante a criação do perfil, ou seja, "Preparando sua área de trabalho..." Francamente, é uma merda, mas posso ver por que eles estão tentando afastar todos desse método. É simplesmente imprevisível quais serão os resultados finais.
Surfasb
1

Execute isso como administrador:

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

Observe o HKLM em vez HKCU .

Verifique o efeito com:

ps explorer | kill

Mostra todos os ícones para todos os perfis.

majkinetor
fonte
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"
        }
}
Paulo
fonte
Para sua informação, existe um invólucro de formato de bloco de código para que você não precise usar <br>em todas as linhas.
Enigma
0

agora está disponível na política de grupo de versões posteriores, consulte a opção B

Todas essas opções estão disponíveis em User Configuration\Administrative Templates\Start Menu and Taskbar

Você também pode:

A) Desligue-o completamente ou ligue-o completamente ("oculte a área de notificação", funciona tanto para XP quanto 7)

B) Exiba tudo ou continue exibindo os ícones especificados pelo usuário ("desligue a limpeza da área de notificação, "funciona tanto no XP quanto no 7)

C) Desative apenas determinados ícones incluídos no GPO padrão, como Centro de ação, Rede, Medidor de bateria, Volume. Até onde eu sei, esses são os únicos 4 ícones da Área de Notificação com os quais você pode trabalhar através do GPO 2008R2 padrão (e estes funcionam apenas para Vista e acima ou 7 e acima).

technonath
fonte
1
Portanto, o que perguntei não está disponível via diretiva de grupo, pois quero forçar a exibição sempre de um ícone específico, e essa não é uma das opções de GPO descritas aqui.
Joel Coehoorn