From 4eb443e5479079234b7f042e8a31765325e4d0ab Mon Sep 17 00:00:00 2001
From: 2dust <31833384+2dust@users.noreply.github.com>
Date: Sun, 13 Oct 2024 20:15:43 +0800
Subject: [PATCH] Bug fix for IsAdministrator

This reverts commit 7618f9f7d46ff85747ea67bd7213cf8f218d05e0.
---
 v2rayN/ServiceLib/Handler/AppHandler.cs            | 14 ++++++++++++++
 v2rayN/ServiceLib/ViewModels/StatusBarViewModel.cs |  7 ++-----
 v2rayN/v2rayN.Desktop/Views/MainWindow.axaml.cs    |  2 +-
 v2rayN/v2rayN/Views/MainWindow.xaml.cs             |  2 +-
 4 files changed, 18 insertions(+), 7 deletions(-)

diff --git a/v2rayN/ServiceLib/Handler/AppHandler.cs b/v2rayN/ServiceLib/Handler/AppHandler.cs
index bf3cb420..5f6ab3af 100644
--- a/v2rayN/ServiceLib/Handler/AppHandler.cs
+++ b/v2rayN/ServiceLib/Handler/AppHandler.cs
@@ -2,11 +2,14 @@
 {
     public sealed class AppHandler
     {
+        #region Property
+
         private static readonly Lazy<AppHandler> _instance = new(() => new());
         private Config _config;
         private int? _statePort;
         private int? _statePort2;
         private Job? _processJob;
+        private bool? _isAdministrator;
         public static AppHandler Instance => _instance.Value;
         public Config Config => _config;
 
@@ -28,6 +31,17 @@
             }
         }
 
+        public bool IsAdministrator
+        {
+            get
+            {
+                _isAdministrator ??= Utils.IsAdministrator();
+                return _isAdministrator.Value;
+            }
+        }
+
+        #endregion Property
+
         #region Init
 
         public AppHandler()
diff --git a/v2rayN/ServiceLib/ViewModels/StatusBarViewModel.cs b/v2rayN/ServiceLib/ViewModels/StatusBarViewModel.cs
index c76198f2..eba1ce1e 100644
--- a/v2rayN/ServiceLib/ViewModels/StatusBarViewModel.cs
+++ b/v2rayN/ServiceLib/ViewModels/StatusBarViewModel.cs
@@ -10,8 +10,6 @@ namespace ServiceLib.ViewModels
 {
     public class StatusBarViewModel : MyReactiveObject
     {
-        private bool _isAdministrator { get; set; }
-
         #region ObservableCollection
 
         private IObservableCollection<RoutingItem> _routingItems = new ObservableCollectionExtended<RoutingItem>();
@@ -119,8 +117,7 @@ namespace ServiceLib.ViewModels
             SelectedRouting = new();
             SelectedServer = new();
 
-            _isAdministrator = Utils.IsAdministrator();
-            if (_config.tunModeItem.enableTun && _isAdministrator)
+            if (_config.tunModeItem.enableTun && AppHandler.Instance.IsAdministrator)
             {
                 EnableTun = true;
             }
@@ -414,7 +411,7 @@ namespace ServiceLib.ViewModels
             {
                 _config.tunModeItem.enableTun = EnableTun;
                 // When running as a non-administrator, reboot to administrator mode
-                if (EnableTun && !_isAdministrator)
+                if (EnableTun && !AppHandler.Instance.IsAdministrator)
                 {
                     _config.tunModeItem.enableTun = false;
                     Locator.Current.GetService<MainWindowViewModel>()?.RebootAsAdmin();
diff --git a/v2rayN/v2rayN.Desktop/Views/MainWindow.axaml.cs b/v2rayN/v2rayN.Desktop/Views/MainWindow.axaml.cs
index 83933ef7..17810f94 100644
--- a/v2rayN/v2rayN.Desktop/Views/MainWindow.axaml.cs
+++ b/v2rayN/v2rayN.Desktop/Views/MainWindow.axaml.cs
@@ -103,7 +103,7 @@ namespace v2rayN.Desktop.Views
                 }
             });
 
-            this.Title = $"{Utils.GetVersion()} - {(Utils.IsAdministrator() ? ResUI.RunAsAdmin : ResUI.NotRunAsAdmin)}";
+            this.Title = $"{Utils.GetVersion()} - {(AppHandler.Instance.IsAdministrator ? ResUI.RunAsAdmin : ResUI.NotRunAsAdmin)}";
             if (Utils.IsWindows())
             {
                 menuGlobalHotkeySetting.IsVisible = false;
diff --git a/v2rayN/v2rayN/Views/MainWindow.xaml.cs b/v2rayN/v2rayN/Views/MainWindow.xaml.cs
index c9be54e9..2f45c2e3 100644
--- a/v2rayN/v2rayN/Views/MainWindow.xaml.cs
+++ b/v2rayN/v2rayN/Views/MainWindow.xaml.cs
@@ -122,7 +122,7 @@ namespace v2rayN.Views
                 }
             });
 
-            this.Title = $"{Utils.GetVersion()} - {(Utils.IsAdministrator() ? ResUI.RunAsAdmin : ResUI.NotRunAsAdmin)}";
+            this.Title = $"{Utils.GetVersion()} - {(AppHandler.Instance.IsAdministrator ? ResUI.RunAsAdmin : ResUI.NotRunAsAdmin)}";
 
             if (!_config.guiItem.enableHWA)
             {