diff --git a/Ink Canvas/App.xaml.cs b/Ink Canvas/App.xaml.cs index a57685b0..15455978 100644 --- a/Ink Canvas/App.xaml.cs +++ b/Ink Canvas/App.xaml.cs @@ -914,125 +914,6 @@ namespace Ink_Canvas LogHelper.WriteLogToFile($"启动IPC监听器时出错: {ex.Message}", LogHelper.LogType.Error); } - // Office注册表检测 - try - { - LogHelper.WriteLogToFile("开始Office注册表检测"); - - // 检查Office安装 - if (!IsOfficeInstalled()) - { - LogHelper.WriteLogToFile("未检测到Office安装", LogHelper.LogType.Warning); - return; - } - - // 尝试获取所有可能的Office版本路径 - var officeVersions = GetOfficeVersions(); - if (officeVersions.Count == 0) - { - LogHelper.WriteLogToFile("未找到任何Office版本", LogHelper.LogType.Warning); - return; - } - - foreach (var version in officeVersions) - { - string regPath = $"Software\\Microsoft\\Office\\{version}\\Common\\Security"; - LogHelper.WriteLogToFile($"正在处理Office版本 {version}, 注册表路径: {regPath}"); - - try - { - using (RegistryKey baseKey = Registry.CurrentUser.OpenSubKey(regPath)) - { - if (baseKey == null) - { - LogHelper.WriteLogToFile($"注册表路径不存在: {regPath}", LogHelper.LogType.Warning); - // 尝试创建路径 - try - { - using (RegistryKey createKey = Registry.CurrentUser.CreateSubKey(regPath, true)) - { - if (createKey != null) - { - createKey.SetValue("DisableProtectedView", 1, RegistryValueKind.DWord); - LogHelper.WriteLogToFile($"创建并设置注册表路径: {regPath}"); - } - } - } - catch (Exception createEx) - { - LogHelper.WriteLogToFile($"创建注册表路径失败: {createEx.Message}", LogHelper.LogType.Error); - } - continue; - } - - // 备份路径更改为软件根目录下的saves/RegistryBackups文件夹 - string backupPath = Path.Combine(RootPath, "Saves", "RegistryBackups"); - LogHelper.WriteLogToFile($"备份路径: {backupPath}"); - - if (!Directory.Exists(backupPath)) - { - Directory.CreateDirectory(backupPath); - LogHelper.WriteLogToFile($"创建备份目录: {backupPath}"); - } - - string backupFile = Path.Combine(backupPath, $"SecurityBackup_{version}_{DateTime.Now:yyyyMMddHHmmss}.reg"); - LogHelper.WriteLogToFile($"创建备份文件: {backupFile}"); - - // 使用UTF8编码写入注册表文件 - using (StreamWriter sw = new StreamWriter(backupFile, false, Encoding.UTF8)) - { - sw.WriteLine("Windows Registry Editor Version 5.00\n"); - sw.WriteLine(); - sw.WriteLine($"[{Registry.CurrentUser.Name}\\{regPath}]"); - - foreach (string valueName in baseKey.GetValueNames()) - { - object value = baseKey.GetValue(valueName); - sw.WriteLine($"\"{valueName}\"=dword:{((int)value):x8}"); - LogHelper.WriteLogToFile($"备份注册表值: {valueName} = {value}"); - } - } - - using (RegistryKey key = Registry.CurrentUser.CreateSubKey(regPath, true)) - { - // 仅在值不存在或不等于1时更新 - object currentValue = key.GetValue("DisableProtectedView"); - if (currentValue == null || (int)currentValue != 1) - { - key.SetValue("DisableProtectedView", 1, RegistryValueKind.DWord); - LogHelper.WriteLogToFile($"Office {version} 注册表值已设置: DisableProtectedView = 1"); - } - else - { - LogHelper.WriteLogToFile($"Office {version} 注册表值已存在且无需更改: DisableProtectedView = 1"); - } - } - } - } - catch (Exception ex) - { - LogHelper.WriteLogToFile($"处理Office版本 {version} 时出错: {ex.Message}", LogHelper.LogType.Error); - } - } - - // 处理Office 365的特殊路径 - TryModifyOffice365Registry(); - } - catch (SecurityException secEx) - { - LogHelper.WriteLogToFile($"安全异常: {secEx.Message}", LogHelper.LogType.Error); - ShowPermissionError(); - } - catch (UnauthorizedAccessException authEx) - { - LogHelper.WriteLogToFile($"访问被拒绝: {authEx.Message}", LogHelper.LogType.Error); - ShowPermissionError(); - } - catch (Exception ex) - { - LogHelper.WriteLogToFile($"未知错误: {ex.GetType().FullName} - {ex.Message}", LogHelper.LogType.Error); - LogHelper.WriteLogToFile(ex.StackTrace); - } } private void ScrollViewer_PreviewMouseWheel(object sender, MouseWheelEventArgs e) @@ -1198,450 +1079,5 @@ namespace Ink_Canvas catch { } } } - - /// - /// 检查Office是否安装 - /// - private bool IsOfficeInstalled() - { - try - { - // 检查多个可能的注册表路径 - // 1. 检查传统的Office版本 - using (RegistryKey key = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Office")) - { - if (key != null && key.GetSubKeyNames().Any(name => name.Contains(".0"))) - { - LogHelper.WriteLogToFile("检测到传统Office安装"); - return true; - } - } - - // 2. 检查64位注册表中的Office - using (RegistryKey key = Registry.LocalMachine.OpenSubKey("Software\\Wow6432Node\\Microsoft\\Office")) - { - if (key != null && key.GetSubKeyNames().Any(name => name.Contains(".0"))) - { - LogHelper.WriteLogToFile("检测到64位注册表中的Office安装"); - return true; - } - } - - // 3. 检查Office 365/Click-to-Run安装 - using (RegistryKey key = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Office\\ClickToRun")) - { - if (key != null) - { - LogHelper.WriteLogToFile("检测到Office 365 Click-to-Run"); - return true; - } - } - - // 4. 检查Office 365部署配置 - using (RegistryKey key = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Office\\15.0\\ClickToRun")) - { - if (key != null) - { - LogHelper.WriteLogToFile("检测到Office 365 (15.0)"); - return true; - } - } - - using (RegistryKey key = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Office\\16.0\\ClickToRun")) - { - if (key != null) - { - LogHelper.WriteLogToFile("检测到Office 365 (16.0)"); - return true; - } - } - - // 5. 检查Office 365零售订阅信息 - using (RegistryKey key = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Office\\ClickToRun\\Configuration")) - { - if (key != null) - { - LogHelper.WriteLogToFile("检测到Office 365配置"); - return true; - } - } - - LogHelper.WriteLogToFile("未检测到任何Office安装", LogHelper.LogType.Warning); - return false; - } - catch (Exception ex) - { - LogHelper.WriteLogToFile($"检查Office安装时出错: {ex.Message}", LogHelper.LogType.Error); - return false; - } - } - - /// - /// 显示权限不足的错误提示 - /// - private void ShowPermissionError() - { - const string message = "需要管理员权限才能完成此操作\n请以管理员身份重新启动应用程序"; - LogHelper.WriteLogToFile(message, LogHelper.LogType.Error); - MessageBox.Show(message, "权限错误", MessageBoxButton.OK, MessageBoxImage.Error); - } - - /// - /// 获取所有已安装的Office版本 - /// - private List GetOfficeVersions() - { - var versions = new List(); - try - { - // 检查HKLM - using (var key = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Office")) - { - if (key != null) - { - foreach (var subKeyName in key.GetSubKeyNames()) - { - if (subKeyName.Contains(".0")) - { - versions.Add(subKeyName); - LogHelper.WriteLogToFile($"在HKLM中找到Office版本: {subKeyName}"); - } - } - } - } - - // 检查HKCU - using (var key = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Office")) - { - if (key != null) - { - foreach (var subKeyName in key.GetSubKeyNames()) - { - if (subKeyName.Contains(".0") && !versions.Contains(subKeyName)) - { - versions.Add(subKeyName); - LogHelper.WriteLogToFile($"在HKCU中找到Office版本: {subKeyName}"); - } - } - } - } - - // 检查64位注册表 - using (var key = Registry.LocalMachine.OpenSubKey("Software\\Wow6432Node\\Microsoft\\Office")) - { - if (key != null) - { - foreach (var subKeyName in key.GetSubKeyNames()) - { - if (subKeyName.Contains(".0") && !versions.Contains(subKeyName)) - { - versions.Add(subKeyName); - LogHelper.WriteLogToFile($"在64位注册表中找到Office版本: {subKeyName}"); - } - } - } - } - - // 检查Office 365的特殊路径 - CheckOffice365Versions(versions); - - // 如果没有找到任何版本,添加默认的Office 365版本号 - if (versions.Count == 0 && IsOffice365Installed()) - { - versions.Add("16.0"); - LogHelper.WriteLogToFile("未找到具体版本,添加默认Office 365版本: 16.0"); - } - } - catch (Exception ex) - { - LogHelper.WriteLogToFile($"获取Office版本时出错: {ex.Message}", LogHelper.LogType.Error); - } - - // 按版本号排序 - versions.Sort((a, b) => - { - try - { - double va = double.Parse(a.Replace(".0", "")); - double vb = double.Parse(b.Replace(".0", "")); - return vb.CompareTo(va); // 降序排列,最新版本在前 - } - catch - { - return 0; - } - }); - - return versions; - } - - /// - /// 检测Office 365是否已安装 - /// - private bool IsOffice365Installed() - { - try - { - // 检查多个Office 365特定路径 - using (var key = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Office\\ClickToRun")) - { - if (key != null) - return true; - } - - using (var key = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Office\\15.0\\ClickToRun")) - { - if (key != null) - return true; - } - - using (var key = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Office\\16.0\\ClickToRun")) - { - if (key != null) - return true; - } - - using (var key = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Office\\ClickToRun\\Configuration")) - { - if (key != null) - return true; - } - - return false; - } - catch - { - return false; - } - } - - /// - /// 检查Office 365特有的版本信息 - /// - private void CheckOffice365Versions(List versions) - { - try - { - // 检查Click-to-Run版本路径 - using (var key = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Office\\ClickToRun\\Configuration")) - { - if (key != null) - { - var platformVersion = key.GetValue("Platform") as string; - var clickToRunVersion = key.GetValue("VersionToReport") as string; - - if (!string.IsNullOrEmpty(platformVersion)) - { - var majorVersion = platformVersion.Split('.').FirstOrDefault(); - if (!string.IsNullOrEmpty(majorVersion) && !versions.Contains($"{majorVersion}.0")) - { - versions.Add($"{majorVersion}.0"); - LogHelper.WriteLogToFile($"在Office 365配置中找到平台版本: {majorVersion}.0"); - } - } - - if (!string.IsNullOrEmpty(clickToRunVersion)) - { - var majorVersion = clickToRunVersion.Split('.').FirstOrDefault(); - if (!string.IsNullOrEmpty(majorVersion) && !versions.Contains($"{majorVersion}.0")) - { - versions.Add($"{majorVersion}.0"); - LogHelper.WriteLogToFile($"在Office 365配置中找到报告版本: {majorVersion}.0"); - } - } - } - } - - // 检查安装路径来确认版本 - var possibleVersions = new[] { "15.0", "16.0" }; // Office 2013 (15.0) 和 Office 2016/2019/365 (16.0) - foreach (var version in possibleVersions) - { - using (var key = Registry.LocalMachine.OpenSubKey($"Software\\Microsoft\\Office\\{version}\\Common\\InstallRoot")) - { - if (key != null && key.GetValue("Path") != null && !versions.Contains(version)) - { - versions.Add(version); - LogHelper.WriteLogToFile($"在InstallRoot中找到Office版本: {version}"); - } - } - } - } - catch (Exception ex) - { - LogHelper.WriteLogToFile($"检查Office 365版本时出错: {ex.Message}", LogHelper.LogType.Error); - } - } - - /// - /// 尝试修改Office 365的特殊注册表路径 - /// - private void TryModifyOffice365Registry() - { - try - { - // 准备备份目录 - string backupPath = Path.Combine(RootPath, "Saves", "RegistryBackups"); - if (!Directory.Exists(backupPath)) - { - Directory.CreateDirectory(backupPath); - LogHelper.WriteLogToFile($"创建Office 365备份目录: {backupPath}"); - } - - // 检查Office 365 Outlook和PowerPoint的特定路径 - string[] apps = { "outlook", "powerpoint" }; - - foreach (var app in apps) - { - // 检查用户级别的注册表 - string regPath = $"Software\\Microsoft\\Office\\16.0\\{app}\\Security"; - LogHelper.WriteLogToFile($"检查Office 365特定应用注册表: {regPath}"); - - try - { - // 先检查是否存在该路径 - using (var baseKey = Registry.CurrentUser.OpenSubKey(regPath)) - { - // 如果路径存在,先备份 - if (baseKey != null) - { - string backupFile = Path.Combine(backupPath, $"SecurityBackup_365_{app}_{DateTime.Now:yyyyMMddHHmmss}.reg"); - LogHelper.WriteLogToFile($"创建Office 365 {app}备份文件: {backupFile}"); - - // 使用UTF8编码写入注册表文件 - using (StreamWriter sw = new StreamWriter(backupFile, false, Encoding.UTF8)) - { - sw.WriteLine("Windows Registry Editor Version 5.00\n"); - sw.WriteLine(); - sw.WriteLine($"[{Registry.CurrentUser.Name}\\{regPath}]"); - - foreach (string valueName in baseKey.GetValueNames()) - { - object value = baseKey.GetValue(valueName); - sw.WriteLine($"\"{valueName}\"=dword:{((int)value):x8}"); - LogHelper.WriteLogToFile($"备份Office 365 {app}注册表值: {valueName} = {value}"); - } - } - } - } - - // 修改或创建注册表项 - using (var key = Registry.CurrentUser.CreateSubKey(regPath, true)) - { - if (key != null) - { - object currentValue = key.GetValue("DisableProtectedView"); - if (currentValue == null || (int)currentValue != 1) - { - key.SetValue("DisableProtectedView", 1, RegistryValueKind.DWord); - LogHelper.WriteLogToFile($"Office 365 {app} 注册表值已设置: DisableProtectedView = 1"); - } - else - { - LogHelper.WriteLogToFile($"Office 365 {app} 注册表值已存在且无需更改"); - } - } - } - } - catch (Exception ex) - { - LogHelper.WriteLogToFile($"修改 {app} 注册表时出错: {ex.Message}", LogHelper.LogType.Error); - } - } - - // 尝试通过Office信任中心路径修改 - string trustCenterPath = "Software\\Microsoft\\Office\\16.0\\Common\\Security\\FileValidation"; - LogHelper.WriteLogToFile($"检查信任中心路径: {trustCenterPath}"); - - try - { - // 先检查是否存在该路径 - using (var baseKey = Registry.CurrentUser.OpenSubKey(trustCenterPath)) - { - // 如果路径存在,先备份 - if (baseKey != null) - { - string backupFile = Path.Combine(backupPath, $"SecurityBackup_365_TrustCenter_{DateTime.Now:yyyyMMddHHmmss}.reg"); - LogHelper.WriteLogToFile($"创建信任中心备份文件: {backupFile}"); - - // 使用UTF8编码写入注册表文件 - using (StreamWriter sw = new StreamWriter(backupFile, false, Encoding.UTF8)) - { - sw.WriteLine("Windows Registry Editor Version 5.00\n"); - sw.WriteLine(); - sw.WriteLine($"[{Registry.CurrentUser.Name}\\{trustCenterPath}]"); - - foreach (string valueName in baseKey.GetValueNames()) - { - object value = baseKey.GetValue(valueName); - sw.WriteLine($"\"{valueName}\"=dword:{((int)value):x8}"); - LogHelper.WriteLogToFile($"备份信任中心注册表值: {valueName} = {value}"); - } - } - } - } - - using (var key = Registry.CurrentUser.CreateSubKey(trustCenterPath, true)) - { - if (key != null) - { - key.SetValue("DisableEditFromPV", 1, RegistryValueKind.DWord); - LogHelper.WriteLogToFile("已禁用受保护视图中的编辑"); - } - } - } - catch (Exception ex) - { - LogHelper.WriteLogToFile($"修改信任中心路径时出错: {ex.Message}", LogHelper.LogType.Error); - } - - // 尝试修改EnableEditWhileViewingPolicy - string policyPath = "Software\\Policies\\Microsoft\\Office\\16.0\\Common\\Security"; - try - { - // 先检查是否存在该路径 - using (var baseKey = Registry.CurrentUser.OpenSubKey(policyPath)) - { - // 如果路径存在,先备份 - if (baseKey != null) - { - string backupFile = Path.Combine(backupPath, $"SecurityBackup_365_Policy_{DateTime.Now:yyyyMMddHHmmss}.reg"); - LogHelper.WriteLogToFile($"创建策略备份文件: {backupFile}"); - - // 使用UTF8编码写入注册表文件 - using (StreamWriter sw = new StreamWriter(backupFile, false, Encoding.UTF8)) - { - sw.WriteLine("Windows Registry Editor Version 5.00\n"); - sw.WriteLine(); - sw.WriteLine($"[{Registry.CurrentUser.Name}\\{policyPath}]"); - - foreach (string valueName in baseKey.GetValueNames()) - { - object value = baseKey.GetValue(valueName); - sw.WriteLine($"\"{valueName}\"=dword:{((int)value):x8}"); - LogHelper.WriteLogToFile($"备份策略注册表值: {valueName} = {value}"); - } - } - } - } - - using (var key = Registry.CurrentUser.CreateSubKey(policyPath, true)) - { - if (key != null) - { - key.SetValue("EnableEditWhileViewingPolicy", 1, RegistryValueKind.DWord); - LogHelper.WriteLogToFile("已启用查看时编辑策略"); - } - } - } - catch (Exception ex) - { - LogHelper.WriteLogToFile($"修改策略路径时出错: {ex.Message}", LogHelper.LogType.Error); - } - } - catch (Exception ex) - { - LogHelper.WriteLogToFile($"修改Office 365注册表时发生未知错误: {ex.Message}", LogHelper.LogType.Error); - } - } } }