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

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

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

Конфигурация компьютера \ Preferences \ Windows Settings \ Files:

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

Я пробовал:

  • Изменение действия на СОЗДАТЬ или ЗАМЕНИТЬ
  • Использование полного пути для пункта назначения вместо% WindowsDir%
  • Использование полного пути для источника (без подстановочных знаков)
  • Перезапуск целевого компьютера

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

1
задан 3 November 2016 в 18:58
2 ответа

@ Тим-Бригам имел правильную идею, но она немного сложнее.

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

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

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

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

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

1
ответ дан 3 December 2019 в 18:32

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

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

$path = "\\font-server\Fonts"
$shell = New-Object -ComObject Shell.Application
$shell.Namespace($path).Items().InvokeVerbEx("Install")
2
ответ дан 3 December 2019 в 18:32

Теги

Похожие вопросы