Назад | Перейти на главную страницу

Авторизация пользователя в домене

Как я могу изменить «изображение пользователя» для каждого отдельного пользователя, которое отображается во время входа в систему для компьютеров с 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.