ค้นหาเว็บไซต์

การใช้ภาพถ่ายผู้ใช้ Active Directory เป็นภาพการเข้าสู่ระบบบัญชีบน Windows


แอป Microsoft Office ส่วนใหญ่ (Outlook, SharePoint, Office365, Skype for Business ฯลฯ) อนุญาตให้ใช้ภาพถ่าย Active Directory (Azure AD) ของผู้ใช้ที่ลงชื่อเข้าใช้ในปัจจุบันเป็นรูปประจำตัวของผู้ใช้ในอินเทอร์เฟซ ในบทความนี้ เราจะแสดงวิธีการใช้ภาพถ่ายของผู้ใช้ Active Directory เป็นรูปภาพเข้าสู่ระบบบัญชี (อวาตาร์) สำหรับโปรไฟล์ผู้ใช้ Windows ที่ปรากฏบนหน้าจอล็อค หน้าจอต้อนรับ ในเมนูเริ่ม เป็นต้น

สำหรับงานนี้ เราจะใช้สคริปต์การเข้าสู่ระบบ PowerShell ขนาดเล็ก สคริปต์ควรทำงานเมื่อผู้ใช้เข้าสู่ระบบ Windows รับรูปถ่ายของผู้ใช้จาก Active Directory (แอตทริบิวต์ภาพขนาดย่อ) และตั้งค่าเป็นรูปโปรไฟล์ของโปรไฟล์ผู้ใช้ Windows

วิธีเพิ่มรูปภาพสำหรับผู้ใช้ Active Directory

รูปภาพของผู้ใช้ถูกจัดเก็บไว้ในแอตทริบิวต์พิเศษ (

thumbnailPhoto

) ของบัญชีใน Active Directory คุณสามารถตั้งค่าอิมเมจสำหรับผู้ใช้ของคุณโดยใช้เครื่องมือของบริษัทอื่น หรือ Set-ADUser cmdlet จากโมดูล Active Directory สำหรับ Windows PowerShell

  1. บันทึกภาพถ่ายของผู้ใช้ลงดิสก์ในรูปแบบ JPEG/BMP (ขนาดไฟล์ภาพอวาตาร์สูงสุดต้องไม่เกิน 100 KB และความละเอียดภาพไม่เกิน 96×96 พิกเซล)

  2. เพื่อตั้งค่าภาพบัญชี AD สำหรับผู้ใช้

    jchan

    ให้รันคำสั่ง:

    $photo = [byte[]](Get-Content C:\PS\jchan_photo.jpg -Encoding byte)
    Set-ADUser jchan -Replace @{thumbnailPhoto=$photo}
  3. เปิดคอนโซลผู้ใช้ Active Directory และคอมพิวเตอร์ (ADUC) สลับไปที่แท็บ Attribute Editor และตรวจสอบว่าตอนนี้แอตทริบิวต์ภาพขนาดย่อประกอบด้วยค่าหรือไม่

สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับวิธีจัดการรูปภาพของผู้ใช้ใน AD โปรดดูโพสต์ “จะเพิ่มหรืออัปเดตรูปภาพของผู้ใช้ใน Active Directory ได้อย่างไร ”

สร้าง GPO เพื่อใช้รูปโปรไฟล์บัญชีบน Windows

ตอนนี้คุณต้องกำหนดค่า Group Policy ของโดเมนที่จะกำหนดค่าตัวเลือกสภาพแวดล้อมเพื่อใช้รูปถ่ายของผู้ใช้ Active Directory เป็นรูปภาพเข้าสู่ระบบบัญชีบนคอมพิวเตอร์ Windows

    1. เปิดคอนโซลการจัดการนโยบายกลุ่ม (

    2. gpmc.msc

      ). สร้าง GPO ใหม่และเชื่อมโยงกับ OU (หน่วยขององค์กร) ที่มีคอมพิวเตอร์ของผู้ใช้

    3. ใน Windows คุณสามารถตั้งค่าภาพอวาตาร์ของผู้ใช้ (เส้นทางไปยังไฟล์ JPG ที่ใช้สำหรับโปรไฟล์ของผู้ใช้) ผ่านรีจิสตรีคีย์ HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\AccountPicture\Users คุณต้องอนุญาตให้ผู้ใช้เปลี่ยนรูปโปรไฟล์โดยตรงผ่านรีจิสตรี

    4. คุณสามารถปรับใช้การอนุญาตคีย์รีจิสทรีในโดเมน AD โดยใช้ GPO ไปที่ส่วน GPO การกำหนดค่าคอมพิวเตอร์ -> นโยบาย -> การตั้งค่า Windows -> การตั้งค่าความปลอดภัย -> รีจิสทรี สร้างคีย์รีจิสทรีใหม่ (เพิ่มคีย์) ด้วยเส้นทาง MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AccountPicture\Users

    5. ให้สิทธิ์ ควบคุมทั้งหมด สำหรับกลุ่มผู้ใช้โดเมน (

      [DomainName]\Users

      ) บนหน้าจอความปลอดภัยของฐานข้อมูล

    6. ในหน้าต่างถัดไป เลือกตัวเลือก แทนที่การอนุญาตที่มีอยู่ในคีย์ย่อยทั้งหมดด้วยสิทธิ์ที่สืบทอดได้ มิฉะนั้น ผู้ใช้จะไม่มีสิทธิ์ใช้คีย์ย่อยของรีจิสทรีที่ซ้อนกัน

    7. เปิดใช้งานตัวเลือก GPO กำหนดค่าโหมดการประมวลผลลูปแบ็คนโยบายกลุ่มของผู้ใช้=ผสาน (การกำหนดค่าคอมพิวเตอร์ -> เทมเพลตการดูแลระบบ -> ระบบ -> นโยบายกลุ่ม) ซึ่งจะทำให้คุณสามารถใช้นโยบายกับ OU ด้วยบัญชีคอมพิวเตอร์ได้

ตั้งค่ารูปโปรไฟล์บัญชีผู้ใช้บน Windows ด้วย PowerShell

ถัดไป คุณต้องสร้างสคริปต์ PowerShell ที่จะรับรูปภาพของผู้ใช้ปัจจุบันจาก Active Directory บันทึกเป็นไฟล์ JPG และตั้งเป็นรูปโปรไฟล์ของผู้ใช้

มีสองวิธีในการรับรูปภาพของผู้ใช้จาก AD คุณสามารถใช้ Get-ADUSer cmdlet จากโมดูล ActiveDirectory (โมดูลนี้ต้องติดตั้งบนคอมพิวเตอร์ทุกเครื่องผ่าน RSAT หรือคุณสามารถคัดลอกไฟล์โมดูล RSAT-AD-PowerShell ที่จำเป็นโดยไม่ต้องติดตั้ง RSAT) เพื่อให้สคริปต์เป็นสากลและทำงานได้อย่างถูกต้องโดยไม่ต้องติดตั้ง RSAT (รวมถึงบน Windows 7) เราจะเชื่อมต่อ AD โดยใช้คลาส ADSISearcher

โค้ดสคริปต์ 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 และบันทึกลงในโฟลเดอร์ในเครื่อง

C:\Users\Public\AccountPictures\{User SID}

. โฟลเดอร์จะมีไฟล์ JPG ที่มีความละเอียดต่างกันสำหรับองค์ประกอบอินเทอร์เฟซ Windows ที่แตกต่างกัน: image32.jpg (32×32), image40.jpg (40×40) เป็นต้น

ในการผูกไฟล์ภาพถ่ายเหล่านี้กับโปรไฟล์ผู้ใช้ สคริปต์จะสร้างการแมปภายใต้คีย์รีจิสทรี HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\AccountPicture\Users\{User_SID}

คัดลอกรหัสสคริปต์ PowerShell และบันทึกลงในไฟล์ PS1 ใหม่บนตัวควบคุมโดเมนในโฟลเดอร์ NetLogon (

 \\a-d.site\NETLOGON\SetADPicture.ps1

)

สำคัญ หากคุณบันทึกสคริปต์การเข้าสู่ระบบ PS1 ลงในไดเร็กทอรี NETLOGON คุณไม่จำเป็นต้องกำหนดค่าตัวเลือก PowerShell Script Execution Policy แยกต่างหาก

คุณต้องเรียกใช้สคริปต์ PowerShell นี้เมื่อผู้ใช้ลงชื่อเข้าใช้ Windows วิธีที่ง่ายที่สุดในการดำเนินการนี้คือการใช้คุณลักษณะสคริปต์การเข้าสู่ระบบ GPO

  1. โดยเปิด GPO ที่สร้างไว้ก่อนหน้านี้แล้วไปที่ การกำหนดค่าผู้ใช้ -> นโยบาย -> การตั้งค่า Windows -> สคริปต์ (เข้าสู่ระบบ/ออกจากระบบ)

  2. เลือก เข้าสู่ระบบ ไปที่แท็บ สคริปต์ PowerShell แล้วคลิก เพิ่ม

  3. ระบุเส้นทาง UNC แบบเต็มไปยังไฟล์สคริปต์ SetADPicture.ps1 ใน NETLOGON

คุณต้องออกจากระบบและเข้าสู่ระบบ (สองครั้ง) เพื่อใช้การตั้งค่า GPO ใหม่ และตั้งค่ารูปถ่าย Active Directory เป็นโปรไฟล์ผู้ใช้ Windows ของคุณ

ตรวจสอบว่ารูปภาพของผู้ใช้จาก AD แสดงบนหน้าจอเข้าสู่ระบบ Windows, เมนูเริ่ม และในองค์ประกอบอินเทอร์เฟซอื่นๆ หรือไม่ ตัวอย่างเช่น ตรวจสอบภาพผู้ใช้ของคุณบนแท็บบัญชีในแผงการตั้งค่า (คำสั่ง URI ทางลัด

ms-settings:accounts

).

หากนโยบายไม่ได้ผล:

  1. หากไม่เปิดใช้งาน Windows จะไม่แสดงอวาตาร์ของผู้ใช้ (ตรวจสอบสถานะการเปิดใช้งาน Windows บนคอมพิวเตอร์ของผู้ใช้)

  2. ตรวจสอบการตั้งค่า GPO ที่เป็นผลลัพธ์และตรวจสอบให้แน่ใจว่าไม่ได้เปิดใช้งานนโยบาย ใช้รูปภาพการเข้าสู่ระบบเริ่มต้นกับผู้ใช้ทั้งหมด (การตั้งค่าคอมพิวเตอร์-> นโยบาย-> เทมเพลตการดูแลระบบ-> แผงควบคุม-> บัญชีผู้ใช้)

  3. แก้ไขปัญหา Group Policy บนคอมพิวเตอร์เป้าหมายด้วยเครื่องมือ gpresult

คุณสามารถใช้สคริปต์ PowerShell นี้เพื่อกำหนดค่าภาพถ่ายผู้ใช้ Active Directory เป็นอิมเมจการเข้าสู่ระบบบัญชีสำหรับระบบปฏิบัติการที่รองรับทั้งหมด: Windows 11, 10, 8.1 และ Windows Server 2022, 2019, 2016, 2012 R2 (รวมถึงสถานการณ์ที่มีโฮสต์ RDS แบบสแตนด์อโลนและเดสก์ท็อประยะไกล ฟาร์มบริการ).

บทความที่เกี่ยวข้อง