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

13

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

Eu prefiro não mostrar todos os ícones, em parte pela mesma razão que eles estão escondidos: Eu não quero a desordem. Além disso, como este é um computador público, há outro programa chamado DeepFreeze em execução que também tem um ícone na bandeja do sistema, e eu não quero que o ícone seja exibido o tempo todo.

    
por Joel Coehoorn 02.08.2011 / 15:41

6 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 a maneira como ele acompanha o torna específico para o usuário atual e o sistema, fazendo com que as "configurações" variem muito de uma instância para outra.

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

De aqui :

There is no way for applications to programmatically always show themselves top level on the system tray either on first install or at any time during runtime. This is one of several changes we’ve made in Windows 7 in an effort to produce a cleaner, quieter desktop that is in the user’s control to customize the top level with their favorite applications and icons.

We keep the user in control of the notification area by not allowing programmatic promotion (other than temporarily or to show a notification). Assuming the machine is sufficiently quiet, when you first add your icon with Shell_NotifyIcon(NIM_ADD, ...) it will be shown on the taskbar for 45 seconds, then move into the overflow thereafter. If the user promotes an icon, it will always live on the taskbar. If the user demotes it, the icon will never be seen on the taskbar. Any promotion needs to be user initiated. We’ve made this much easier in Windows 7 via drag/drop & through the Notification Area Icons control panel, and what we’ve seen in usability studies and based on beta feedback, is that users have no difficulties discovering how to customize notification behavior and will promote the icons they want quick access to.

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\Explorer , crie um novo valor DWORD chamado EnableAutoTray e defina-o como 0 para desativar os recursos de 'ocultamento automático' da Área de notificação.

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

Veja aqui para mais informações sobre isso.

    
por 02.08.2011 / 16:59
10

Eu estava pesquisando on-line e encontrei isso aleatoriamente.

Resumindo, uma combinação de PowerShell (script fornecido) e GPO.

link

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 como um arquivo ps1 usando o nome de sua escolha.

Abra o MMC de Gerenciamento de Diretiva de Grupo. Selecione o Objeto de Política de Grupo escolhido, clique com o botão direito e selecione Editar. No editor, navegue até Configuração do usuário > Configurações do Windows > Scripts > Logon e clique em "Propriedades de Vídeo". Vá para a guia do 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 login, adicione um novo script do PowerShell, no nome do script, insira o nome do script usado (exemplo: NotifyIcon.ps1) e, em seguida, nos parâmetros, insira o nome do programa !) seguido pela configuração para usar:

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

Exemplo, se você precisar que o servidor RealVNC sempre apareça, digite:

winvnc4.exe 2

como os paramentadores

Você pode descobrir o nome do executável de duas maneiras diferentes, como abrir uma caixa de diálogo Executar, digitar msconfig e examinar os programas de inicialização, navegar manualmente para o diretório de instalação C:\Program Files\{your program} ou tentar coincidir com o programa desejado, olhando para os processos em execução no Gerenciador de Tarefas. 9 vezes em 10 resultará em sucesso.

Para que isso funcione, o usuário deve ter executado o aplicativo anteriormente e, em seguida, 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 login subseqüente, o script deve localizar com êxito 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 depurar, 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 irá sobrescrevê-lo quando ele sair.

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

    
por 05.09.2013 / 16:44
4

Não sei se você pode definir a ordem de cache dos ícones, considerando que ela pode estar constantemente mudando 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, vá para 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: primeiro tentei adicioná-lo a essa chave:

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

Sempre achei que esse era o registro padrão para novos usuários, mas não funcionava. Então eu fui procurar e encontrei este artigo interessante rebentando os meus pensamentos de longa data sobre a chave .DEFAULT.

link

Adição: O melhor que posso dizer é que as entradas do registro estão aqui. Se você fosse tentar definir um ícone da maneira que 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 como você faria isso.

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, reinicialize para liberar o perfil e faça login como administrador. Copie esse perfil para o perfil " C:\Users\Default ". Você pode fazer isso manualmente usando o Explorer, ou a maneira como costumávamos fazer isso em " Control Panel\All Control Panel Items\System " " Advanced System Settings>Advanced>User Profiles>Copy to ". Ele ficará cinza, mas você pode usar o Windows Enabler para contornar isso.

    
por 02.08.2011 / 16:35
1

Execute isso como administrador:

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

Observe o HKLM em vez disso HKCU .

Verifique o efeito com:

ps explorer | kill

Ele mostra todos os ícones para todos os perfis.

    
por 15.05.2015 / 14:07
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"
        }
}
    
por 09.03.2016 / 14:56
0

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

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

Você pode:

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

B) Mostra tudo, ou continua a mostrar os ícones que o usuário especifica ("desativa a limpeza da área de notificação", funciona tanto para XP quanto para 7)

C) Desative apenas alguns ícones incluídos no GPO padrão, como Central de Ações, Rede, Medidor de Bateria, Volume. Tanto quanto eu posso dizer, 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 o Vista e acima ou 7 e acima).

    
por 21.10.2014 / 12:27