diff --git a/LKY_OfficeTools/Lib/Lib_AppInfo.cs b/LKY_OfficeTools/Lib/Lib_AppInfo.cs index 03b347c..9e216d2 100644 --- a/LKY_OfficeTools/Lib/Lib_AppInfo.cs +++ b/LKY_OfficeTools/Lib/Lib_AppInfo.cs @@ -51,7 +51,7 @@ internal class AppAttribute /// /// APP 版本号 /// - internal const string AppVersion = "1.2.1.526"; + internal const string AppVersion = "1.2.1.621"; /// /// 开发者拼音全拼 diff --git a/LKY_OfficeTools/Lib/Lib_AppLog.cs b/LKY_OfficeTools/Lib/Lib_AppLog.cs index e80e7f1..dd2380c 100644 --- a/LKY_OfficeTools/Lib/Lib_AppLog.cs +++ b/LKY_OfficeTools/Lib/Lib_AppLog.cs @@ -9,7 +9,7 @@ using System; using System.IO; using static LKY_OfficeTools.Lib.Lib_AppInfo.AppPath; -using static LKY_OfficeTools.Lib.Lib_OfficeInfo.OfficeLocalInstall; +using static LKY_OfficeTools.Lib.Lib_OfficeInfo.OfficeLocalInfo; namespace LKY_OfficeTools.Lib { @@ -78,6 +78,9 @@ internal Log(string str, ConsoleColor str_color, Output_Type output_type = Outpu { Console.ForegroundColor = str_color; Console.WriteLine(str); + + //输出后恢复颜色 + Console.ForegroundColor = ConsoleColor.Gray; } //需要输出日志文件时,进行判断 diff --git a/LKY_OfficeTools/Lib/Lib_AppReport.cs b/LKY_OfficeTools/Lib/Lib_AppReport.cs index c538ad2..f0971b7 100644 --- a/LKY_OfficeTools/Lib/Lib_AppReport.cs +++ b/LKY_OfficeTools/Lib/Lib_AppReport.cs @@ -33,14 +33,14 @@ internal class Lib_AppReport /// internal static bool Pointing(ProcessStage point_type, bool show_info = false) { - try + //Passive不打点 + if (Current_RunMode == RunMode.Passive) { - //Passive不打点 - if (Current_RunMode == RunMode.Passive) - { - return true; - } + return true; + } + try + { if (show_info && point_type != ProcessStage.Starting) { new Log($"\n------> 正在清理 冗余数据,请勿关闭或重启电脑 ...", ConsoleColor.DarkCyan); diff --git a/LKY_OfficeTools/Lib/Lib_AppUpdate.cs b/LKY_OfficeTools/Lib/Lib_AppUpdate.cs index e25d7c0..a9a582d 100644 --- a/LKY_OfficeTools/Lib/Lib_AppUpdate.cs +++ b/LKY_OfficeTools/Lib/Lib_AppUpdate.cs @@ -213,7 +213,7 @@ internal static bool Check() //升级成功打点 Current_StageType = ProcessStage.Update_Success; - Pointing(Current_StageType); + Pointing(ProcessStage.Update_Success); //延迟稍许 Thread.Sleep(2000); @@ -263,7 +263,7 @@ static void ManualUpdate() //自动升级失败 Current_StageType = ProcessStage.Update_Fail; //设置为失败 - Pointing(Current_StageType, true); //回收 + Pointing(ProcessStage.Update_Fail, true); //回收 KeyMsg.Quit(-20); } diff --git a/LKY_OfficeTools/Lib/Lib_Aria2c.cs b/LKY_OfficeTools/Lib/Lib_Aria2c.cs index a47be67..56f3c74 100644 --- a/LKY_OfficeTools/Lib/Lib_Aria2c.cs +++ b/LKY_OfficeTools/Lib/Lib_Aria2c.cs @@ -42,7 +42,8 @@ internal static int DownFile(string uri, string save_to) string filename = new FileInfo(save_to).Name; //保存的文件名 //设置命令行 - string aria2c_params = $"{uri} --dir=\"{file_path}\" --out=\"{filename}\" --continue=true --max-connection-per-server=5 --check-integrity=true --file-allocation=none"; + string aria2c_params = $"{uri} --dir=\"{file_path}\" --out=\"{filename}\"" + + $" --continue=true --max-connection-per-server=5 --check-integrity=true --file-allocation=none --console-log-level=error"; //new Log(aria2c_params); var down_result = Com_ExeOS.Run.Exe(aria2c_path, aria2c_params); diff --git a/LKY_OfficeTools/Lib/Lib_OfficeActivate.cs b/LKY_OfficeTools/Lib/Lib_OfficeActivate.cs index 35fe4e2..447018b 100644 --- a/LKY_OfficeTools/Lib/Lib_OfficeActivate.cs +++ b/LKY_OfficeTools/Lib/Lib_OfficeActivate.cs @@ -15,7 +15,7 @@ using static LKY_OfficeTools.Lib.Lib_AppInfo.AppPath; using static LKY_OfficeTools.Lib.Lib_AppLog; using static LKY_OfficeTools.Lib.Lib_OfficeInfo; -using static LKY_OfficeTools.Lib.Lib_OfficeInfo.OfficeLocalInstall; +using static LKY_OfficeTools.Lib.Lib_OfficeInfo.OfficeLocalInfo; namespace LKY_OfficeTools.Lib { @@ -24,14 +24,6 @@ namespace LKY_OfficeTools.Lib /// internal class Lib_OfficeActivate { - /// - /// 重载实现激活 - /// - internal Lib_OfficeActivate() - { - Activating(); - } - /// /// KMS 服务器列表 /// @@ -97,7 +89,7 @@ internal static int StartActivate(string kms_server = "kms.chinancce.com") string cmd_kms_url = $"cscript ospp.vbs /sethst:{kms_server}"; //设置激活KMS地址 string cmd_activate = "cscript ospp.vbs /act"; //开始激活 - new Log($"\n------> 正在激活 Office v{OfficeNetVersion.latest_version} ...", ConsoleColor.DarkCyan); + new Log($"\n------> 正在激活 Office v{OfficeNetInfo.OfficeLatestVersion} ...", ConsoleColor.DarkCyan); //执行:设置激活KMS地址 string kms_flag = kms_server.Replace("kms.", ""); @@ -225,7 +217,7 @@ internal static int StartActivate(string kms_server = "kms.chinancce.com") return -1; } - new Log($" √ 已完成 Office v{OfficeNetVersion.latest_version} 正版激活。", ConsoleColor.DarkGreen); + new Log($" √ 已完成 Office v{OfficeNetInfo.OfficeLatestVersion} 正版激活。", ConsoleColor.DarkGreen); Lib_AppState.Current_StageType = Lib_AppState.ProcessStage.Finish_Success; //设置整体运行状态为成功 return 1; diff --git a/LKY_OfficeTools/Lib/Lib_OfficeClean.cs b/LKY_OfficeTools/Lib/Lib_OfficeClean.cs index 7aa0c91..8ffe6d2 100644 --- a/LKY_OfficeTools/Lib/Lib_OfficeClean.cs +++ b/LKY_OfficeTools/Lib/Lib_OfficeClean.cs @@ -53,8 +53,8 @@ internal static bool RemoveAllOffice() Uninstall.BySaRA(); //无论哪种方式清理,都要再检查一遍是否卸载干净。如果 当前系统 Office 版本数量 > 0,启动强制模式 - var installed_office = OfficeLocalInstall.GetArchiDir(); - var license_list = OfficeLocalInstall.LicenseInfo(); + var installed_office = OfficeLocalInfo.GetArchiDir(); + var license_list = OfficeLocalInfo.LicenseInfo(); if ( (installed_office != null && installed_office.Count > 0) || //存在残留的Office注册表/文件目录 license_list != null && license_list.Count > 0 //存在残留的许可证信息 @@ -86,7 +86,7 @@ internal static bool Delete() try { //获取激活信息 - var office_installed_key = OfficeLocalInstall.LicenseInfo(); + var office_installed_key = OfficeLocalInfo.LicenseInfo(); if (office_installed_key != null && office_installed_key.Count > 0) { @@ -108,7 +108,7 @@ internal static bool Delete() } //逐一卸载后,若都为 success,则再执行一次检查 - office_installed_key = OfficeLocalInstall.LicenseInfo(); //再度获取list + office_installed_key = OfficeLocalInfo.LicenseInfo(); //再度获取list if (office_installed_key.Count == 0) //为0,视为成功 { return true; @@ -151,7 +151,7 @@ internal static bool ForceDelete() try { //有些文件可能无法彻底删除,但如果后面复查时,不影响安装,则不会返回 false - var office_installed_dir = OfficeLocalInstall.GetArchiDir(); + var office_installed_dir = OfficeLocalInfo.GetArchiDir(); if (office_installed_dir != null && office_installed_dir.Count > 0) { foreach (var now_dir in office_installed_dir) //遍历查询所有目录,将其删除 @@ -213,7 +213,7 @@ internal static bool ForceDelete() } //复查是否干净了 - var installed_info = OfficeLocalInstall.GetArchiDir(); + var installed_info = OfficeLocalInfo.GetArchiDir(); if (installed_info != null && installed_info.Count > 0) { throw new Exception(); @@ -372,7 +372,7 @@ internal static bool BySaRA() new Log($"\n------> 正在卸载 Office 冗余版本 ...", ConsoleColor.DarkCyan); //获取目前存留的版本 - var install_list = OfficeLocalInstall.GetArchiDir(); + var install_list = OfficeLocalInfo.GetArchiDir(); if (install_list == null || install_list.Count == 0) { //已经不存在残留版本时,直接返回卸载成功 diff --git a/LKY_OfficeTools/Lib/Lib_OfficeDownload.cs b/LKY_OfficeTools/Lib/Lib_OfficeDownload.cs index d011d08..653b1df 100644 --- a/LKY_OfficeTools/Lib/Lib_OfficeDownload.cs +++ b/LKY_OfficeTools/Lib/Lib_OfficeDownload.cs @@ -12,7 +12,6 @@ using static LKY_OfficeTools.Lib.Lib_AppInfo; using static LKY_OfficeTools.Lib.Lib_AppLog; using static LKY_OfficeTools.Lib.Lib_OfficeInfo; -using static LKY_OfficeTools.Lib.Lib_OfficeInfo.OfficeLocalInstall; namespace LKY_OfficeTools.Lib { @@ -21,61 +20,30 @@ namespace LKY_OfficeTools.Lib /// internal class Lib_OfficeDownload { - /// - /// 下载文件列表 - /// - static List down_list = null; - - /// - /// 重载实现下载 - /// - internal Lib_OfficeDownload() - { - //FilesDownload(); - } - /// /// 下载所有文件(Aria2c) - /// 返回值:-1【用户终止】,0【下载失败】,1【下载成功】,2【无需下载】 + /// 返回值:-1【用户终止】,0【下载失败】,1【下载成功】 /// - internal static int FilesDownload() + internal static int StartDownload() { try { - //获取下载列表 - down_list = OfficeNetVersion.GetOfficeFileList(); - if (down_list == null) - { - //因列表获取异常,停止下载 - return 0; - } - - //判断是否已经安装了当前版本 - InstallState install_state = GetOfficeState(); - if (install_state==InstallState.Correct) //已安装最新版,无需下载 - { - new Log($"\n * 当前系统安装了最新 Office 版本,已跳过下载、安装流程。", ConsoleColor.DarkMagenta); - return 2; - } - ///当不存在 VersionToReport or 其版本与最新版不一致 or 产品ID不一致 or 安装位数与系统不一致时,需要下载新文件。 - - //定义下载目标地 - string save_to = AppPath.ExecuteDir + @"\Office\Data\"; //文件必须位于 \Office\Data\ 下, - //ODT安装必须在 Office 上一级目录上执行。 + //定义下载目标地。文件必须位于 \Office\Data\下。ODT安装必须在 Office 上一级目录上执行。 + string save_to = AppPath.ExecuteDir + @"\Office\Data\"; //计划保存的地址 List save_files = new List(); //下载开始 - new Log($"\n------> 开始下载 Office v{OfficeNetVersion.latest_version} 文件 ...", ConsoleColor.DarkCyan); + new Log($"\n------> 开始下载 Office v{OfficeNetInfo.OfficeLatestVersion} 文件 ...", ConsoleColor.DarkCyan); //延迟,让用户看到开始下载 Thread.Sleep(1000); //轮询下载所有文件 - foreach (var a in down_list) + foreach (var a in OfficeNetInfo.OfficeFileList) { //根据官方目录,来调整下载保存位置 - string save_path = save_to + a.Substring(OfficeNetVersion.office_file_root_url.Length).Replace("/", "\\"); + string save_path = save_to + a.Substring(OfficeNetInfo.OfficeUrlRoot.Length).Replace("/", "\\"); //保存到List里面,用于后续检查 save_files.Add(save_path); @@ -99,7 +67,7 @@ internal static int FilesDownload() new Log($" √ 已下载 {new FileInfo(save_path).Name} 文件。", ConsoleColor.DarkGreen); } - new Log($"\n------> 正在检查 Office v{OfficeNetVersion.latest_version} 文件 ...", ConsoleColor.DarkCyan); + new Log($"\n------> 正在检查 Office v{OfficeNetInfo.OfficeLatestVersion} 文件 ...", ConsoleColor.DarkCyan); foreach (var b in save_files) { @@ -113,11 +81,11 @@ internal static int FilesDownload() else { new Log($" >> 文件 {new FileInfo(b).Name} 存在异常,重试中 ...", ConsoleColor.DarkRed); - return FilesDownload(); + return StartDownload(); } } - new Log($" √ 已完成 Office v{OfficeNetVersion.latest_version} 下载。", ConsoleColor.DarkGreen); + new Log($" √ 已完成 Office v{OfficeNetInfo.OfficeLatestVersion} 下载。", ConsoleColor.DarkGreen); return 1; } diff --git a/LKY_OfficeTools/Lib/Lib_OfficeInfo.cs b/LKY_OfficeTools/Lib/Lib_OfficeInfo.cs index 7443dc7..d493976 100644 --- a/LKY_OfficeTools/Lib/Lib_OfficeInfo.cs +++ b/LKY_OfficeTools/Lib/Lib_OfficeInfo.cs @@ -11,7 +11,6 @@ using System.Collections.Generic; using System.IO; using System.Linq; -using System.Threading; using static LKY_OfficeTools.Common.Com_SystemOS; using static LKY_OfficeTools.Lib.Lib_AppInfo; using static LKY_OfficeTools.Lib.Lib_AppInfo.AppPath; @@ -75,171 +74,245 @@ internal enum OfficeArchi /// /// 查看 Office 网络的版本类库 /// - internal class OfficeNetVersion + internal class OfficeNetInfo { + private static string _office_channel_info; /// - /// 最新版 Office 版本信息 - /// - internal static Version latest_version = null; - - /// - /// 要下载的 Office 文件的根网址 - /// - internal static string office_file_root_url; - - /// - /// 获取最新版本的 Office 函数 + /// Office频道的信息 /// - /// - internal static Version GetOfficeVersion() + internal static string OfficeChannelInfo { - try + get { - new Log("\n------> 正在获取 最新可用 Office 版本 ...", ConsoleColor.DarkCyan); - - //获取频道信息,得到可用 Url 列表 - string channel_info = Com_TextOS.GetCenterText(AppJson.Info, "\"OfficeChannels_Url\": \"", "\""); - if (string.IsNullOrEmpty(channel_info)) + try { - throw new Exception("OfficeChannels_Url 信息获取失败!"); - } - List channel_list = channel_info.Split(';').ToList(); + //私有值非空判断 + if (!string.IsNullOrWhiteSpace(_office_channel_info)) + { + return _office_channel_info; + } - //遍历获取有效地址,并下载channel信息 - string office_info = null; - int try_times = 1; //尝试获取次数,初始值为1 - foreach (var now_url in channel_list) - { - office_info = Com_WebOS.Visit_WebClient(now_url.Replace(" ", "")); //替换网址空格,并获得当前网址的访问信息 - if (!string.IsNullOrEmpty(office_info)) + new Log("\n------> 正在获取 最新可用 Office 信息 ...", ConsoleColor.DarkCyan); + + //获取频道信息,得到可用 Url 列表 + string channel_info = Com_TextOS.GetCenterText(AppJson.Info, "\"OfficeChannels_Url\": \"", "\""); + if (string.IsNullOrEmpty(channel_info)) { - //info有值,开始截取字段 + throw new Exception("OfficeChannels_Url 信息获取失败!"); + } + List channel_list = channel_info.Split(';').ToList(); - //获取版本信息 - string latest_info = Com_TextOS.GetCenterText(office_info, "\"PerpetualVL2021\",", "name"); //获取 2021 LTSC - if (!string.IsNullOrEmpty(latest_info)) + //遍历获取有效地址,并下载channel信息 + string office_info = null; + int try_times = 1; //尝试获取次数,初始值为1 + foreach (var now_url in channel_list) + { + office_info = Com_WebOS.Visit_WebClient(now_url.Replace(" ", "")); //替换网址空格,并获得当前网址的访问信息 + if (!string.IsNullOrEmpty(office_info)) { - //获取版本号 - latest_version = new Version(Com_TextOS.GetCenterText(latest_info, "latestUpdateVersion\":\"", "\"")); //官方Json取值,格式和自己的不一样,千万注意 + new Log($" √ 已获得 Office 最新正版信息。", ConsoleColor.DarkGreen); - //获取office下载地址 - office_file_root_url = Com_TextOS.GetCenterText(latest_info, "baseUrl\":\"", "\""); //官方Json取值,格式和自己的不一样,千万注意 + //info有值,返回该值。 + return _office_channel_info = office_info; + } - //版本信息不为空,下载地址不为空时,返回 - if ((latest_version != null) && (!string.IsNullOrEmpty(office_file_root_url))) - { - return latest_version; - } + //访问当前网址返回数据为空,或者无法截取获得有效字段时,遍历。 + if (try_times < channel_list.Count) + { + new Log($" >> 尝试使用 {++try_times} 号服务器获取中 ...", ConsoleColor.DarkYellow); + continue; } } - //访问当前网址返回数据为空,或者无法截取获得有效字段时,遍历。 - if (try_times < channel_list.Count) - { - new Log($" >> 尝试使用 {++try_times} 号服务器获取中 ...", ConsoleColor.DarkYellow); - continue; - } + //全部遍历完,依旧没返回,就说明全部失败 + throw new Exception("Office 信息获取失败!"); + } + catch (Exception Ex) + { + new Log(" × 最新 Office 信息获取失败,请稍后重试!", ConsoleColor.DarkRed); + new Log(Ex.ToString()); + return null; } - - //全部遍历完,依旧没返回,就说明全部失败,返回null。 - return null; - } - catch (Exception Ex) - { - new Log(Ex.ToString()); - return null; } - } + private static Version _office_latest_version; /// - /// 获取文件下载列表 + /// 最新版 Office 版本信息 /// - /// - internal static List GetOfficeFileList() + internal static Version OfficeLatestVersion { - try + get { - Version version_info = GetOfficeVersion(); //获取版本 - - if (version_info == null || string.IsNullOrEmpty(office_file_root_url)) //下载根地址为空时,视为失败 + try { - new Log(" × 最新版本获取失败,请稍后重试!", ConsoleColor.DarkRed); - return null; - } + //非空返回 + if (_office_latest_version != null) + { + return _office_latest_version; + } - string ver = version_info.ToString(); + //非空判断 + if (string.IsNullOrWhiteSpace(OfficeChannelInfo)) + { + return null; + } - new Log($" √ 已获得 Office v{ver} 正版信息。", ConsoleColor.DarkGreen); + new Log("\n------> 正在解析 最新可用 Office 版本 ...", ConsoleColor.DarkCyan); - //延迟,让用户看清版本号 - Thread.Sleep(500); + //获取版本信息 + string latest_info = Com_TextOS.GetCenterText(OfficeChannelInfo, "\"PerpetualVL2021\",", "name"); //获取 2021 LTSC + if (!string.IsNullOrEmpty(latest_info)) + { + //获取版本号 + var ver = new Version(Com_TextOS.GetCenterText(latest_info, "latestUpdateVersion\":\"", "\"")); //官方Json取值,格式和自己的不一样,千万注意 + new Log($" √ 已获得 Office 最新版本为:v{ver}", ConsoleColor.DarkGreen); - //获取文件列表 - List file_list = new List(); - office_file_root_url += "/office/data"; - ///获取当前系统位数 - int sys_bit; - if (Environment.Is64BitOperatingSystem) - { - sys_bit = 64; + return _office_latest_version = ver; + } + + throw new Exception("无法获取 PerpetualVL2021 对应的版本号!"); } - else + catch (Exception Ex) { - sys_bit = 32; + new Log(" × 无法获取 最新可用 Office 版本,请稍后重试!", ConsoleColor.DarkRed); + new Log(Ex.ToString()); + return null; } + } + } - //x32系统也需要下载 64 的 i64****.cab文件,但必须放在 {ver} 目录下。 - file_list.Add($"{office_file_root_url}/{ver}/i640.cab"); - file_list.Add($"{office_file_root_url}/{ver}/i642052.cab"); - - switch (sys_bit) + private static string _office_url_root; + /// + /// 要下载的 Office 文件的根网址 + /// + internal static string OfficeUrlRoot + { + get + { + try { - case 64: - file_list.Add($"{office_file_root_url}/{ver}/stream.x{sys_bit}.x-none.dat"); - file_list.Add($"{office_file_root_url}/{ver}/stream.x{sys_bit}.zh-cn.dat"); - break; - case 32: - file_list.Add($"{office_file_root_url}/{ver}/stream.x86.x-none.dat"); - file_list.Add($"{office_file_root_url}/{ver}/stream.x86.zh-cn.dat"); - file_list.Add($"{office_file_root_url}/{ver}/i{sys_bit}0.cab"); - file_list.Add($"{office_file_root_url}/{ver}/i{sys_bit}2052.cab"); - break; - } + //非空返回 + if (!string.IsNullOrWhiteSpace(_office_url_root)) + { + return _office_url_root; + } + + //非空判断 + if (string.IsNullOrWhiteSpace(OfficeChannelInfo)) + { + return null; + } + + new Log("\n------> 正在解析 最新可用 Office 下载服务器 ...", ConsoleColor.DarkCyan); + + //获取版本信息 + string latest_info = Com_TextOS.GetCenterText(OfficeChannelInfo, "\"PerpetualVL2021\",", "name"); //获取 2021 LTSC + if (!string.IsNullOrEmpty(latest_info)) + { + //获取office下载地址 + var url = Com_TextOS.GetCenterText(latest_info, "baseUrl\":\"", "\""); //官方Json取值,格式和自己的不一样,千万注意 - //按版本下载其余文件 - file_list.Add($"{office_file_root_url}/v{sys_bit}.cab"); - file_list.Add($"{office_file_root_url}/v{sys_bit}_{ver}.cab"); - file_list.Add($"{office_file_root_url}/{ver}/s{sys_bit}0.cab"); - file_list.Add($"{office_file_root_url}/{ver}/s{sys_bit}2052.cab"); + new Log($" √ 已获得 Office 最新下载服务器信息", ConsoleColor.DarkGreen); - /* - Console.ForegroundColor = ConsoleColor.DarkYellow; - new Log($"\n------> 预计下载文件:"); - foreach (var a in file_list) + return _office_url_root = url + "/office/data"; + } + + throw new Exception("无法获取 PerpetualVL2021 对应的下载地址!"); + } + catch (Exception Ex) { - new Log($" > {a}"); + new Log(" × 无法获取 最新可用 Office 下载服务器", ConsoleColor.DarkRed); + new Log(Ex.ToString()); + return null; } - Console.Read(); - */ - - return file_list; } + } - catch (Exception Ex) + private static List _office_file_list; + /// + /// Office 最新版的文件下载地址列表 + /// + internal static List OfficeFileList + { + get { - new Log(Ex.ToString()); - return null; - } + try + { + //非空返回 + if (_office_file_list != null && _office_file_list.Count > 0) + { + return _office_file_list; + } + + //下载根地址为空时,视为失败 + if (OfficeLatestVersion == null || string.IsNullOrEmpty(OfficeUrlRoot)) + { + return null; + } + + new Log("\n------> 正在解析 Office 下载列表 ...", ConsoleColor.DarkCyan); + + //获取文件列表 + List result = new List(); + + //获取当前系统位数 + int sys_bit; + if (Environment.Is64BitOperatingSystem) + { + sys_bit = 64; + } + else + { + sys_bit = 32; + } + + //获得版本号的字符串 + string ver = OfficeLatestVersion.ToString(); + + //x32系统也需要下载 64 的 i64****.cab文件,但必须放在 {ver} 目录下。 + result.Add($"{OfficeUrlRoot}/{ver}/i640.cab"); + result.Add($"{OfficeUrlRoot}/{ver}/i642052.cab"); + + switch (sys_bit) + { + case 64: + result.Add($"{OfficeUrlRoot}/{ver}/stream.x{sys_bit}.x-none.dat"); + result.Add($"{OfficeUrlRoot}/{ver}/stream.x{sys_bit}.zh-cn.dat"); + break; + case 32: + result.Add($"{OfficeUrlRoot}/{ver}/stream.x86.x-none.dat"); + result.Add($"{OfficeUrlRoot}/{ver}/stream.x86.zh-cn.dat"); + result.Add($"{OfficeUrlRoot}/{ver}/i{sys_bit}0.cab"); + result.Add($"{OfficeUrlRoot}/{ver}/i{sys_bit}2052.cab"); + break; + } + + //按版本下载其余文件 + result.Add($"{OfficeUrlRoot}/v{sys_bit}.cab"); + result.Add($"{OfficeUrlRoot}/v{sys_bit}_{ver}.cab"); + result.Add($"{OfficeUrlRoot}/{ver}/s{sys_bit}0.cab"); + result.Add($"{OfficeUrlRoot}/{ver}/s{sys_bit}2052.cab"); + + new Log($" √ 已解析 Office 下载列表。", ConsoleColor.DarkGreen); + + return _office_file_list = result; + } + catch (Exception Ex) + { + new Log(Ex.ToString()); + return null; + } + } } } /// /// 查看本地 Office 安装情况 类库 /// - internal class OfficeLocalInstall + internal class OfficeLocalInfo { /// /// Office 本地安装情况(标记) @@ -297,58 +370,66 @@ internal static InstallState GetOfficeState() if (office_reg_ver_list.Count == 1) { //只安装了1个ODT版本 - foreach (var now_ver in office_reg_ver_list) - { - //获取目标ID - string Pop_Office_ID = "2021Volume"; + //获取其版本号 + Version installed_ver = null; - //获取本机已经安装的ID(如果x64系统,安装了x32的 Office 在 WOW6432Node 目录,该值将为null) - string Current_Office_ID = Register.Read.ValueBySystem(RegistryHive.LocalMachine, @"SOFTWARE\Microsoft\Office\ClickToRun\Configuration", "ProductReleaseIds"); - - //ODT 只安装了1个版本,但 now_ver 为空,视为版本不同 - if (string.IsNullOrEmpty(Current_Office_ID)) - { - return InstallState.Diff; - } + //解析版本号 + try + { + installed_ver = new Version(office_reg_ver_list[0]); + } + catch + { + //ODT 只安装了1个版本,但 now_ver 为空,或版本号解析失败,视为版本不同 + return InstallState.Diff; + } - //替换支持的版本ID。如果用户还安装了其它架构,进行替换后,该值不是空 - var diff_products = Current_Office_ID - .Replace($"ProjectPro{Pop_Office_ID}", "") - .Replace($"ProPlus{Pop_Office_ID}", "") - .Replace($"VisioPro{Pop_Office_ID}", "") - .Replace(",", ""); - - if ( - (now_ver != null && now_ver == OfficeNetVersion.latest_version.ToString()) //版本号一致 - && - string.IsNullOrWhiteSpace(diff_products) //是否还安装了其它ID - ) + //获取目标ID + string Pop_Office_ID = "2021Volume"; + + //获取本机已经安装的ID(如果x64系统,安装了x32的 Office 在 WOW6432Node 目录,该值将为null) + string Current_Office_ID = Register.Read.ValueBySystem(RegistryHive.LocalMachine, @"SOFTWARE\Microsoft\Office\ClickToRun\Configuration", "ProductReleaseIds"); + + //替换支持的版本ID。如果用户还安装了其它架构,进行替换后,该值不是空 + var diff_products = Current_Office_ID + .Replace($"ProjectPro{Pop_Office_ID}", "") + .Replace($"ProPlus{Pop_Office_ID}", "") + .Replace($"VisioPro{Pop_Office_ID}", "") + .Replace(",", ""); + + if ( + //本地版本号非空 & 本地版本号 >= 官方最新版本号,就视为安装了最新版(因为可能会有安全更新补丁) + (installed_ver != null && installed_ver >= OfficeNetInfo.OfficeLatestVersion) + && + string.IsNullOrWhiteSpace(diff_products) //是否还安装了其它ID + ) + { + //x64系统还得校验下 Office 注册表的 平台信息 是否一致 + if (Environment.Is64BitOperatingSystem) { - //x64系统还得校验下 Office 注册表的 平台信息 是否一致 - if (Environment.Is64BitOperatingSystem) + string platform = Register.Read.Value(RegistryHive.LocalMachine, RegistryView.Registry64, @"SOFTWARE\Microsoft\Office\ClickToRun\Configuration", "Platform"); + if (string.IsNullOrWhiteSpace(platform) || platform == "x86") { - string platform = Register.Read.Value(RegistryHive.LocalMachine, RegistryView.Registry64, @"SOFTWARE\Microsoft\Office\ClickToRun\Configuration", "Platform"); - if (string.IsNullOrWhiteSpace(platform) || platform == "x86") - { - return InstallState.Diff; //虽然出现在了与x64系统注册表匹配的路径,但是Office平台版本并非x64 - } - else - { - //版本号一致、产品ID一致、注册表显示的位数一致 - return InstallState.Correct; //已经正确安装最新版 - } + return InstallState.Diff; //虽然出现在了与x64系统注册表匹配的路径,但是Office平台版本并非x64 } else { - //x32系统,直接满足了 + //版本号不小于官方最新版、产品ID一致、注册表显示的位数一致 return InstallState.Correct; //已经正确安装最新版 } } + else + { + //x32系统,直接满足了 + return InstallState.Correct; //已经正确安装最新版 + } + } + else + { + //ODT 只安装了1个版本,但版本号小于预期版本号,或者还安装了其它版本, + //如:ProPlus2016Volume,视为版本不同 + return InstallState.Diff; } - - //ODT 只安装了1个版本,但版本号和预期版本号不一致,或者还安装了其它版本, - //如:ProPlus2016Volume,视为版本不同 - return InstallState.Diff; } else { diff --git a/LKY_OfficeTools/Lib/Lib_OfficeInstall.cs b/LKY_OfficeTools/Lib/Lib_OfficeInstall.cs index dd8837b..c2c94b5 100644 --- a/LKY_OfficeTools/Lib/Lib_OfficeInstall.cs +++ b/LKY_OfficeTools/Lib/Lib_OfficeInstall.cs @@ -21,7 +21,7 @@ using static LKY_OfficeTools.Lib.Lib_AppState; using static LKY_OfficeTools.Lib.Lib_OfficeClean; using static LKY_OfficeTools.Lib.Lib_OfficeInfo; -using static LKY_OfficeTools.Lib.Lib_OfficeInfo.OfficeLocalInstall; +using static LKY_OfficeTools.Lib.Lib_OfficeInfo.OfficeLocalInfo; namespace LKY_OfficeTools.Lib { @@ -35,58 +35,96 @@ internal class Lib_OfficeInstall /// internal Lib_OfficeInstall() { - //被动模式下,不安装,只激活 - if (Current_RunMode == RunMode.Passive) + + try { - new Log($"\n * 当前处于被动模式,已跳过 Office 安装流程,直接激活。", ConsoleColor.DarkMagenta); - new Lib_OfficeActivate(); - return; - } + //版本获取成功时,执行后续操作。 + if (OfficeNetInfo.OfficeLatestVersion != null) + { + //判断是否已经安装了当前版本 + InstallState install_state = GetOfficeState(); + if (install_state == InstallState.Correct) //已安装最新版,无需下载 + { + new Log($"\n * 当前系统安装了最新 Office 版本,已跳过下载、安装流程。", ConsoleColor.DarkMagenta); - //下载后,开始安装 - int DownCode = Lib_OfficeDownload.FilesDownload(); + //开始激活 + Lib_OfficeActivate.Activating(); + } - //判断下载情况 - switch (DownCode) - { - case 2: - //已安装最新版,无需下载安装,直接进入激活模块 - new Lib_OfficeActivate(); - break; - case 1: - if (ConflictCheck()) //冲突检查 + //当不存在 VersionToReport or 其版本与最新版不一致 or 产品ID不一致 or 安装位数与系统不一致时,需要下载新文件。 + else { - //通过进入安装,不通过直接返回false - if (StartInstall()) + //被动模式下,如果版本不正确,不会重新安装,因为用户可能已经卸载。 + if (Current_RunMode == RunMode.Passive) { - //安装成功,进入激活程序 - new Lib_OfficeActivate(); + new Log($"\n × 当前系统未安装最新版本的 Office,激活停止!", ConsoleColor.DarkRed); + return; + } + + //如果是主动模式,则下载并安装最新版 + else if (Current_RunMode == RunMode.Manual) + { + //开始下载,并获得下载结果 + int DownCode = Lib_OfficeDownload.StartDownload(); + + //判断下载情况 + switch (DownCode) + { + //下载成功,开始安装 + case 1: + //冲突检查 + if (ConflictCheck()) + { + //通过进入安装,不通过直接返回false + if (StartInstall()) + { + //安装成功,进入激活程序 + Lib_OfficeActivate.Activating(); + } + else + { + new Log($"\n × 因 Office 安装失败,已跳过激活流程!", ConsoleColor.DarkRed); + break; + } + } + else + { + new Log($"\n × 无法完成 Office 冲突性检查,已跳过安装流程!", ConsoleColor.DarkRed); + break; + } + break; + case 0: + new Log($"\n × 未能找到可用的 Office 安装文件,已跳过安装流程!", ConsoleColor.DarkRed); + break; + case -1: + //用户中止了下载 + new Log($"\n × 用户取消了下载 Office 安装文件,已跳过安装流程!", ConsoleColor.DarkRed); + return; + } } + + //其他模式跳出 else { - new Log($"\n × 因 Office 安装失败,已跳过激活流程!", ConsoleColor.DarkRed); - break; + new Log($"{Current_RunMode} 模式下,暂不支持下载、安装、激活操作。"); + return; } } - else - { - new Log($"\n × 无法完成 Office 冲突性检查,已跳过安装流程!", ConsoleColor.DarkRed); - break; - } - break; - case 0: - new Log($"\n × 未能找到可用的 Office 安装文件,已跳过安装流程!", ConsoleColor.DarkRed); - break; - case -1: - //用户中止了下载,不执行附加内容 - return; + } } - - //全部完成后,判断是否成功 - if (Lib_AppState.Current_StageType != Lib_AppState.ProcessStage.Finish_Success) + catch (Exception Ex) + { + new Log($"\n × Office 安装过程中发生异常,已跳过安装流程!", ConsoleColor.DarkRed); + new Log(Ex.ToString()); + } + finally { - //只要全部流程结束后,不是成功状态(并且没有中断情况),就设置为 失败 - Lib_AppState.Current_StageType = Lib_AppState.ProcessStage.Finish_Fail; + //全部完成后,判断是否成功 + if (Current_StageType != ProcessStage.Finish_Success) + { + //只要全部流程结束后,不是成功状态(并且没有中断情况),就设置为 失败 + Current_StageType = ProcessStage.Finish_Fail; + } } } @@ -361,7 +399,7 @@ internal static bool StartInstall() } ///修改为新版本号 - bool isNewVersion = Com_FileOS.XML.SetValue(ODT_path_xml, "Version", OfficeNetVersion.latest_version.ToString()); + bool isNewVersion = Com_FileOS.XML.SetValue(ODT_path_xml, "Version", OfficeNetInfo.OfficeLatestVersion.ToString()); //检查是否修改成功(版本号) if (!isNewVersion) @@ -550,7 +588,7 @@ internal static bool StartInstall() File.WriteAllText(ODT_path_xml, config); //开始安装 - new Log($"\n------> 正在安装 Office v{OfficeNetVersion.latest_version} ...", ConsoleColor.DarkCyan); + new Log($"\n------> 正在安装 Office v{OfficeNetInfo.OfficeLatestVersion} ...", ConsoleColor.DarkCyan); ///先结束掉可能还在安装的 Office 进程(强制结束,不等待) Lib_AppSdk.KillAllSdkProcess(KillExe.KillMode.Only_Force); @@ -562,7 +600,7 @@ internal static bool StartInstall() //检查是否因配置不正确等导致,意外退出安装 if (install_code == -920921) { - new Log($" × Office v{OfficeNetVersion.latest_version} 安装意外结束!", ConsoleColor.DarkRed); + new Log($" × Office v{OfficeNetInfo.OfficeLatestVersion} 安装意外结束!", ConsoleColor.DarkRed); return false; } @@ -577,7 +615,7 @@ internal static bool StartInstall() if (install_state == InstallState.Correct) { //安装成功 - new Log($" √ 已完成 Office v{OfficeNetVersion.latest_version} 安装。", ConsoleColor.DarkGreen); + new Log($" √ 已完成 Office v{OfficeNetInfo.OfficeLatestVersion} 安装。", ConsoleColor.DarkGreen); return true; } else @@ -607,7 +645,7 @@ internal static bool StartInstall() //包含不同版本 if (install_state == InstallState.Diff) { - new Log($" × 已安装的 Office 版本与预期的 v{OfficeNetVersion.latest_version} 版本不符!", ConsoleColor.DarkRed); + new Log($" × 已安装的 Office 版本与预期的 v{OfficeNetInfo.OfficeLatestVersion} 版本不符!", ConsoleColor.DarkRed); new Log(install_state); //打点失败注册表记录 return false; } @@ -640,34 +678,36 @@ internal static Dictionary ODT_Error { get { - Dictionary res = new Dictionary(); - res[0] = "安装成功。"; - res[997] = "安装正在进行中。"; - res[13] = "无法验证下载的 Office 部署工具 (ODT) 的签名。"; - res[1460] = "下载 ODT 超时。"; - res[1602] = "用户已取消运行。"; - res[1603] = "未通过任何预检检查。安装 2016 MSI 时尝试安装 SxS。" + - "当前安装的 Office 与尝试安装的 Office 之间的位不匹配 (例如,在当前安装 64 位版本时尝试安装 32 位版本时。)"; - res[17000] = "未能启动 C2RClient。"; - res[17001] = "未能在 C2RClient 中排队安装方案。"; - res[17002] = "未能完成该过程。可能的原因:" + + Dictionary res = new Dictionary + { + [0] = "安装成功。", + [997] = "安装正在进行中。", + [13] = "无法验证下载的 Office 部署工具 (ODT) 的签名。", + [1460] = "下载 ODT 超时。", + [1602] = "用户已取消运行。", + [1603] = "未通过任何预检检查。安装 2016 MSI 时尝试安装 SxS。" + + "当前安装的 Office 与尝试安装的 Office 之间的位不匹配 (例如,在当前安装 64 位版本时尝试安装 32 位版本时。)", + [17000] = "未能启动 C2RClient。", + [17001] = "未能在 C2RClient 中排队安装方案。", + [17002] = "未能完成该过程。可能的原因:" + "(1)用户已取消安装" + "(2)安装已由另一个安装取消" + "(3)安装期间磁盘空间不足" + - "(4)未知语言 ID"; - res[17003] = "另一个方案正在运行。"; - res[17004] = "无法完成需要的清理。可能的原因:" + + "(4)未知语言 ID", + [17003] = "另一个方案正在运行。", + [17004] = "无法完成需要的清理。可能的原因:" + "(1)未知 SKU" + "(2)CDN 上不存在内容。例如,尝试安装不受支持的 LAP,例如 zh-sg" + "(3)内容不可用的 CDN 问题" + "(4)签名检查问题,例如 Office 内容的签名检查失败" + - "(5)用户已取消"; - res[17005] = "ERROR!SCENARIO CANCELLED AS PLANNED。"; - res[17006] = "通过运行应用阻止更新。"; - res[17007] = "客户端在“删除安装”方案中请求客户端清理。"; - res[17100] = "C2RClient 命令行错误。"; - res[0x80004005] = "ODT 不能用于安装批量许可证。"; - res[0x8000ffff] = "尝试在计算机上没有 C2R Office 时卸载。"; + "(5)用户已取消", + [17005] = "ERROR!SCENARIO CANCELLED AS PLANNED。", + [17006] = "通过运行应用阻止更新。", + [17007] = "客户端在“删除安装”方案中请求客户端清理。", + [17100] = "C2RClient 命令行错误。", + [0x80004005] = "ODT 不能用于安装批量许可证。", + [0x8000ffff] = "尝试在计算机上没有 C2R Office 时卸载。" + }; return res; } } diff --git a/LKY_OfficeTools/OfficeTools.cs b/LKY_OfficeTools/OfficeTools.cs index 18fcaff..8ed81aa 100644 --- a/LKY_OfficeTools/OfficeTools.cs +++ b/LKY_OfficeTools/OfficeTools.cs @@ -107,7 +107,7 @@ private static void Entry() } //成功,配置后回收 - Pointing(Current_StageType, true); + Pointing(ProcessStage.Finish_Success, true); //结论 new Log($"\n √ 您已成功完成 {AppAttribute.AppName} 所有流程,感谢您的使用。", ConsoleColor.DarkGreen); @@ -116,7 +116,7 @@ private static void Entry() else if (Current_StageType == ProcessStage.Finish_Fail) { //失败,先回收,再显示结论 - Pointing(Current_StageType, true); + Pointing(ProcessStage.Finish_Fail, true); //结论 new Log($"\n × 当前部署存在失败环节,您可在稍后重试运行!", ConsoleColor.DarkRed); diff --git a/LKY_OfficeTools/logo.ico b/LKY_OfficeTools/logo.ico index ba989d8..a608b4f 100644 Binary files a/LKY_OfficeTools/logo.ico and b/LKY_OfficeTools/logo.ico differ