diff --git a/src/main/core/manager.ts b/src/main/core/manager.ts index 2b9c581..e637430 100644 --- a/src/main/core/manager.ts +++ b/src/main/core/manager.ts @@ -350,14 +350,14 @@ export async function checkAdminPrivileges(): Promise { } } -export async function restartAsAdmin(): Promise { +export async function restartAsAdmin(addTunFlag = true): Promise { if (process.platform !== 'win32') { throw new Error('This function is only available on Windows') } const exePath = process.execPath const args = process.argv.slice(1) - const restartArgs = [...args, '--admin-restart-for-tun'] + const restartArgs = addTunFlag ? [...args, '--admin-restart-for-tun'] : args.filter(arg => arg !== '--admin-restart-for-tun') try { // 处理路径和参数的引号 @@ -371,7 +371,10 @@ export async function restartAsAdmin(): Promise { command = `powershell -Command "Start-Process -FilePath '${escapedExePath}' -Verb RunAs"` } - await managerLogger.info('Restarting as administrator with command', command) + const logMessage = addTunFlag + ? 'Restarting as administrator for TUN mode with command' + : 'Restarting as normal user from high privilege detection with command' + await managerLogger.info(logMessage, command) // 执行PowerShell命令 exec(command, { windowsHide: true }, async (error, _stdout, stderr) => { @@ -453,11 +456,56 @@ export async function checkAdminRestartForTun(): Promise { await managerLogger.error('Failed to auto-enable TUN after admin restart', error) } } else { + await checkHighPrivilegeCore() // 检查TUN配置与权限的匹配 await validateTunPermissionsOnStartup() } } +export async function checkHighPrivilegeCore(): Promise { + try { + // 在 Win 平台检查 + if (process.platform !== 'win32') { + return + } + + const hasAdminPrivileges = await checkAdminPrivileges() + if (hasAdminPrivileges) { + await managerLogger.info('Detected high privilege core startup, showing dialog...') + + const { dialog, app } = await import('electron') + const { t } = await import('i18next') + + // 对话框 + const result = await dialog.showMessageBox({ + type: 'warning', + title: t('tun.permissions.highPrivilegeDetected.title'), + message: t('tun.permissions.highPrivilegeDetected.message'), + detail: t('tun.permissions.highPrivilegeDetected.detail'), + buttons: [ + t('tun.permissions.highPrivilegeDetected.restart'), + t('tun.permissions.highPrivilegeDetected.exit') + ], + defaultId: 0, + cancelId: 1, + noLink: true + }) + + if (result.response === 0) { + await managerLogger.info('User confirmed restart as normal user') + await restartAsAdmin(false) + } else { + await managerLogger.info('User cancelled, exiting application') + app.quit() + } + } + } catch (error) { + await managerLogger.error('Failed to check high privilege core', error) + } +} + + + export async function validateTunPermissionsOnStartup(): Promise { try { const { tun } = await getControledMihomoConfig() diff --git a/src/renderer/src/locales/en-US.json b/src/renderer/src/locales/en-US.json index d1564ef..18cb0fd 100644 --- a/src/renderer/src/locales/en-US.json +++ b/src/renderer/src/locales/en-US.json @@ -323,6 +323,11 @@ "tun.permissions.windowsRestart": "On Windows, you need to restart the application as administrator to use TUN mode", "tun.permissions.requesting": "Requesting administrator privileges, please click 'Yes' in the UAC dialog...", "tun.permissions.restarting": "Restarting application with administrator privileges, please click 'Yes' in the UAC dialog...", + "tun.permissions.highPrivilegeDetected.title": "High Privilege Core Detected", + "tun.permissions.highPrivilegeDetected.message": "Application is running with administrator privileges", + "tun.permissions.highPrivilegeDetected.detail": "About to restart the application in administrator mode. Restart now?", + "tun.permissions.highPrivilegeDetected.restart": "Restart", + "tun.permissions.highPrivilegeDetected.exit": "Exit Application", "dns.title": "DNS Settings", "dns.enable": "Enable DNS", "dns.enhancedMode.title": "Domain Mapping Mode", diff --git a/src/renderer/src/locales/fa-IR.json b/src/renderer/src/locales/fa-IR.json index 3ccee90..80f8518 100644 --- a/src/renderer/src/locales/fa-IR.json +++ b/src/renderer/src/locales/fa-IR.json @@ -307,6 +307,16 @@ "tun.notifications.coreAuthSuccess": "مجوزدهی به هسته با موفقیت انجام شد", "tun.notifications.firewallResetSuccess": "بازنشانی دیوار آتش با موفقیت انجام شد", "tun.error.tunPermissionDenied": "راه‌اندازی رابط TUN با شکست مواجه شد، لطفا به صورت دستی به هسته مجوز دهید", + "tun.permissions.required": "حالت TUN نیاز به مجوزهای مدیر دارد. آیا اکنون برنامه را مجدداً راه‌اندازی کنیم تا مجوزها را دریافت کنیم؟", + "tun.permissions.failed": "مجوزدهی با شکست مواجه شد", + "tun.permissions.windowsRestart": "در ویندوز، برای استفاده از حالت TUN باید برنامه را به عنوان مدیر مجدداً راه‌اندازی کنید", + "tun.permissions.requesting": "درخواست مجوزهای مدیر، لطفا در دیالوگ UAC روی 'بله' کلیک کنید...", + "tun.permissions.restarting": "راه‌اندازی مجدد برنامه با مجوزهای مدیر، لطفا در دیالوگ UAC روی 'بله' کلیک کنید...", + "tun.permissions.highPrivilegeDetected.title": "هسته با مجوزهای بالا شناسایی شد", + "tun.permissions.highPrivilegeDetected.message": "برنامه با مجوزهای مدیر در حال اجرا است", + "tun.permissions.highPrivilegeDetected.detail": "برنامه در حالت مدیر سیستم دوباره راه‌اندازی خواهد شد. آیا می‌خواهید اکنون راه‌اندازی مجدد شود؟", + "tun.permissions.highPrivilegeDetected.restart": "راه‌اندازی مجدد", + "tun.permissions.highPrivilegeDetected.exit": "خروج از برنامه", "dns.title": "تنظیمات DNS", "dns.enable": "فعال‌سازی DNS", "dns.enhancedMode.title": "حالت نگاشت دامنه", diff --git a/src/renderer/src/locales/ru-RU.json b/src/renderer/src/locales/ru-RU.json index 84bb8bb..ef23b61 100644 --- a/src/renderer/src/locales/ru-RU.json +++ b/src/renderer/src/locales/ru-RU.json @@ -307,6 +307,16 @@ "tun.notifications.coreAuthSuccess": "Авторизация ядра успешна", "tun.notifications.firewallResetSuccess": "Брандмауэр успешно сброшен", "tun.error.tunPermissionDenied": "Ошибка запуска TUN, попробуйте вручную предоставить разрешения ядру", + "tun.permissions.required": "Режим TUN требует прав администратора. Перезапустить приложение сейчас для получения разрешений?", + "tun.permissions.failed": "Ошибка авторизации разрешений", + "tun.permissions.windowsRestart": "В Windows необходимо перезапустить приложение от имени администратора для использования режима TUN", + "tun.permissions.requesting": "Запрос прав администратора, пожалуйста, нажмите 'Да' в диалоге UAC...", + "tun.permissions.restarting": "Перезапуск приложения с правами администратора, пожалуйста, нажмите 'Да' в диалоге UAC...", + "tun.permissions.highPrivilegeDetected.title": "Обнаружено ядро с высокими привилегиями", + "tun.permissions.highPrivilegeDetected.message": "Приложение работает с правами администратора", + "tun.permissions.highPrivilegeDetected.detail": "Сейчас приложение будет перезапущено в режиме администратора. Перезапустить сейчас?", + "tun.permissions.highPrivilegeDetected.restart": "Перезапустить", + "tun.permissions.highPrivilegeDetected.exit": "Выйти из приложения", "dns.title": "Настройки DNS", "dns.enable": "Включить DNS", "dns.enhancedMode.title": "Режим маппинга доменов", diff --git a/src/renderer/src/locales/zh-CN.json b/src/renderer/src/locales/zh-CN.json index e3513ba..c1f4518 100644 --- a/src/renderer/src/locales/zh-CN.json +++ b/src/renderer/src/locales/zh-CN.json @@ -323,6 +323,11 @@ "tun.permissions.windowsRestart": "Windows下需要以管理员身份重新启动应用才能使用TUN模式", "tun.permissions.requesting": "正在请求管理员权限,请在UAC对话框中点击'是'...", "tun.permissions.restarting": "正在以管理员权限重启应用,请在UAC对话框中点击'是'...", + "tun.permissions.highPrivilegeDetected.title": "检测到高权限内核", + "tun.permissions.highPrivilegeDetected.message": "应用正在以管理员权限运行", + "tun.permissions.highPrivilegeDetected.detail": "即将以管理员模式重启应用,现在重新启动吗?", + "tun.permissions.highPrivilegeDetected.restart": "重新启动", + "tun.permissions.highPrivilegeDetected.exit": "退出应用", "dns.title": "DNS 设置", "dns.enable": "启用 DNS", "dns.enhancedMode.title": "域名映射模式",