Imagem do usuário de login no domínio

7

Como posso alterar a "imagem do usuário" para cada usuário individual que é exibido durante o logon das máquinas do Windows Vista, 7, 2008, 2008R2 em um domínio?

    
por Nate 29.07.2010 / 22:47

1 resposta

3

Para os SOs que você mencionou, há uma função não publicada no shell32.dll que é apenas o ticket. Usá-lo não será suportado pela Microsoft, mas não tive nenhum problema em vários ambientes. O ponto de entrada é # 262 .

Você pode importá-lo para uso no PowerShell, como abaixo:

# 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

O que significa que você pode chamá-lo no mesmo script de forma simples:

[Shell32.ChangeUserTile]::ChangeUserPicture(<username>,<pathtoimage>)

Eu usei o seguinte como um script de logon que também captura a imagem do 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")

Devo salientar que, desde então, mudei para o uso de um aplicativo .NET compilado que faz o mesmo, mas com muito melhor desempenho - crítico no momento do logon.

Ele também me deu a opção de ligar no tempo de inicialização e definir a imagem para os usuários que ainda não tinham feito login em uma máquina, o que foi uma boa adição para novos usuários que conseguiram ver seu rosto no PC atribuído em vez da flor laranja padrão!

Também vale a pena ressaltar que, para o Windows 8 em diante, tivemos que reprojetar completamente - agora existe um novo mecanismo da MS.

    
por 12.09.2015 / 18:43