web-dev-qa-db-ja.com

Windows 7のすべてのプロファイルで特定のトレイアイコンを常に表示する

私はWindows 7マシンをセットアップしています。これは、戸外で座り、多くの人々と共有されます。システムトレイにあるプログラムを実行するために、すべてのユーザーのスタートメニューにショートカットを追加しました。ログインしているユーザーに関係なく、このプログラムのトレイアイコンがデフォルトで常に表示されるようにします。ユーザーが本当に必要な場合は、ユーザーのプロファイルでこのアイコンをオフにできますが、少なくとも常に表示されるように設定しておく必要があります。これどうやってするの?

一部のアイコンはそもそも非表示になっているのと同じ理由で、すべてのアイコンを表示するのではなく、煩雑にしたくありません。また、これは公共のコンピューターなので、DeepFreezeと呼ばれる別のプログラムが実行されており、これにもシステムトレイアイコンがあり、そのアイコンを常に表示したくありません。

13
Joel Coehoorn

ナットシェルでは、現在、これを行うことはできません。

これを設定するためのグループポリシーや設定はありません。追跡方法により、現在のユーザーとシステムに固有のものになり、「設定」はインスタンスごとに大きく異なります。

チェックアウトしたい場合は、ここに(レジストリーに)保管されます:HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify

から ここ

アプリケーションが最初のインストール時または実行時の任意の時点で、プログラムによって常にシステムトレイのトップレベルに表示される方法はありません。これは、お気に入りのアプリケーションとアイコンでトップレベルをカスタマイズするためにユーザーが制御できる、よりクリーンで静かなデスクトップを作成するためにWindows 7で行ったいくつかの変更の1つです。

プログラムによる昇格を許可しないことにより(一時的または通知の表示を除く)、ユーザーが通知領域を制御できるようにします。マシンが十分に静かであると仮定して、Shell_NotifyIcon(NIM_ADD、...)でアイコンを最初に追加すると、アイコンがタスクバーに45秒間表示され、その後オーバーフローに移動します。ユーザーがアイコンを昇格した場合、アイコンは常にタスクバーに表示されます。ユーザーが降格した場合、アイコンはタスクバーに表示されません。プロモーションはユーザーが開始する必要があります。 Windows 7では、これをドラッグアンドドロップおよび通知領域アイコンコントロールパネルを介してはるかに簡単にしました。ユーザビリティ調査でベータフィードバックに基づいて確認したところ、ユーザーは通知動作をカスタマイズする方法を見つけるのに苦労しません。そして、すばやくアクセスしたいアイコンを宣伝します。

最も簡単な方法は、すべてのユーザーにすべての通知領域アイコンを表示することです。これは、(単純な)レジストリエントリを追加することで実行できます。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorerで、EnableAutoTrayという名前の新しいDWORD値を作成し、0に設定して、通知領域の「自動非表示」機能をオフにします。

一部のOU構成とスクリプトでは、特定のユーザー/グループに対してのみ発生させたい場合は、HKCUコンテキストでも使用できます。

詳細は here を参照してください。

11

私はオンラインで検索していて、実際にこれをランダムに見つけました。

要するに、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}、またはタスクマネージャで実行中のプロセスを確認して、目的のプログラムと一致させようとします。 10回のうち9回はこれで成功するでしょう。

これが機能するためには、ユーザーが以前にアプリケーションを実行してから適切にログアウトし、Explorer.exeが更新された通知領域の履歴をレジストリに書き込む機会を得る必要があります。その後のログイン時に、スクリプトは履歴内でプログラムを正常に検索し、設定が常に表示されるように更新する必要があります。

PowerShellプロンプトから手動でスクリプトを実行してデバッグすることもできますが、実行する前にExplorer.exe( 'taskkill/f/im Explorer.exe')を強制終了する必要があります。そうしないと、エクスプローラーに更新が表示されず、上書きされますそれが終了したときにそれを。

私はこのプロセスを信用しません。書きませんでした。スクリプトのクレジットは Micah Rowland に送られます。 GPOプロセスのクレジット Geoff Kendal のクレジット

10
Joshua Parnell

新しいプログラムが追加された場合に常に変更される可能性があることを考慮して、アイコンのキャッシュ順序を設定できるかどうかはわかりませんが、通知を「常にすべてのアイコンとタスクバーに表示する」に設定できます。

これをデフォルトに設定するには、次のレジストリキーに移動します。

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer

DWORD値 "EnableAutoTray"を追加してダブルクリックし、16進数値を "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」を開いた場合と同じようにアイコンを1つ設定してみてください。

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

よく見るとわかりにくいので、どれだけ上手く編集できるかわかりません。

新しいユーザーとそのプロファイルを作成することを検討することをお勧めします。その1つのアイコンの[コントロールパネル\すべてのコントロールパネルアイテム\通知領域アイコン]を(少なくとも)[アイコンと通知を表示]に設定します。

次に、再起動してプロファイルを解放し、管理者としてログインします。そのプロファイルを「C:\Users\Default」プロファイルにコピーします。これは、エクスプローラーを使用して手動で行うことも、「Control Panel\All Control Panel Items\System」「Advanced System Settings>Advanced>User Profiles>Copy to」で行った方法で行うこともできます。グレー表示になりますが、 Windowsイネーブラー を使用して回避できます。

4
KCotreau
#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
paul

これを管理者として実行します。

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

代わりに[〜#〜] hklm [〜#〜][〜#〜] hkcu [〜#〜]に注意してください。

効果を確認する:

ps Explorer | kill

すべてのプロファイルのすべてのアイコンが表示されます。

1
majkinetor

新しいバージョンのグループポリシーで使用できるようになりました。オプションBを参照してください

これらのオプションはすべてUser Configuration\Administrative Templates\Start Menu and Taskbar

次のいずれかを行うことができます。

A)完全にオフにするか、完全にオンにします(「通知領域を非表示にする」は、XPと7の両方で機能します)

B)すべてを表示するか、ユーザーが指定したアイコンを引き続き表示します(「通知領域のクリーンアップをオフにする」は、両方に有効ですXPおよび7)

C)アクションセンター、ネットワーク、バッテリーメーター、音量など、デフォルトのGPOに含まれる特定のアイコンのみを無効にします。私が知る限り、これらは、デフォルトの2008R2で操作できる唯一の4つの通知領域アイコンですGPO(およびこれらはVista以上または7以上でのみ機能します)。

0
technonath