Назад | Перейти на главную страницу

Отправка шрифтов через GPO

часто задаваемый вопрос, но стандартное решение, похоже, у меня не работает.

У меня Windows Server 2012-R2 AD в основном с клиентами Windows 7. У меня есть объект групповой политики, который выполняет следующие функции:

Конфигурация компьютера \ Предпочтения \ Параметры 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, изменения реестра развертываются, но шрифты никогда не попадают в папку шрифтов. Это не проблема доступа, потому что, когда я меняю место назначения на рабочий стол, появляются все шрифты. Я также могу установить их вручную оттуда.

Я попытался:

Они просто никогда не копируются в папку шрифтов. Есть ли способ сделать это без создания MSI?

Есть несколько способов справиться с этим. Лично я считаю, что команда / действие «Установить» для файла шрифта является наиболее надежным. Это можно легко сделать в Powershell или VBS с помощью запланированной задачи SYSTEM.

Я использую вариант этого, чтобы делать все шрифты в папке.

$path = "\\font-server\Fonts"
$shell = New-Object -ComObject Shell.Application
$shell.Namespace($path).Items().InvokeVerbEx("Install")

@ У Тим-Бригама была правильная идея, но она немного сложнее.

Во-первых, создайте общий сетевой ресурс, на компьютерах которого есть читать доступ к. Поскольку вы будете вызывать сценарий с системными привилегиями из этого общего ресурса, важно, чтобы они могли только читать.

На этом сетевом ресурсе также создайте папку со всеми установленными шрифтами.

Затем создайте этот скрипт в сетевой папке:

$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")
    }
}

Затем создайте запланированную задачу для каждого объекта групповой политики:

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, сопоставление пользователей не будет работать.

Пользователям потребуется дважды выйти из системы / войти в систему. Один раз установить шрифты, но кеш шрифтов не обновляется до входа в систему.