Windows如今能够设置用户头像,并在开始菜单显示。若是你安装了Exchange或者Lync,那么能够在Outlook或者Skype里看到用户的头像。这个图片是存储在AD用户属性里的。对于桌面电脑的设置,咱们能够一样利用这个属性将AD中的图片做为域帐户的图片在客户端本地显示。shell
整体思路是,从AD中获取用户头像。而后在本地配置获取的图片做为当前用户的头像。windows
获取用户头像,并修改注册表配置用户头像能够利用如下powershell脚本。服务器
[CmdletBinding(SupportsShouldProcess=$true)]Param()
function Test-Null($InputObject) { return !([bool]$InputObject) }
$ADuser = ([ADSISearcher]"(&(objectCategory=User)(SAMAccountName=$env:username))").FindOne().Properties
$ADuser_photo = $ADuser.thumbnailphoto
$ADuser_sid = [System.Security.Principal.WindowsIdentity]::GetCurrent().User.Value
If ((Test-Null $ADuser_photo) -eq $false) {
$img_sizes = @(32, 40, 48, 96, 192, 200, 240, 448)
$img_mask = "Image{0}.jpg"
$img_base = "C:\ProgramData\AccountPictures"
$reg_base = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\AccountPicture\Users{0}"
$reg_key = [string]::format($reg_base, $ADuser_sid)
$reg_value_mask = "Image{0}"
If ((Test-Path -Path $reg_key) -eq $false) { New-Item -Path $reg_key }
Try {
ForEach ($size in $img_sizes) {
$dir = $img_base + "\" + $ADuser_sid
If ((Test-Path -Path $dir) -eq $false) { $(mkdir $dir).Attributes = "Hidden" }
$file_name = ([string]::format($img_mask, $size))
$path = $dir + "\" + $file_name
Write-Verbose " saving: $file_name"
$ADuser_photo | Set-Content -Path $path -Encoding Byte -Force
$name = [string]::format($reg_value_mask, $size)
$value = New-ItemProperty -Path $reg_key -Name $name -Value $path -Force
}
}
Catch {
Write-Error "Check permissions to files or registry."
}
}ide
脚本中会根据用户的SID,将图片保存在C:\ProgramData\AccountPictures目录里。在用户SID对应的文件夹里会产生Image32 Image 448等图片以应对不一样尺寸设置的需求。在注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AccountPicture\Users下对应用户的SID下也会有各类尺寸照片对应的具体存放位置。若是看不到图,请点我。
可是普通域用户对于这个注册表键值并无权限,没法直接写入。咱们须要把注册表先建好,赋好权限。能够利用组策略建立这个项目,并给予Domain Users彻底控制权限。新建一个组策略,在其中Computer Configuration--Policies--Windows Settings-Security Settings-Registry中新建一条,选择MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AccountPicture\Users而且添加Domain Users的Full Control权限。选择对继承权限的全部子项目替换现有权限。.net
而后继续利用这条策略,将以前的powershell脚本也配置在这里。在User Configuration--Windows Settings--Scriptes--Logon里面新建一个脚本。脚本名字%windir%\System32\WindowsPowerShell\v1.0\powershell.exe,脚本参数-Noninteractive -ExecutionPolicy Bypass -Noprofile -File %logonserver%\netlogon\SetADPicture.ps1。3d
记得把脚本文件放到域控的netlogon共享里。netlogon一般是C:\Windows\SYSVOL\sysvol\contoso.lab\SCRIPTS文件夹。因为是在sysvol中,只须要复制到一台域控上,系统会自动同步到其它服务器上。
因为添加注册表是计算机策略,用户登陆脚本是用户策略。因此,这条策略须要应用到客户端计算机OU上也须要应用在用户OU上。或者你能够将其拆分红2条策略,分别应用在计算机和用户OU上。
配置完成以后,须要从新启动计算机。当客户端启动时,会执行新建注册表的策略。用户登陆时会从AD用户属性中获取图片,并保存在本地,同时配置本地注册表信息将图片指向这些获取的图片文件。可是这个时候,用户图片并不会显示,由于登陆的那一刻用户脚本并无执行,用户头像仍是空白的。确认文件和对应的注册表都建立出来后,注销再登陆就能够显示用户头像了。同理,当更新AD用户图片后,客户端第一次登陆显示的仍然是旧图片。可是此时新的图片已经下载到本地了,而且覆盖旧图片了,下次登陆时就能正常显示了。
参考文章orm
http://woshub.com/how-to-set-windows-user-account-picture-from-active-directory/server