windows 为程序申请管理员权限
方法一:ShellExecuteEx, 头文件windows.h 依赖库Shell32.dll
此方法在程序中,为调用的外部程序申请管理员权限QByteArray appNameByte = appName.toUtf8(); QByteArray dirByte = QDir::toNativeSeparators(appPath).toUtf8(); SHELLEXECUTEINFO sei={sizeof(SHELLEXECUTEINFO)}; sei.fMask = SEE_MASK_NOCLOSEPROCESS; sei.lpVerb = TEXT("runas"); sei.lpFile = appNameByte.data(); sei.lpDirectory = dirByte.data(); sei.nShow = SW_SHOW; if(!ShellExecuteEx(&sei)) { DWORD dwStatus=GetLastError(); if(dwStatus==ERROR_CANCELLED) { printf("refused\n"); } else if(dwStatus==ERROR_FILE_NOT_FOUND) { printf("not found file\n"); } }
示例:
QString appfile = "C:\\test.exe";QString args = "arg1 arg2 arg3";//"runas" 以管理员权限启动程序,hProcess小于32表示程序启动失败HANDLE hProcess = ShellExecute( 0, L"runas", startCopyApp.utf16(), args.utf16(), NULL, SW_SHOWNORMAL );
方法二:在vs”Project”->”Property”->”Linker”->”Manifest File”->”UAC Execution Level”
这种在工程设置中进行的配置,将为该生成的应用程序申请管理员权限
说明:
虽然test.exe已经通过方法二
配置了需要管理员权限来启动,但是使用QProcess调用test.exe时,依然是没有以管理员权限启动,使用示例
的方法可以解决此问题。一定要注意\
要换成\\
,而且要防止路径中有空格
问题,appfile
和arg1
等一定要用""
包含起来 ShellExecute函数说明:
它的返回值是PROCESS_INFORMATION。 返回值可能有的错误如下: = 0 {内存不足} ERROR_FILE_NOT_FOUND = 2; {文件名错误} ERROR_PATH_NOT_FOUND = 3; {路径名错误} ERROR_BAD_FORMAT = 11; {EXE 文件无效} SE_ERR_SHARE = 26; {发生共享错误} SE_ERR_ASSOCINCOMPLETE = 27; {文件名不完全或无效} SE_ERR_DDETIMEOUT = 28; {超时} SE_ERR_DDEFAIL = 29; {DDE 事务失败} SE_ERR_DDEBUSY = 30; {正在处理其他 DDE 事务而不能完成该 DDE 事务} SE_ERR_NOASSOC = 31; {没有相关联的应用程序} //ShowCmd 参数可选值:SW_HIDE = 0; {隐藏} SW_SHOWNORMAL = 1; {用最近的大小和位置显示, 激活} SW_NORMAL = 1; {同 SW_SHOWNORMAL} SW_SHOWMINIMIZED = 2; {最小化, 激活} SW_SHOWMAXIMIZED = 3; {最大化, 激活} SW_MAXIMIZE = 3; {同 SW_SHOWMAXIMIZED} SW_SHOWNOACTIVATE = 4; {用最近的大小和位置显示, 不激活} SW_SHOW = 5; {同 SW_SHOWNORMAL} SW_MINIMIZE = 6; {最小化, 不激活} SW_SHOWMINNOACTIVE = 7; {同 SW_MINIMIZE} SW_SHOWNA = 8; {同 SW_SHOWNOACTIVATE} SW_RESTORE = 9; {同 SW_SHOWNORMAL} SW_SHOWDEFAULT = 10; {同 SW_SHOWNORMAL} SW_MAX = 10; {同 SW_SHOWNORMAL}