WinGet概述

以下资料来源于微软社区:https://learn.microsoft.com/zh-cn/windows/package-manager/

什么是WinGet?

Windows软件包管理器 (WinGet) 是一个工具,帮助用户在Windows系统上发现和安装软件包。项目包括命令行界面 (CLI)、PowerShell模块和组件对象模型 (COM) API。客户端可以访问来自Microsoft Store和WinGet社区库的包,同时支持自建软件源访问。

什么系统支持使用WinGet?

Windows 10(1809)以后的版本,会自动安装WinGet工具。在此之前的windows系统需要手动安装,在微软商店。

windows 10 (1709)以后都支持使用,但是有一个前提条件,必须更新微软商店,原因是windows11采取了新的微软商店并强制要求所有商店更新至该版本否则不能使用。由于是新系统下的商店,很多依赖项在win10上是没有的,需要手动去安装,具体参考文章windows 10下安装winget。

最低支持版本:

winget 命令行工具仅在 Windows 10 1709(版本 16299)或更高版本上受支持。 在你首次以用户身份登录 Windows(这会触发 Microsoft Store 将 Windows 程序包管理器注册为异步进程的一部分)之前,winget 工具不可用。 如果最近已经以用户身份进行了首次登录,但发现 winget 尚不可用,则可以打开 PowerShell 并输入以下命令来请求此 winget 注册:Add-AppxPackage -RegisterByFamilyName -MainPackage Microsoft.DesktopAppInstaller_8wekyb3d8bbwe

WinGet支持哪些安装程序?

  • EXE(具有 Silent 和 SilentWithProgress 标志)

  • ZIP

  • INNO

  • NULLSOFT

  • MSI

  • WIX

  • APPX

  • MSIX

  • BURN

  • PORTABLE

WinGet的下载

这里提供一个稳定版本1.8.1522

github地址:https://github.com/microsoft/winget-cli/releases

WinGet应用场景

通过以上方法,提升了网络整体安全性,避免了终端用户从不安全网站下载非法应用所带来的内网安全隐患。同时,通过使用批处理脚本实现批量安装应用程序,减少了重复工作,提高了工作效率。

WinGet软件源的搭建

准备工作,创建软件清单

这里用wingetcreate来实现软件清单创建

通过winget命令install wingetcreate(建议连接vpn,这里可能因为网络因素安装失败)

寻找需要的软件包,获取其下载链接。

通过wingetcreate new install url,来获取清单。

可以通过 wingetcreate.exe update --urls 来更新清单。

github地址:https://github.com/jantari/rewinged

搭建nginx服务器

由于winget要求软件源必须使用HTTPS,所以需要通过nginx的反向代理来实现访问。

安装过程不在这里赘述,贴一张nginx配置文件提供参考。

server {
    listen 443 ssl; 
    server_name winget.qunhequnhe.com; 
    ssl_certificate /etc/nginx/ssl/qunhequnhe.com.crt;
    ssl_certificate_key /etc/nginx/ssl/qunhequnhe.com.key; 
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; 
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass https://localhost:3000/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

server {
    listen 80;
    server_name winget.qunhequnhe.com; 
    return 301 https://$host$request_uri; 
}

搭建Rewinged

Rewinged 是一个自托管的 winget 包源工具,可以运行在 Linux、Windows、Docker 或云环境中。它通过读取目录中的包清单,并通过 REST API 使这些包可以被 winget 客户端搜索和访问。这使得用户可以创建和管理自己的私有 winget 包源,而无需依赖于云服务,winget 要求 REST 源使用 HTTPS - 不允许明文 HTTP。

github地址:https://github.com/jantari/rewinged

封装好的程序包地址:https://github.com/jantari/rewinged/releases

  1. 将wingetcreate创建的清单移至服务器,Rewinged 对应目录下(wingetcreate及winget仅可在Windows运行,若操作系统为其他则需要手动填写清单,或将wingetcreate创建的清单移到对应文件夹中)

  2. 通过参数configFile可以将所有参数写成一个json来执行

  3. 命令行执行,运行Rewinged并在后台运行,在rg目录下会有一个日志文件生成

nohup ./rewinged -configFile /rg/rewinged.json

以下是一个基础的配置文件

{
  "autoInternalize": true,
  "autoInternalizePath": "/rg/installers",
  "autoInternalizeSkip": "",
  "https": true,
  "httpsCertificateFile": "/rg/ssl/qunhequnhe.com.crt",
  "httpsPrivateKeyFile": "/rg/ssl/qunhequnhe.com.key",
  "listen": "localhost:3000",
  "logLevel": "info",
  "manifestPath": "/rg/manifests"
}

这里要讲一个参数的功能,-autoInternalize开启自动内化,启用后会将软件清单内的下载URL自动下载到本地指定文件夹,从而实现在不连接外网仅连接内网的情况下安装软件。第一次启用该功能会有一个下载软件的过程,在此过程中直接下载则会显示哈希认证不完整,必须等软件包被完整下载才可以正常使用。(从下载url到指定文件夹的这个过程可能会失败,每个软件都需要下载测试一下)

这里说一下如果安装包hash校验不通过或者下载不完整怎么处理。

首先下载一个完整的安装包,将exe后缀去除使其变为文件,随后打开cmd页面输入命令“winget hash 文件路径”生成文件的哈希值。

随后找到rewinged目录下,修改对应软件目录下的installer文件

替换yaml文件内的哈希值为你下载的软件包哈希

随后到installers目录下,删除原先的软件包,将新下载的软件名称修改为哈希值(通过哈希值为索引),重启rewinged工具,完成替换。

扩展参数

这些命令行配置是用于配置和运行 rewinged 应用程序的参数。下面是每个参数的详细解释:

-autoInternalize
   - 作用:开启自动内部化功能。
   - 说明:启用此功能后,应用程序会自动将一些内容进行内部处理。

-autoInternalizePath string
   - 作用:指定自动内部化安装程序存储的目录。
   - 默认值:`"./installers"`
   - 说明:自动内部化的安装程序将被存储在这个指定的目录中。

-autoInternalizeSkip string
   - 作用:指定排除在自动内部化之外的主机名列表。
   - 说明:可以用逗号或空格分隔多个主机名,这些主机将不进行自动内部化处理。

-configFile string
   - 作用:指定一个 JSON 配置文件的路径。
   - 说明:这个文件是可选的,可以用来提供额外的配置选项。

-https
   - 作用:直接从 `rewinged` 应用程序提供加密的 HTTPS 流量,而无需代理。
   - 说明:启用此选项后,应用程序将使用 HTTPS 协议。

-httpsCertificateFile string
   - 作用:指定 HTTPS 启用时使用的 Web 服务器证书文件。
   - 默认值:`"./cert.pem"`
   - 说明:这是应用程序在启用 HTTPS 时使用的证书文件路径。

-httpsPrivateKeyFile string
   - 作用:指定 HTTPS 启用时使用的私钥文件。
   - 默认值:`"./private.key"`
   - **说明**:这是应用程序在启用 HTTPS 时使用的私钥文件路径。

-listen string
   - 作用:指定 REST API 监听的地址和端口。
   - 默认值:`"localhost:8080"`
   - 说明:应用程序的 REST API 将在这个地址和端口上进行监听。

-logLevel string
   - 作用:设置日志的详细程度。
   - 默认值:`"info"`
   - 可选值:`disable`, `error`, `warn`, `info`, `debug`, `trace`
   - 说明:用于控制应用程序的日志输出详细程度。

-manifestPath string
    - 作用:指定搜索包清单文件的目录。
    - 默认值:`"./packages"`
    - 说明:应用程序将在这个目录中搜索包清单文件。

-version
    - 作用:打印版本信息并退出。
    - 说明:运行时不会启动应用程序,而是打印当前版本信息。

WinGet工具的使用

常用参数:

  • winget show 软件名  #查询软件库中软件信息,该命令支持中文检索

  • winget install --id=xxx  #安装软件,通过查询软件名可知id号,通过id号来安装,避免因为软件名称混淆导致的安装失败(在WinGet自带的软件库中,就存在QQ、腾讯QQ,以及不同来源的QQ,直接使用软件名安装可能会导致安装失败)

  • winget uninstall --id=xxx  #卸载软件,使用id号原因同上

  • winget upgrade --id=xxx  #更新软件,从软件库中获取更新

  • winget list  #查询安装的应用程序

已管理员的身份启动命令行,执行“ winget source add -n qunhe -a https://winget.qunhequnhe.com/api -t "Microsoft.Rest",随后“winget install 软件名 -s qunhe”即可。

这里我写一个bat脚本,能够自动执行添加软件源及安装小酷助手、企业微信、WPS及腾讯会议。有特殊需求直接修改这个脚本即可。

@echo off
echo Installing standard software...
winget source add -n qunhe -a https://winget.qunhequnhe.com/api -t "Microsoft.Rest"
winget install qunhe.xiaoku qunhe.qiyeweixin KingsoftCorp.Ltd.WPSOffice Tencent.WeMeet -s qunhe
echo Installation complete.

功能测试:

需要注意以下几点,

  1. win系统必须带有winget

  2. 必须能解析你自己的域名如果不可以可能是你的dns服务器设置的有问题

拓展参数:

  • install    安装给定的程序包

  • show       显示包的相关信息

  • source     管理程序包的来源

  • search     查找并显示程序包的基本信息

  • list       显示已安装的程序包

  • upgrade    显示并执行可用升级

  • uninstall  卸载给定的程序包

  • hash       哈希安装程序的帮助程序

  • validate   验证清单文件

  • settings   打开设置或设置管理员设置

  • features   显示实验性功能的状态

  • export     导出已安装程序包的列表

  • import     安装文件中的所有程序包

  • pin        管理包钉

  • configure  将系统配置为所需状态

  • download   从给定的程序包下载安装程序

  • repair     修复所选包