# os-active **Repository Path**: eternalnight996/os-active ## Basic Information - **Project Name**: os-active - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-18 - **Last Updated**: 2026-08-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # OS Active 系统激活状态检测

GUI Platform Log

🌟 Gitee | 🐙 GitHub | 📦 下载

**一句话**: 跨平台 GUI 工具,一键检测 **银河麒麟 / 统信 UOS / Ubuntu 18.04+ / Windows 10/11** 的系统激活状态,读取设备 **SN**,e-log 把明细写入**程序目录 `logs/{操作系统}-{名称}-{product_serial}.log`**(如 `uos-os-active-8CG2100C5Z.log`),退出输出 ETest 标准 `R<{json}>R`。 ## 功能 - ✅ **激活状态检测**: 启动即自动检测,大字英雄区显示 已激活 / 未激活 / 无需激活 / 无法判定 - ✅ **授权到期时间**: GUI 系统信息区显示授权到期(麒麟 `.kyinfo` term / 统信 `到期时间` / Windows 批量激活过期) - ✅ **SN 读取**: 多方案自动探测(见下文),工具路径可在配置表自配 - ✅ **GUI 明细**: 系统信息(系统/版本/架构/SN/发行版) + 检测明细表格(检测项/命令/判定/原始输出) - ✅ **e-log 日志**: 明细写入 `logs/{操作系统}-{名称}-{product_serial}.log`(如 `uos-os-active-8CG2100C5Z.log`,程序目录,避免写 U 盘) - ✅ **确认流程**: 已激活点「确认激活状态」→ 倒计时自动关闭;未激活时 auto_close 开→自动关窗,关→显示「重新检测」 - ✅ **ETest R 标准输出**: 退出时输出 `R<{json}>R`,仅「激活校验通过 + 已确认」才 `status:true` - ✅ **配置表自动生成**: 首次运行无 `os-active.toml` 自动生成默认配置(含注释) - ✅ **tools 工具 + start.sh**: 按 `tools/<工具名>/<架构>//<工具>` 放置,`start.sh` 一键提权启动+EGL 回退 - ✅ **文件夹部署包**: `just pack` 产出与产测工具一致的部署目录 ## 界面预览 | 系统 | PASS(全部校验通过) | FAIL(存在未通过项) | |---|---|---| | Windows 10 | ![Windows PASS](assets/screen/windows-pass.png) | — | | 银河麒麟 V10 | ![麒麟 PASS](assets/screen/银河麒麟V10-pass.jpg) | ![麒麟 FAIL](assets/screen/银河麒麟V10-fail.jpg) | | 统信 UOS V20 | ![UOS PASS](assets/screen/统信v20-pass.jpg) | ![UOS FAIL](assets/screen/统信v20-fail.jpg) | > 主界面:大字 `PASS`/`FAIL` = 全部启用校验(产品序列号/主板序列号/激活状态)通过与否;「校验流程」逐项列出 通过/跳过/失败;「系统信息」含 产品序列号/主板序列号/激活状态/授权到期(检测明细表仅 debug 构建);确认后倒计时自动关闭,退出输出 ETest `R<...>R` 结果。 ## 激活检测原理 | 系统 | 检测方式 | 判定依据 | |---|---|---| | Windows 10/11 | `slmgr.vbs -xpr` + `-dlv` | 永久激活/已激活/将在…到期 → 已激活;通知模式/未授权 → 未激活 | | 银河麒麟 | `kylin_activation_check`(官方) | 含已激活 → 已激活;含未激活/试用/已过期 → 未激活 | | 统信 UOS V20 | `uos-activator-cmd -q`(官方) | 激活状态=免费授权/已激活 → 已激活;试用期/未激活 → 未激活 | | Ubuntu 18.04+ | 无激活机制 | 无需激活 | > 麒麟激活:仅用 `kylin_activation_check`(非空才判定;已移除 licence -l / nklicadm -s / 文件式 .kyinfo/.kyactivation/kylin-verify);到期时间取自其「试用到期时间」。 > **系统激活(生产激活)**:UOS/麒麟界面提供「系统激活」面板(仅未激活时显示)——UOS 选激活码/KMS/试用;麒麟选激活码/一键激活(-b),若配置 `[activate].qrcode=true` 再加「扫码激活(-q)」。输入激活码后点「执行激活」调用 `uos-activator-cmd`/`kylin_activate` 执行,执行后自动重新检测并更新激活状态。 ## SN 读取 多方案自动探测,工具路径可在 `os-active.toml` 的 `[sn].tool_path` 自配: | # | 方案 | 来源 | 需 root | |---|---|---|---| **product_serial(主 SN)链 — 查询默认全开,查到即跳过后续:** | # | 方案 | 来源 | 需 root | |---|---|---|---| | 1 | ByoDmi 工具 `-smbiosinfo` | DMI SMBIOS Type1 Serial(对齐产测烧录位置) | 是 | | 2 | `dmidecode -s system-serial-number` | DMI 标准命令 | 是 | | 3 | `/sys/class/dmi/id/product_serial` | DMI sysfs | 否 | **board_serial 链 — 查询默认全开,查到即跳过后续:** | # | 方案 | 来源 | 需 root | |---|---|---|---| | 1 | `dmidecode -s baseboard-serial-number` | DMI 标准命令 | 是 | | 2 | `/sys/class/dmi/id/board_serial` | DMI 主板序列号 | 否 | **Windows:** `Win32_BIOS.SerialNumber` > 查询按优先级、查到即跳过后续;过滤占位符(`To be filled`/`None`);是否校验由 `os-active.toml` 的 `[sn].require_product_serial`(product_serial)与 `[sn].require_board_serial`(board_serial)控制。 ## 使用 ### Linux(麒麟/统信/Ubuntu) ```bash ./scripts/start.sh # 一键:root 提权(读 SN)+ 图形环境保留 + EGL 三级回退 + 启动 # 或手动(需 root 读 SN,EGL 回退): E_AUTOTEST_GL=egl ./os-active ``` ### Windows ```bash os-active.exe ``` ## 配置表 os-active.toml 首次运行自动生成(含注释),可修改后重启生效: ```toml [app] close_after_secs = 3 # PASS 后倒计时 N 秒自动关闭窗口(默认 3) auto_close = false # true:全部校验通过自动确认并倒计时关闭 [sn] # SN 工具(ByoDmi)路径,可自配;留空自动探测 tools/ByoDmi/<架构>//ByoDmi tool_path = "" # SN 工具路径,留空自动探测 require_product_serial = true # 是否校验 product_serial 非空(计入 PASS) require_board_serial = true # 是否校验 board_serial 非空(计入 PASS) [activate] qrcode = true # 是否开启「扫码激活」 check_activation = true # 是否把「系统激活状态」计入 PASS(默认 true) ``` ## ETest R 输出 退出时(on_exit)输出一行 `R<{json}>R`(ETest 插件标准,主程序正则提取判定): ```json R<{"content":"PASS;银河麒麟已激活;auto确认","status":true,"opts":{"activation":"已激活","sn":"MT81...","board_serial":"...","all_pass":true,"checks":[{"name":"产品序列号(product_serial)校验","enabled":true,"passed":true,"detail":"MT81..."},...],"expire_at":"2027-05-29",...}}>R ``` - `status:true` 需**同时满足**: 1) 全部启用校验通过(product_serial/board_serial/激活状态,按 toml 启用) 2) 已确认(按钮 或 auto_close=true) - `content`: `PASS;...`(通过) / `NG;...`(未通过,含原因) - `opts`: 系统信息 + product_serial/board_serial + 校验流 `checks` + 授权到期 + 激活判定 + 确认方式 + 检测明细(`details`,**仅 debug 构建**) > 主界面大字 `PASS`/`FAIL` 由校验流决定:全部启用校验通过→`PASS`;任一失败→`FAIL`;下方「校验流程」逐项列出 通过/跳过/失败 与详情,系统激活状态在「系统信息」栏单独显示。 ## 日志 - **程序目录 `logs/{操作系统}-{名称}-{product_serial}.log`**(如 `uos-os-active-8CG2100C5Z.log`;当前软件路径,避免写 U 盘;不可写则 fallback 家目录): 检测明细(每条命令 + 原始输出 + 判定,**仅 debug 构建**;release 仅结果级日志) - `logs/bug.os-active.log`: panic 崩溃现场 - GUI 底部展示日志文件路径与最新日志,一键打开日志目录 > **release(生产)剔除检测明细**:GUI「检测明细」表、逐条命令日志、R 输出 `details` 均仅 debug 构建携带(`#[cfg(debug_assertions)]`);生产版只显示 校验流/系统信息/激活状态,输出 R 结果。debug 构建用 `just run`(`cargo build`),release 用 `just build-win`/`build-linux`(`cargo build --release`)。 ## 构建与打包 依赖 **Rust**(≥1.85)与 **just**: ```bash cargo install just just setup # 一键装齐工具链 just doctor # 环境自检 just run # 本机运行 just dist # Windows 包 → dist/os-active-v<版本>.zip just deb-native # Linux deb(Linux 原生构建,推荐) just pack # 文件夹部署包 → dist/os-active-pack-v<版本>/(主程序+tools+README+start.sh+config) ``` Linux 二进制以 glibc 2.27 为基线,一次构建可在 Ubuntu 18.04+ / Kylin / UOS 全系运行;`start.sh`/deb 启动器内置 GLX→EGL→软件渲染三级显示回退。 ## 发布(Release) 双源发布:**GitHub**(境外)+ **Gitee**(国内),同一批安装包两边都出 tag/release(参考 dsh-desktop 联动)。 **① 一键自动(推荐,CI)** `.github/workflows/release.yml` 在推送 `v*` tag 时自动: 1. 构建 Windows zip + Linux deb(CI runner 原生编译;老系统 Ubuntu18+/Kylin/UOS 用本地 `just deb-native` 或 Windows 交叉 `just deb` 打 glibc 2.27 包) 2. `release`:GitHub Release 建 tag + 上传 zip/deb(用自动 `github.token`,无需额外 secret) 3. `gitee`:同步分支/tag 到 Gitee + `scripts/publish-gitee.mjs` 上传到 Gitee 发行版(用 secret `OS_ACTIVE_TOKEN`) ```bash just dist && git tag v0.2.0 && git push origin v0.2.0 github v0.2.0 # 推 tag 触发 CI # 或 GitHub Actions 页手动 Run workflow,填 tag(如 v0.2.0)补发 ``` **前置 secret**(GitHub 仓库 → Settings → Secrets and variables → Actions → New repository secret): - `OS_ACTIVE_TOKEN` = **Gitee 私人令牌**(gitee.com → 设置 → 安全设置 → 私人令牌,勾选 `projects/releases`)。 - 网页建 secret 只填「名称 + 值」即可,**无需公钥**;若走 REST API 才需仓库加密公钥:`gh api repos/EternalNight996/os-active/actions/secrets/public-key --jq '{key,key_id}'`(先 `gh auth login`)。 **② 手动 CLI(本地/补发)** ```bash # GitHub(需 gh 已登录,scope 含 repo) gh release create v0.2.0 "dist/os-active-v0.2.0.zip" "dist/os-active_0.2.0-1_amd64.deb" --repo EternalNight996/os-active --title v0.2.0 --notes "os-active v0.2.0 跨平台发布" # Gitee(需 GITEE_TOKEN) GITEE_TOKEN=<令牌> node scripts/publish-gitee.mjs --tag v0.2.0 --artifacts-dir dist --repo eternalnight996/os-active ``` > GitHub 附件上传 zip + deb;Gitee 发行版同样上传 `*.zip` + `*.deb`。 ## tools 工具目录 `tools/` 存放产测/硬件工具,按 **工具名 → 架构 → 操作系统 → 具体工具** 分层。**具体工具不上传 git**(体积大/产线定制),用户自行放置,程序自动探测: ``` tools/ <工具名>/ <架构>/ # x86_64 / aarch64 ... <操作系统>/ # linux / windows ... 具体工具 ``` 当前预留:ByoDmi(DMI/SN 烧录与读取)。详见 `tools/README.md`。 ## 发布与双源管理(GitHub + Gitee) 推 tag 自动完成:**Windows zip + Linux deb 跨平台构建** → 发布 **GitHub Release** → 同步分支/tag 到 Gitee → 上传 **Gitee 发行版**(`.github/workflows/release.yml`)。首次需在 GitHub Actions secrets 配 `GITEE_TOKEN`。 ```bash git tag v0.2.0 && git push origin master github v0.2.0 # 双源推 tag 触发 CI ``` ## 目录结构 ``` src/ # 源码(main/app/config/data/detect) tools/ # 工具(不上传 git,用户自添;按 工具名/架构/os/工具 分层) assets/ # 界面截图 docs/ # 文档(含 TP100 分析) vendor/ # EGL patch 的 eframe 0.36.1 justfile # 构建/打包统一入口 .github/ # CI 发布工作流 scripts/ # 启动脚本(start.sh + start.bat)与发布脚本 ``` ## 第三方修正 - **eframe 0.36.1(vendor)**—— 国产 OS EGL 回退 patch(`E_AUTOTEST_GL=egl` → `PreferEgl`,绕开 UOS/Kylin 损坏的 GLX;Linux 默认 EGL)