admin 1 year ago
parent
commit
c5cf151c0d

+ 21 - 3
example/lib/main.dart

@@ -1,3 +1,5 @@
+import 'dart:ffi';
+
 import 'package:flutter/material.dart';
 import 'dart:async';
 
@@ -18,6 +20,7 @@ class MyApp extends StatefulWidget {
 class _MyAppState extends State<MyApp> {
   String _platformVersion = 'Unknown';
   String _isRunAdminEerr = 'Unknown';
+  String _isAdmin = 'no';
   final _wlBaseHelpPlugin = WlBaseHelp();
 
   @override
@@ -48,7 +51,7 @@ class _MyAppState extends State<MyApp> {
     });
   }
 
-  Future<void> onIsRunAdmin() async {
+  Future<void> onRunAdmin() async {
     String isRunadminErore;
     try {
       isRunadminErore = await _wlBaseHelpPlugin.runAsAdministrator() ?? 'error';
@@ -60,7 +63,19 @@ class _MyAppState extends State<MyApp> {
     });
   }
 
-
+  Future<void> onIsRunAdmin() async {
+    bool isAdmin;
+    try {
+      isAdmin = await _wlBaseHelpPlugin.isRunningAsAdmin() ?? false;
+    } on PlatformException {
+      isAdmin = false;
+      _isAdmin = 'error';
+      setState(() {} );
+    }
+    setState(() {
+      _isAdmin = isAdmin ? 'yes' : 'no';
+    });
+  }
   @override
   Widget build(BuildContext context) {
     return MaterialApp(
@@ -77,7 +92,10 @@ class _MyAppState extends State<MyApp> {
               ),
               // Text('Running on: $_isRunAdminEerr\n'),
               ElevatedButton(
-                  onPressed: onIsRunAdmin, child: const Text("管理员重启")),
+                  onPressed: onRunAdmin, child: const Text("管理员重启")),
+
+              ElevatedButton(
+                  onPressed: onIsRunAdmin, child: Text(_isAdmin)),
             ],
           ),
         ),

+ 17 - 17
example/pubspec.lock

@@ -37,10 +37,10 @@ packages:
     dependency: transitive
     description:
       name: collection
-      sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687
+      sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
       url: "https://pub.dev"
     source: hosted
-    version: "1.17.2"
+    version: "1.18.0"
   cupertino_icons:
     dependency: "direct main"
     description:
@@ -126,10 +126,10 @@ packages:
     dependency: transitive
     description:
       name: meta
-      sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3"
+      sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e
       url: "https://pub.dev"
     source: hosted
-    version: "1.9.1"
+    version: "1.10.0"
   path:
     dependency: transitive
     description:
@@ -142,10 +142,10 @@ packages:
     dependency: transitive
     description:
       name: platform
-      sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76"
+      sha256: ae68c7bfcd7383af3629daafb32fb4e8681c7154428da4febcff06200585f102
       url: "https://pub.dev"
     source: hosted
-    version: "3.1.0"
+    version: "3.1.2"
   plugin_platform_interface:
     dependency: transitive
     description:
@@ -179,18 +179,18 @@ packages:
     dependency: transitive
     description:
       name: stack_trace
-      sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5
+      sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
       url: "https://pub.dev"
     source: hosted
-    version: "1.11.0"
+    version: "1.11.1"
   stream_channel:
     dependency: transitive
     description:
       name: stream_channel
-      sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8"
+      sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
       url: "https://pub.dev"
     source: hosted
-    version: "2.1.1"
+    version: "2.1.2"
   string_scanner:
     dependency: transitive
     description:
@@ -219,10 +219,10 @@ packages:
     dependency: transitive
     description:
       name: test_api
-      sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8"
+      sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b"
       url: "https://pub.dev"
     source: hosted
-    version: "0.6.0"
+    version: "0.6.1"
   vector_math:
     dependency: transitive
     description:
@@ -235,18 +235,18 @@ packages:
     dependency: transitive
     description:
       name: vm_service
-      sha256: c620a6f783fa22436da68e42db7ebbf18b8c44b9a46ab911f666ff09ffd9153f
+      sha256: c538be99af830f478718b51630ec1b6bee5e74e52c8a802d328d9e71d35d2583
       url: "https://pub.dev"
     source: hosted
-    version: "11.7.1"
+    version: "11.10.0"
   web:
     dependency: transitive
     description:
       name: web
-      sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10
+      sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152
       url: "https://pub.dev"
     source: hosted
-    version: "0.1.4-beta"
+    version: "0.3.0"
   webdriver:
     dependency: transitive
     description:
@@ -263,5 +263,5 @@ packages:
     source: path
     version: "0.0.1"
 sdks:
-  dart: ">=3.1.3 <4.0.0"
+  dart: ">=3.2.0-194.0.dev <4.0.0"
   flutter: ">=3.3.0"

+ 6 - 1
example/windows/flutter/CMakeLists.txt

@@ -10,6 +10,11 @@ include(${EPHEMERAL_DIR}/generated_config.cmake)
 # https://github.com/flutter/flutter/issues/57146.
 set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper")
 
+# Set fallback configurations for older versions of the flutter tool.
+if (NOT DEFINED FLUTTER_TARGET_PLATFORM)
+  set(FLUTTER_TARGET_PLATFORM "windows-x64")
+endif()
+
 # === Flutter Library ===
 set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll")
 
@@ -92,7 +97,7 @@ add_custom_command(
   COMMAND ${CMAKE_COMMAND} -E env
     ${FLUTTER_TOOL_ENVIRONMENT}
     "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat"
-      windows-x64 $<CONFIG>
+      ${FLUTTER_TARGET_PLATFORM} $<CONFIG>
   VERBATIM
 )
 add_custom_target(flutter_assemble DEPENDS

+ 4 - 0
lib/wl_base_help.dart

@@ -9,4 +9,8 @@ class WlBaseHelp {
   Future<String?> runAsAdministrator() {
     return WlBaseHelpPlatform.instance.runAsAdministrator();
   }
+
+  Future<bool?> isRunningAsAdmin() {
+    return WlBaseHelpPlatform.instance.isRunningAsAdmin();
+  }
 }

+ 7 - 0
lib/wl_base_help_method_channel.dart

@@ -24,4 +24,11 @@ class MethodChannelWlBaseHelp extends WlBaseHelpPlatform {
       return e.code;
     }
   }
+  @override
+  Future<bool?> isRunningAsAdmin() async {
+    final isAdmin = await methodChannel.invokeMethod<bool>('isRunningAsAdmin');
+    return isAdmin;
+  }
+
+
 }

+ 4 - 0
lib/wl_base_help_platform_interface.dart

@@ -30,4 +30,8 @@ abstract class WlBaseHelpPlatform extends PlatformInterface {
   Future<String?> runAsAdministrator() async {
     throw UnimplementedError('runAsAdministrator() has not been implemented.');
   }
+
+  Future<bool?> isRunningAsAdmin() async {
+    throw UnimplementedError('runAsAdministrator() has not been implemented.');
+  }
 }

+ 6 - 0
test/wl_base_help_test.dart

@@ -16,6 +16,12 @@ class MockWlBaseHelpPlatform
     // TODO: implement runAsAdministrator
     throw UnimplementedError();
   }
+
+  @override
+  Future<bool?> isRunningAsAdmin() {
+    // TODO: implement isRunningAsAdmin
+    throw UnimplementedError();
+  }
 }
 
 void main() {

+ 56 - 9
windows/wl_base_help_plugin.cpp

@@ -13,6 +13,33 @@
 #include <memory>
 #include <sstream>
 
+typedef LONG NTSTATUS, * PNTSTATUS;
+#define STATUS_SUCCESS (0x00000000)
+
+typedef NTSTATUS(WINAPI* RtlGetVersionPtr)(PRTL_OSVERSIONINFOW);
+
+RTL_OSVERSIONINFOW GetRealOSVersion() {
+    HMODULE hMod = ::GetModuleHandleW(L"ntdll.dll");
+    if (hMod) {
+        RtlGetVersionPtr fnRtlGetVersion = (RtlGetVersionPtr)::GetProcAddress(hMod, "RtlGetVersion");
+        if (fnRtlGetVersion != nullptr) {
+            RTL_OSVERSIONINFOW rovi = { 0 };
+            rovi.dwOSVersionInfoSize = sizeof(rovi);
+            if (STATUS_SUCCESS == fnRtlGetVersion(&rovi)) {
+                return rovi;
+            }
+        }
+    }
+    RTL_OSVERSIONINFOW rovi = { 0 };
+    return rovi;
+}
+
+bool IsWindows11OrGreater() {
+    RTL_OSVERSIONINFOW rovi = GetRealOSVersion();
+    return (rovi.dwMajorVersion > 10) ||
+        (rovi.dwMajorVersion == 10 && rovi.dwBuildNumber >= 22000);
+}
+
 namespace wl_base_help {
 
 // static
@@ -38,18 +65,25 @@ WlBaseHelpPlugin::WlBaseHelpPlugin(flutter::PluginRegistrarWindows* registrar) :
 WlBaseHelpPlugin::~WlBaseHelpPlugin() {}
 
 void WlBaseHelpPlugin::HandleMethodCall(
-    const flutter::MethodCall<flutter::EncodableValue> &method_call,
+    const flutter::MethodCall<flutter::EncodableValue>& method_call,
     std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
-  if (method_call.method_name().compare("runAsAdministrator") == 0) {
-    HWND hwnd = GetMainWindow();
-    // 调用您的提权逻辑,传递 hwnd
-    TryRunAsAdmin(hwnd, result);
+    if (method_call.method_name().compare("runAsAdministrator") == 0) {
+        HWND hwnd = GetMainWindow();
+        // 调用您的提权逻辑,传递 hwnd
+        TryRunAsAdmin(hwnd, result);
 
-    //result->Success(flutter::EncodableValue(true));
-  } else if (method_call.method_name().compare("getPlatformVersion") == 0) {
+        //result->Success(flutter::EncodableValue(true));
+    }
+    else if (method_call.method_name().compare("isRunningAsAdmin") == 0) {
+        bool isAdmin = IsRunningAsAdmin();
+        result->Success(flutter::EncodableValue(isAdmin));
+    }
+    else if (method_call.method_name().compare("getPlatformVersion") == 0) {
     std::ostringstream version_stream;
     version_stream << "Windows ";
-    if (IsWindows10OrGreater()) {
+    if (IsWindows11OrGreater()) {
+        version_stream << "11+";
+    }else if (IsWindows10OrGreater()) {
       version_stream << "10+";
     } else if (IsWindows8OrGreater()) {
       version_stream << "8";
@@ -69,7 +103,20 @@ void WlBaseHelpPlugin::HandleMethodCall(
       return ::GetAncestor(windowHwnd, GA_ROOT);
     }
 
-
+    bool WlBaseHelpPlugin::IsRunningAsAdmin() {
+        BOOL isAdmin = FALSE;
+        PSID adminGroup = NULL;
+        SID_IDENTIFIER_AUTHORITY ntAuthority = SECURITY_NT_AUTHORITY;
+        if (AllocateAndInitializeSid(&ntAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID,
+            DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0,
+            &adminGroup)) {
+            if (!CheckTokenMembership(NULL, adminGroup, &isAdmin)) {
+                isAdmin = FALSE;
+            }
+            FreeSid(adminGroup);
+        }
+        return isAdmin != FALSE;
+    }
     void WlBaseHelpPlugin::TryRunAsAdmin(HWND hwnd,
                                          std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>>& result){
       wchar_t szPath[MAX_PATH];

+ 1 - 0
windows/wl_base_help_plugin.h

@@ -13,6 +13,7 @@ class WlBaseHelpPlugin : public flutter::Plugin {
     HWND windowHwnd;
 
     HWND GetMainWindow();
+    bool IsRunningAsAdmin();
     void TryRunAsAdmin(HWND hwnd,std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>>& result);
 
     static void RegisterWithRegistrar(flutter::PluginRegistrarWindows *registrar);