Windows-Server-2012-R2
通過 GPO 推送字型
一個經常被問到的問題,但標準解決方案似乎對我不起作用。
我有一個 Windows Server 2012-R2 AD,主要是 Windows 7 客戶端。我有一個執行以下操作的 GPO:
電腦配置\首選項\Windows 設置\文件:
Action: Update Source: <Network drive domain computers have read access to>\fonts\* Destination: %WindowsDir%\Fonts
然後我還分別為每種字型更新系統資料庫:
Action: Update Hive: HKLM Value name: <fontname> <(TrueType)|(OpenType)> Value type: REG_SZ Value data: <font file name>
當我這樣做
gpupdate
時,會部署系統資料庫更改,但字型永遠不會到達字型檔夾。這不是訪問問題,因為當我將目標更改為我的桌面時,所有字型都會出現。我也可以從那里手動安裝它們。我試過:
- 將操作更改為 CREATE 或 REPLACE
- 使用目標的完整路徑而不是 %WindowsDir%
- 使用源的完整路徑(所以沒有萬用字元)
- 重新啟動目標機器
他們只是永遠不會被複製到字型檔夾中。有沒有辦法在不創建 MSI 的情況下做到這一點?
@Tim-Brigham 有正確的想法,但它稍微複雜一些。
首先,創建一個網路共享域電腦具有讀取權限。由於您將從該共享中呼叫具有系統權限的腳本,因此重要的是它們只能讀取。
在此網路共享上,還創建一個文件夾,其中包含您喜歡安裝的所有字型。
然後在網路文件夾上創建這個腳本:
$path = "<path to font folder on network share>" $shell = New-Object -ComObject Shell.Application $fonts = $shell.Namespace($path).Items() # check if font already exists in windows font folder, if not, install foreach($font in $fonts) { $sourcepath = $font.path $filename = Split-Path -Leaf $sourcepath $destinationpath = 'C:\Windows\fonts\' + $filename if (![System.IO.File]::Exists($destinationpath)) { $font.InvokeVerbEx("Install") } }
接下來,為每個 GPO 創建一個計劃任務:
Computer Configuration -> Preferences -> Control Panel Settings -> Scheduled Task Action: Update Use the following User Account: S-1-5-18 Run with highest privileges Triggers: At logon Actions: Start a program: powershell.exe -NonInteractive -WindowStyle Hidden -ExecutionPolicy bypass -File <scriptpath>
此處使用使用者帳戶 S-1-5-18 很重要,這是 NT-Authority/SYSTEM,但如果您使用文字 NT-Authority/SYSTEM,則使用者映射將不起作用。
使用者將需要註銷/登錄兩次。一次安裝字型,但字型記憶體在登錄之前不會刷新。
有很多方法可以處理這個問題。我個人發現字型檔的“安裝”動詞/動作是最可靠的。這可以通過 SYSTEM 計劃任務在 Powershell 或 VBS 中輕鬆完成。
我對此使用了一種變體來處理文件夾中的所有字型。
$path = "\\font-server\Fonts" $shell = New-Object -ComObject Shell.Application $shell.Namespace($path).Items().InvokeVerbEx("Install")