Windows-Server-2012-R2

通過 GPO 推送字型

  • August 24, 2017

一個經常被問到的問題,但標準解決方案似乎對我不起作用。

我有一個 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")

引用自:https://serverfault.com/questions/813027