ドメイン全体でWindowsVista、7、2008、2008R2マシンのログオン中に表示される個々のユーザーの「ユーザー画像」を変更するにはどうすればよいですか?
あなたが言及するOSの場合、Shell32.dllに未公開の関数があり、これは単なるチケットです。マイクロソフトではサポートしませんが、いくつかの環境で問題はありませんでした。 エントリポイントは#262です。
以下のように、PowerShellで使用するためにインポートできます。
# Set user tile
$code = @"
[DllImport("Shell32.dll", EntryPoint = "#262", CharSet = CharSet.Unicode, PreserveSig = false)]
public static extern void SetUserTile(string username, int whatever, string picpath);
public static void ChangeUserPicture(string username, string picpath) {
SetUserTile(username, 0, picpath);
}
"@
Add-Type -MemberDefinition $code -NameSpace Shell32 -Name ChangeUserTile
つまり、次のように同じスクリプトで呼び出すことができます。
[Shell32.ChangeUserTile]::ChangeUserPicture(<username>,<pathtoimage>)
ADからイメージを取得するログオンスクリプトとして、以下を使用しました。
# Set User Photo Script
# Reads user's photo from AD and sets as users local display picture
# Find User
$search = [System.DirectoryServices.DirectorySearcher][System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain().GetDirectoryEntry()
$search.Filter = "(sAMAccountName=$env:username)"
$user = $search.FindOne().GetDirectoryEntry()
# Save image to %appdata%
$user.thumbnailphoto | Set-Content $env:appdata\usertilecache.jpg -Encoding byte
# Set user tile
$code = @"
[DllImport("Shell32.dll", EntryPoint = "#262", CharSet = CharSet.Unicode, PreserveSig = false)]
public static extern void SetUserTile(string username, int whatever, string picpath);
public static void ChangeUserPicture(string username, string picpath) {
SetUserTile(username, 0, picpath);
}
"@
Add-Type -MemberDefinition $code -NameSpace Shell32 -Name ChangeUserTile
[Shell32.ChangeUserTile]::ChangeUserPicture(($env:userdomain + "\" + $env:username),($env:appdata + "\usertilecache.jpg"))
# Tidy up
Remove-Item ($env:appdata + "\usertilecache.jpg")
それ以来、同じことを行うコンパイル済みの.NETアプリの使用に切り替えましたが、はるかにパフォーマンスが向上しています-ログオン時に重要です。
また、起動時に呼び出して、まだマシンにログインしていないユーザーの画像を設定することもできました。デフォルトのオレンジ色の花!
Windows 8以降では、完全に再設計する必要があったことも指摘する価値があるかもしれません-MSからの新しいメカニズムが現在あります。