Flutter-Windows:让程序已管理员权限打开

1,311 阅读1分钟

实现步骤:

  1. 打开main.cpp($project\windows\runner\main.cpp)
  2. 在程序入口处定义两个方法
BOOL isRunAsAdmin();
void runAsAdmin();
  1. 实现isRunAsAdmin
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;
}

4.实现 runAsAdmin

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);
}

5.在wWinMain函数下使用

int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,
                      _In_ wchar_t *command_line, _In_ int show_command) {
   if (!isRunAsAdmin()) {
       runAsAdmin();
       exit(0);
   }
   ...
   ...
}