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