Windows Server 2022中WinGet运行失败及批量执行方案咨询
定期执行winget升级命令的可行方案
1. 修正GPO计划任务适配Server 2022
Server 2022对winget的系统账户运行限制更严,调整以下配置即可解决:
- 在GPO计划任务的环境变量中,给
PATH添加winget的安装路径通配:C:\Program Files\WindowsApps\Microsoft.DesktopAppInstaller_*_x64__8wekyb3d8bbwe - 勾选「以最高权限运行」,并在设置里开启「不管用户是否登录都要运行」
- 改用完整路径调用winget,避免系统账户找不到可执行文件:
for /f "delims=" %%i in ('dir /b "C:\Program Files\WindowsApps\Microsoft.DesktopAppInstaller_*_x64__8wekyb3d8bbwe"') do set WINGET_PATH="C:\Program Files\WindowsApps\%%i\winget.exe" %WINGET_PATH% install --id Microsoft.DesktopAppInstaller --force --silent %WINGET_PATH% upgrade --all --accept-package-agreements --accept-source-agreements --silent --force - 给系统账户授予
C:\Program Files\WindowsApps目录的读取和执行权限
2. 域控制器远程PowerShell执行
直接从域控批量远程执行命令,无需在目标服务器建任务:
- 先通过GPO开启所有域成员服务器的WinRM:计算机配置>管理模板>Windows组件>Windows远程管理(WinRM)>WinRM服务>允许自动配置WinRM
- 在域控上创建PowerShell脚本
WingetUpgrade.ps1:# 获取所有目标服务器 $servers = Get-ADComputer -Filter {OperatingSystem -like "*Windows Server 2019*" -or OperatingSystem -like "*Windows Server 2022*"} | Select-Object -ExpandProperty Name foreach ($server in $servers) { Invoke-Command -ComputerName $server -ScriptBlock { # 定位winget路径 $wingetDir = Get-ChildItem "C:\Program Files\WindowsApps\Microsoft.DesktopAppInstaller_*_x64__8wekyb3d8bbwe" | Select-Object -Last 1 -ExpandProperty FullName $wingetExe = Join-Path $wingetDir "winget.exe" # 更新winget自身 & $wingetExe install --id Microsoft.DesktopAppInstaller --force --silent # 执行全量升级 & $wingetExe upgrade --all --accept-package-agreements --accept-source-agreements --silent --force } -Credential (Get-Credential "DOMAIN\你的域管理员账户") } - 在域控上创建计划任务,用域管理员账户定期运行这个脚本
3. 修复GPO计算机启动脚本
之前启动脚本失败大概率是路径或权限问题,调整后即可使用:
- 写一个批处理脚本
WingetUpgrade.bat,放到域控的NETLOGON共享(比如\\你的域名\NETLOGON\):@echo off :: 自动定位最新的winget路径 for /f "delims=" %%i in ('dir /b "C:\Program Files\WindowsApps\Microsoft.DesktopAppInstaller_*_x64__8wekyb3d8bbwe"') do set WINGET_DIR=%%i set WINGET_PATH="C:\Program Files\WindowsApps\%WINGET_DIR%\winget.exe" :: 更新winget自身 %WINGET_PATH% install --id Microsoft.DesktopAppInstaller --force --silent :: 执行全量升级 %WINGET_PATH% upgrade --all --accept-package-agreements --accept-source-agreements --silent --force - 在GPO的「计算机配置>脚本>启动」里添加这个脚本路径
- 给系统账户授予
C:\Program Files\WindowsApps的读取执行权限,确保能访问winget目录
4. 结合LAPS部署计划任务
如果GPO无法传递普通账户凭据,用LAPS获取本地管理员密码来创建任务:
- 先在域内部署LAPS,让每台服务器自动管理本地管理员密码
- 在域控上写PowerShell脚本批量创建计划任务:
$servers = Get-ADComputer -Filter {OperatingSystem -like "*Windows Server 2019*" -or OperatingSystem -like "*Windows Server 2022*"} foreach ($server in $servers) { # 获取LAPS管理的本地管理员密码 $lapsInfo = Get-AdmPwdPassword -ComputerName $server.Name $localAdminCred = New-Object System.Management.Automation.PSCredential("$($server.Name)\Administrator", ($lapsInfo.Password | ConvertTo-SecureString -AsPlainText -Force)) # 创建任务动作和触发器 $taskAction = New-ScheduledTaskAction -Execute "cmd.exe" -Argument '/c "for /f ""delims="" %%i in ('"'dir /b C:\Program Files\WindowsApps\Microsoft.DesktopAppInstaller_*_x64__8wekyb3d8bbwe'"') do ""C:\Program Files\WindowsApps\%%i\winget.exe"" upgrade --all --accept-package-agreements --accept-source-agreements --silent --force"' $taskTrigger = New-ScheduledTaskTrigger -Daily -At 2:00AM $taskSettings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries $taskPrincipal = New-ScheduledTaskPrincipal -UserId "$($server.Name)\Administrator" -RunLevel Highest # 远程注册计划任务 Register-ScheduledTask -TaskName "WingetAutoUpgrade" -Action $taskAction -Trigger $taskTrigger -Settings $taskSettings -Principal $taskPrincipal -Credential $localAdminCred -ComputerName $server.Name -Force } - 定期运行这个脚本,确保任务保持有效
内容的提问来源于stack exchange,提问作者user3912750
相关产品推荐
相关产品推荐

