Как я могу изменить «изображение пользователя» для каждого отдельного пользователя, которое отображается во время входа в систему для компьютеров с Windows Vista, 7, 2008, 2008R2 во всем домене?
Для упомянутых вами ОС есть неопубликованная функция в shell32.dll это просто билет. Его использование не будет поддерживаться Microsoft, но у меня не было проблем в нескольких средах. Точка входа - # 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.