alroyso 1 рік тому
батько
коміт
2276a05291
1 змінених файлів з 38 додано та 0 видалено
  1. 38 0
      windows/runner/main.cpp

+ 38 - 0
windows/runner/main.cpp

@@ -5,8 +5,46 @@
 #include "flutter_window.h"
 #include "utils.h"
 #include <protocol_handler/protocol_handler_plugin.h>
+
+BOOL isRunAsAdmin() {
+  BOOL isRunAsAdmin = FALSE;
+  HANDLE hToken = NULL;
+  if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))
+  {
+    return FALSE;
+  }
+  TOKEN_ELEVATION tokenEle;
+  DWORD dwRetLen = 0;
+  if (GetTokenInformation(hToken, TokenElevation, &tokenEle, sizeof(tokenEle), &dwRetLen))
+  {
+    if (dwRetLen == sizeof(tokenEle))
+    {
+      isRunAsAdmin = tokenEle.TokenIsElevated;
+    }
+  }
+  CloseHandle(hToken);
+  return isRunAsAdmin;
+}
+void runAsAdmin() {
+  WCHAR czFileName[1024] = { 0 };
+  GetModuleFileName(NULL, czFileName, _countof(czFileName) - 1);
+  SHELLEXECUTEINFO  EI;
+  memset(&EI, 0, sizeof(EI));
+  EI.cbSize = sizeof(SHELLEXECUTEINFO);
+  EI.lpVerb = TEXT("runas");
+  EI.fMask = 0x00000040;
+  EI.lpFile = czFileName;
+  EI.nShow = SW_SHOW;
+  ShellExecuteEx(&EI);
+}
+
 int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,
                       _In_ wchar_t *command_line, _In_ int show_command) {
+
+  if (!isRunAsAdmin()) {
+    runAsAdmin();
+    exit(0);
+  }
     if (wcsstr(command_line, L"--runas-admin") != NULL) {
 
     }