Trong bài viết này, chúng tôi sẽ hướng dẫn cách cài đặt các font bổ sung trên các máy tính trong miền Active Directory bằng cách sử dụng Group Policy và script PowerShell. Hướng dẫn này đã được kiểm tra trên Windows 10 20H2 và Windows Server 2016/2019 hiện hành.
Nội dung:
- Triển khai Font mới qua GPO
- Cài đặt Font Windows bằng Script PowerShell Logon
Triển khai Font mới qua GPO
Nếu bạn chỉ muốn cài đặt một hoặc hai font mới, bạn có thể làm điều này bằng Group Policy. Để cài đặt font, hãy sao chép file *.ttf vào %WindowsDir%\Fonts\ trên máy khách và thêm thông tin font mới vào khóa registry HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts.
- Sao chép file font TTF vào thư mục chia sẻ mạng trên file server của bạn (nếu chỉ có một vài font mới, bạn có thể lưu chúng trong thư mục SYSVOL trên domain controller);

- Mở bảng điều khiển Group Policy Management (
gpmc.msc), tạo chính sách mới GPO_InstallFonts và liên kết nó với OU chứa các máy tính;
- Chỉnh sửa chính sách;
- Tạo quy tắc mới trong Group Policy Preferences để sao chép file font từ thư mục chia sẻ đến
%WindowsDir%\Fonts\trên thiết bị khách. Chúng tôi đã trình bày cách sao chép file đến máy tính bằng GPO trước đó. Tạo chính sách nhóm theo các hướng dẫn này. Đi đến Computer Configuration -> Preferences -> Windows Settings -> Files. Tạo mục nhập chính sách với các tham số sau:Source:\\woshub.com\SYSVOL\woshub.com\scripts\Fonts\Roboto-Black.ttf
Destination:%WindowsDir%\Fonts\Roboto-Black.ttf
- Bây giờ bạn cần thêm thông tin về font mới vào registry. Để thực hiện thay đổi registry bằng GPO, bạn cũng có thể sử dụng GPP (Computer Configuration -> Preferences -> Windows Settings -> Registry);
- Bạn có thể chỉ định thông tin font trong registry thủ công. Tuy nhiên, việc cài đặt font thủ công trên máy tham chiếu và xuất cài đặt registry font bằng trình hướng dẫn (Computer Configuration -> Preferences -> Windows Settings -> Registry -> New -> Registry Wizard) sẽ dễ dàng hơn;

- Sử dụng Registry Browser để đi đến khóa registry HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts trên máy tính từ xa. Tìm và chọn mục registry chứa tên font bạn muốn cài đặt;

- Tham số registry sẽ xuất hiện trong trình soạn thảo GPO.

Sau đó cập nhật cài đặt GPO trên máy khách và đảm bảo file font mới đã được cài đặt. Trong Windows 10, bạn có thể xem danh sách font đã cài đặt trong Settings -> Personalization -> Fonts.

Cài đặt Font Windows bằng Script PowerShell Logon
Phương pháp cài đặt font bằng GPO như mô tả ở trên đáng để sử dụng nếu bạn chỉ muốn cài đặt một số font. Nếu bạn muốn cài đặt nhiều file font cùng một lúc, tốt hơn là sử dụng script PowerShell, vì việc tạo các tùy chọn chính sách đặc biệt cho từng font có thể rất tẻ nhạt.
Script PowerShell sau sẽ cài đặt tất cả file font *.ttf và *.otf nằm trong thư mục chia sẻ được chỉ định. Ngoài ra, script ghi lại tất cả hành động vào file log bằng hàm WriteLog.
function WriteLog
{
Param ([string]$LogString)
$Stamp = (Get-Date).toString("yyyy/MM/dd HH:mm:ss")
$LogMessage = "$Stamp $LogString"
Add-content $LogFile -value $LogMessage
}
$Logfile = "C:\Windows\posh_font_install.log"
$SourceFolder = "\\woshub.com\SYSVOL\woshub.com\scripts\Fonts"
Add-Type -AssemblyName System.Drawing
$WindowsFonts = [System.Drawing.Text.PrivateFontCollection]::new()
Get-ChildItem -Path $SourceFolder -Include *.ttf, *.otf -Recurse -File |
Copy-Item -Destination "$env:SystemRoot\Fonts" -Force -Confirm:$false -PassThru |
ForEach-Object {
WriteLog "Installing font file $_.name"
$WindowsFonts.AddFontFile($_.fullname)
$RegistryValue = @{
Path = 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts'
Name = $WindowsFonts.Families[-1].Name
Value = $_.Fullname
}
$RemoveRegistry = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts"
Remove-ItemProperty -name $($WindowsFonts.Families[-1].Name) -path $RemoveRegistry
New-ItemProperty @RegistryValue
}

Lưu script PowerShell dưới dạng file PS1 và chạy nó như một logon script bằng GPO.
Như vậy, tất cả file font từ thư mục được chỉ định sẽ được cài đặt trong Windows, và ngày giờ cài đặt sẽ được ghi log.
