在 Windows 上使用 Active Directory 用户照片作为帐户登录图像
大多数 Microsoft Office 应用程序(Outlook、SharePoint、Office365、Skype for Business 等)允许在其界面中使用当前登录用户的 Active Directory (Azure AD) 照片作为用户的头像。在本文中,我们将向您展示如何使用 Active Directory 用户的照片作为出现在锁定屏幕、欢迎屏幕、开始菜单等上的 Windows 用户配置文件的帐户登录图像(头像)。
对于此任务,我们将使用一个小型 PowerShell 登录脚本。该脚本应在用户登录 Windows 时运行,从 Active Directory 获取用户的照片(thumbnailPhoto 属性),并将其设置为 Windows 用户配置文件的个人资料图片。
如何为 Active Directory 用户添加照片?
用户的照片存储在一个特殊的属性中(
thumbnailPhoto) 的 Active Directory 中的帐户。您可以使用第三方工具或 Windows PowerShell 的 Active Directory 模块中的 Set-ADUser cmdlet 为用户设置图像。
-
将用户照片以JPEG/BMP格式保存到磁盘(头像图像文件大小最大不得超过100KB,图像分辨率不得超过96×96像素);
为了设置用户的AD帐户图像
jchan,运行命令:
$photo = [byte[]](Get-Content C:\PS\jchan_photo.jpg -Encoding byte) Set-ADUser jchan -Replace @{thumbnailPhoto=$photo}打开 Active Directory 用户和计算机控制台 (ADUC),切换到“属性编辑器”选项卡,然后检查缩略图属性现在是否包含值。
有关如何在 AD 中管理用户照片的更多详细信息,请参阅帖子“如何在 Active Directory 中添加或更新用户照片?” ”
创建 GPO 以在 Windows 上应用帐户个人资料图片
现在,您需要配置一个域组策略,该策略将配置环境选项以使用 Active Directory 用户照片作为 Windows 计算机上的帐户登录图像。
打开组策略管理控制台(
gpmc.msc)。创建一个新的GPO并将其链接到包含用户计算机的OU(组织单位);
在 Windows 中,您可以通过 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\AccountPicture\Users 注册表项设置用户的头像图像(用于用户个人资料的 JPG 文件的路径)。您需要允许用户直接通过注册表更改他们的个人资料照片;
-
您可以使用GPO在AD域中部署注册表项权限。导航到 GPO 部分计算机配置 -> 策略 -> Windows 设置 -> 安全设置 -> 注册表。创建一个新的注册表项(添加项),路径为MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AccountPicture\Users;
授予域用户组完全控制权限(
[DomainName]\Users) 在数据库安全屏幕上;
在下一个窗口中,选择选项用可继承权限替换所有子项上的现有权限,否则,用户将不具有嵌套注册表子项的权限;
启用 GPO 选项配置用户组策略环回处理模式=合并(计算机配置 -> 管理模板 -> 系统 -> 组策略)。这将允许您将策略应用到具有计算机帐户的 OU。
使用 PowerShell 在 Windows 上设置用户帐户个人资料照片
接下来,您需要创建一个 PowerShell 脚本,该脚本将从 Active Directory 获取当前用户的照片,将其保存到 JPG 文件,并将其设置为用户的个人资料图像。
有两种方法可以从 AD 获取用户的照片。您可以使用 ActiveDirectory 模块中的 Get-ADUser cmdlet(此模块必须通过 RSAT 安装在所有计算机上,或者您可以仅复制必要的 RSAT-AD-PowerShell 模块文件而不安装 RSAT)。为了使脚本具有通用性并在不安装 RSAT 的情况下正常工作(包括在 Windows 7 上),我们将使用 ADSISearcher 类连接 AD。
SetADPicture.ps1脚本代码:
Function ResizeImage {
Param (
[Parameter(Mandatory = $True, HelpMessage = "image in byte")]
[ValidateNotNull()]
$imageSource,
[Parameter(Mandatory = $true, HelpMessage = "Betwwen 16 and 1000")]
[ValidateRange(16, 1000)]
$canvasSize,
[Parameter(Mandatory = $true, HelpMessage = "Between 1 and 100")]
[ValidateRange(1, 100)]
$ImgQuality = 100
)
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
$imageBytes = [byte[]]$imageSource
$ms = New-Object IO.MemoryStream($imageBytes, 0, $imageBytes.Length)
$ms.Write($imageBytes, 0, $imageBytes.Length);
$bmp = [System.Drawing.Image]::FromStream($ms, $true)
# Image size after conversion
$canvasWidth = $canvasSize
$canvasHeight = $canvasSize
# Set picture quality
$myEncoder = [System.Drawing.Imaging.Encoder]::Quality
$encoderParams = New-Object System.Drawing.Imaging.EncoderParameters(1)
$encoderParams.Param[0] = New-Object System.Drawing.Imaging.EncoderParameter($myEncoder, $ImgQuality)
# Get image type
$myImageCodecInfo = [System.Drawing.Imaging.ImageCodecInfo]::GetImageEncoders() | Where-Object { $_.MimeType -eq 'image/jpeg' }
# Get aspect ration
$ratioX = $canvasWidth / $bmp.Width;
$ratioY = $canvasHeight / $bmp.Height;
$ratio = $ratioY
if ($ratioX -le $ratioY) {
$ratio = $ratioX
}
# Create an empty picture
$newWidth = [int] ($bmp.Width * $ratio)
$newHeight = [int] ($bmp.Height * $ratio)
$bmpResized = New-Object System.Drawing.Bitmap($newWidth, $newHeight)
$graph = [System.Drawing.Graphics]::FromImage($bmpResized)
$graph.Clear([System.Drawing.Color]::White)
$graph.DrawImage($bmp, 0, 0 , $newWidth, $newHeight)
# Create an empty stream
$ms = New-Object IO.MemoryStream
$bmpResized.Save($ms, $myImageCodecInfo, $($encoderParams))
# cleanup
$bmpResized.Dispose()
$bmp.Dispose()
return $ms.ToArray()
}
$ADUserInfo = ([ADSISearcher]"(&(objectCategory=User)(SAMAccountName=$env:username))").FindOne().Properties
$ADUserInfo_sid = [System.Security.Principal.WindowsIdentity]::GetCurrent().User.Value
If ($ADUserInfo.thumbnailphoto) {
$img_sizes = @(32, 40, 48, 96, 192, 200, 240, 448)
$img_base = "C:\Users\Public\AccountPictures"
$reg_key = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\AccountPicture\Users\$ADUserInfo_sid"
If ((Test-Path -Path $reg_key) -eq $false) { New-Item -Path $reg_key } { write-verbose "Reg key exist [$reg_key]" }
Try {
ForEach ($size in $img_sizes) {
$dir = $img_base + "\" + $ADUserInfo_sid
If ((Test-Path -Path $dir) -eq $false) { $(New-Item -ItemType directory -Path $dir).Attributes = "Hidden" }
$file_name = "Image$($size).jpg"
$path = $dir + "\" + $file_name
Write-Verbose " Crete file: [$file_name]"
try {
ResizeImage -imageSource $($ADUserInfo.thumbnailphoto) -canvasSize $size -ImgQuality 100 | Set-Content -Path $path -Encoding Byte -Force -ErrorAction Stop
Write-Verbose " File saved: [$file_name]"
}
catch {
If (Test-Path -Path $path) {
Write-Warning "File exist [$path]"
}
else {
Write-Warning "File not exist [$path]"
}
}
$name = "Image$size"
try {
$null = New-ItemProperty -Path $reg_key -Name $name -Value $path -Force -ErrorAction Stop
}
catch {
Write-Warning "Reg key edit error [$reg_key] [$name]"
}
}
}
Catch {
Write-Error "Check permissions to files or registry."
}
}
该脚本从Active Directory中获取当前用户的thumbnailphoto属性值并将其保存到本地文件夹
C:\Users\Public\AccountPictures\{User SID}。该文件夹将包含针对不同 Windows 界面元素的不同分辨率的 JPG 文件:image32.jpg (32×32)、image40.jpg (40×40) 等。
为了将这些照片文件绑定到用户配置文件,该脚本将在注册表项 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\AccountPicture\Users\{User_SID} 下创建映射。
复制 PowerShell 脚本代码并将其保存到域控制器上 NetLogon 文件夹中的新 PS1 文件 (
\\a-d.site\NETLOGON\SetADPicture.ps1)
重要。如果将 PS1 登录脚本保存到 NETLOGON 目录,则无需单独配置 PowerShell 脚本执行策略选项。
当用户登录 Windows 时,您需要运行此 PowerShell 脚本。实现此目的的最简单方法是使用 GPO 登录脚本功能。
为此,请打开之前创建的 GPO 并导航至用户配置 -> 策略 -> Windows 设置 -> 脚本(登录/注销);
选择登录,进入PowerShell脚本选项卡,点击添加;
在 NETLOGON 中指定 SetADPicture.ps1 脚本文件的完整 UNC 路径。
您必须注销并登录(两次)才能应用新的 GPO 设置并将 Active Directory 照片设置到 Windows 用户配置文件。
检查 AD 中的用户照片现在是否显示在 Windows 登录屏幕、开始菜单和其他界面元素中。例如,在“设置”面板的“帐户”选项卡上检查您的用户图像(快捷方式 URI 命令
ms-settings:accounts)。
如果政策不起作用:
如果Windows未激活,则不会显示用户头像(检查用户计算机上的Windows激活状态);
检查生成的 GPO 设置,并确保未启用策略将默认登录图片应用于所有用户(计算机设置 -> 策略 -> 管理模板 -> 控制面板 -> 用户帐户);
使用 gpresult 工具对目标计算机上的组策略进行故障排除。
您可以使用此 PowerShell 脚本将 Active Directory 用户照片配置为所有支持的操作系统的帐户登录图像:Windows 11、10、8.1 和 Windows Server 2022、2019、2016、2012 R2(包括具有独立 RDS 主机和远程桌面服务场的场景)。







