我正在尝试在企业应用程序的机器上安装条形码字体。GPO 由 Windows Server 2019 Standard 版本 1809 OS 内部版本 17763.4252 服务器提供。有问题的 GPO 使用计算机首选项 -> 计划任务立即运行脚本。如下所示。
#$fonts = (New-Object -ComObject Shell.Application).Namespace(0x14)
$Path = Test-Path \\DC\netlogon\font\
if($Path -eq $true)
{
Write-EventLog -Source Application -LogName Application -EventId 301 -EntryType Information -Message "The Network Path is True"
$fontFolder = "\\DC\NETLOGON\Font\ "
$fontItem = Get-Item -Path $fontFolder
$fontList = Get-ChildItem -Path "$fontItem\*" -Include ('*.fon','*.otf','*.ttc','*.ttf')
$RegPath =(Test-Path 'HKCU:\Software\Microsoft\Windows NT\CurrentVersion\Fonts')
$objFont = New-Object System.Drawing.Text.PrivateFontCollection
}
foreach ($font in $fontList)
{
$objFont.AddFontFile($font.FullName)
$objTitle = $objFont.Families[-1].Name
$fontName = $font.Name
$objExtension = switch ($font.Extension)
{
.TTF {"(True Type Font)"}
.OTF {"(Open Type Font)"}
Default {
Write-EventLog -Source Application -LogName Application -EventId 305 -EntryType Information -Message "Font Extension not Found"
}
}
$FontTitle = $objTitle + " " + $objExtension
if (-not(Test-Path -Path "C:\Windows\fonts\$fontName" )) {
Write-EventLog -Source Application -LogName Application -EventId 302 -EntryType Information -Message "Font not Found, Installing font."
echo $fontName
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts" /v $FontTitle /t REG_SZ /d DWBAR39.TTF /f
cp $font C:\Windows\Fonts
if (Test-Path -Path "C:\windows\fonts\$fontName")
{
Write-EventLog -Source Application -LogName Application -EventId 306 -EntryType Information -Message "Font Installed."
}
}
elseif (Test-Path -Path "C:\Windows\fonts\$fontName"){
Write-EventLog -Source Application -LogName Application -EventId 303 -EntryType Information -Message "Font Already Installed in C:\windows\fonts\"
}
}
该脚本在本地运行良好。我可以运行它,它运行正常。每当我刷新组策略时,我都会收到事件 1202,SceCLI
0x5:访问被拒绝。此问题的高级帮助可在 https://support.microsoft.com. 查询“故障排除 1202 事件”。
目前它正在 GPO 中运行。
名称 C - 字体安装程序
作者 'Me'
描述 安装字体。仅在用户登录 S4U 时运行
UserId NT AUTHORITY\System
以最高权限运行 HighestAvailable Hidden 是
配置为 1.2
已启用 是程序/脚本 C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
参数 -ExecutionPolicy Bypass -Command '& \DC\netlogon\add-Font.ps1' 从 C:\Windows\System32\WindowsPowerShell 启动如果计算机不再处于空闲状态则停止 是
如果恢复空闲状态则重新启动 否
仅当计算机使用交流电源时才启动任务 是 如果计算机
切换到电池电源则停止 否
允许按需运行任务 是 在
错过计划的启动后尽快运行任务 是 如果任务运行时间超过 3 天则停止任务并强制其停止 是 如果正在运行的任务未在请求时结束,如果未安排任务再次运行,则在之后将其删除 立即 如果任务已在运行,则适用以下规则 StopExisting
从权限角度来看。我发现使用 PSEXEC64.exe -sid powershell。运行目录 $font | %{$fonts.CopyHere($_.FullName)} 没有任何输出。
本网站https://eddiejackson.net/wp/?p=16137帮助解释为什么会这样。似乎 0x14 shell 变量被重载并重定向到用户配置文件。我在本地运行脚本时就看到过这种情况。
*在脚本中添加内容后,我仍然收到 SceCLI 错误,似乎脚本甚至没有运行,因为我没有收到我添加的任何事件日志。如何/为什么?我使用 SYSTEM 帐户执行这些操作。
我禁用了域范围的 Windows 防火墙,现在我不再收到 SceCLI 错误。仍然没有任何效果。
任何帮助都将非常有帮助。
谢谢。
答案1
事实证明这是脚本的问题。Powershell ISE 可以正确解释所有内容,但当作为 GPO 处理时则不行。该行
$fontFolder = "\\DC\NETLOGON\Font\"
断开引号,因为 \ 充当了忽略字符。在我删除反斜杠后,它开始正常工作。@GregAskew 你可以说我告诉过你。
谢谢,WC。