系统开启UAC情形下开机自启动程序如何以管理员权限启动

  1. 题记:本文阐述的是在Windows系统开启UAC的情况下,开机自启动程序需要以管理员权限启动,
  2. 系统弹出UAC对话框,用户同意的情形下启动程序

处理步骤:

  1. 1.判断Windows系统版本(Windows XP以上系统才有UAC,不包括Windows XP);若系统版本高于Windows XP,则执行步骤2
  2. 2.判断系统是否开启UAC;若开启,则执行步骤3
  3. 3.判断进程当前是否是以管理员权限启动;若不是管理员权限,则执行步骤4
  4. 4.以特殊参数调用ShellExecuteEx函数,重新启动进程。

以下为参考代码:

  1. //判断进程是否以管理员身份运行
  2. bool isProcessRunAsAdmin()
  3. {
  4. SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
  5. PSID AdministratorsGroup;
  6. BOOL b = AllocateAndInitializeSid(
  7. &NtAuthority,
  8. 2,
  9. SECURITY_BUILTIN_DOMAIN_RID,
  10. DOMAIN_ALIAS_RID_ADMINS,
  11. 0, 0, 0, 0, 0, 0,
  12. &AdministratorsGroup);
  13. if (b) {
  14. CheckTokenMembership(NULL, AdministratorsGroup, &b);
  15. FreeSid(AdministratorsGroup);
  16. }
  17. return b == TRUE;
  18. }
  19. //main函数
  20. int main(int argc, char* argv[])
  21. {
  22. //任何对文件的操作在这里都不允许,不然会导致进程启动失败
  23. OSVERSIONINFO osvi;
  24. ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
  25. osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  26. GetVersionEx(&osvi);
  27. if (5 < osvi.dwMajorVersion) {
  28. std::wstring wstrValue;
  29. //以下函数为查询注册表,读者可自行实现
  30. int iReturn = CUtility::queryRegValue(HKEY_LOCAL_MACHINE, L"Software\\Microsoft
  31. \\Windows\\CurrentVersion\\Policies\\System", L"EnableLUA", wstrValue);
  32. if (Success == iReturn) {
  33. if (1 == *(int*)wstrValue.c_str() && false == isProcessRunAsAdmin()) {
  34. wchar_t szPath[MAX_PATH] = {0};
  35. GetModuleFileName(NULL, szPath, MAX_PATH);
  36. std::wcout << szPath << std::endl;
  37. std::wstring wstrParams;
  38. for (int i = 1; i < argc; ++i) {
  39. for (int j = 0; j < std::strlen(argv[i]); ++j) {
  40. wstrParams.push_back(static_cast<wchar_t>(argv[i][j]));
  41. }
  42. }
  43. SHELLEXECUTEINFO sei = {0};
  44. sei.cbSize = sizeof(SHELLEXECUTEINFOW);
  45. sei.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI;
  46. sei.lpFile = szPath;
  47. sei.lpParameters = wstrParams.c_str();
  48. sei.nShow = SW_SHOW;
  49. sei.lpVerb = TEXT("runas");
  50. sei.lpDirectory = NULL;
  51. BOOL iRet = ShellExecuteEx(&sei);
  52. if (TRUE != iRet) {
  53. fprintf(stdout, "ShellExecuteEx Failure. Error Code is : %d", GetLastError());
  54. }
  55. return 0;
  56. }
  57. } else {
  58. return 0;
  59. }
  60. }
  61. //接下来为程序正常处理逻辑
  62. }

系统开启UAC情形下开机自启动程序如何以管理员权限启动的更多相关文章

  1. .net core程序强制以管理员权限启动

    当我们编写windows程序的时候,很多时候需要程序默认以管理员权限运行,以前在.net 程序中直接新建一个app.manifest,设置requestedExecutionLevel 节点即可 &l ...

  2. Android开机自启动程序

    背景知识:当Android启动时,会发出一个系统广播,内容为ACTION_BOOT_COMPLETED,它的字符串常量表示为 android.intent.action.BOOT_COMPLETED. ...

  3. Inno Setup打包的程序提升为管理员权限

    Inno Setup打包的程序在Win7 64位系统上安装,安装步骤最后一步若选中运行程序,会跳出一个错误提示框. 这是因为64位win7系统运行程序时需要管理员权限,而打包的文件并没有这个权限就试图 ...

  4. 【程序打包工具 Inno Setup】CreateProcess 失败:代码 740(Inno Setup打包的程序提升为管理员权限)

    原文参考 https://www.cnblogs.com/SnailProgramer/p/4243666.html http://blog.csdn.net/x356982611/article/d ...

  5. Vista之前的版本,默认本地登陆用户都以管理员权限启动程序

    Vista之前的版本,默认本地登陆用户都以管理员权限启动程序,之后的OS版本默认都没有管理员权限,需要用户提权才能做某些操作,否则需要管理员权限的操作都会失败MSSQL是用户名账号连接,Socket方 ...

  6. Inno Setup CreateProcess 失败:代码 740(Inno Setup打包的程序提升为管理员权限)

    原文参考 https://www.cnblogs.com/SnailProgramer/p/4243666.html http://blog.csdn.net/x356982611/article/d ...

  7. C# 程序默认使用管理员权限(转载)

    1.从A程序启动B程序,当B程序需要管理员权限的时候代码如下 A程序里面启动B程序的代码如下 ProcessStartInfo startInfo = new ProcessStartInfo(); ...

  8. VS2019如何设置程序以管理员权限启动

    最重要的一点.本文解释的是C#项目如何以管理员权限启动. 一个很大的误导项 该图片是C++程序的项目配置属性.C#项目中并找不到.然而网上的很多教程没有说清楚.导致我找了这个菜单找了很久. C#项目的 ...

  9. Win8.1开机自启动程序

    动机: 开机自启动goagent与锐捷 问题: goagent没有自启动选项;锐捷开启"登录后启动"却一直没有启动 解决方案: 使用计划任务启动goagent+彻底关闭UAC使锐捷 ...

随机推荐

  1. join 分割数组

    返回一个字符串.该字符串是通过把 arrayObject 的每个元素转换为字符串,然后把这些字符串连接起来,在两个元素之间插入 separator 字符串而生成的. separator可以传可以传,不 ...

  2. JAVA泛型知识--> <? extends T>和<? super T>

    <? extends T> 和 <? super T> 是Java泛型中的“通配符(Wildcards)” 和 “边界(Bounds)”的概念 <? extends T& ...

  3. sparkUI

    sparkUI 源码: https://www.cnblogs.com/barrenlake/p/4364644.html 页面介绍: https://blog.csdn.net/qq_2763977 ...

  4. 在mybatis中写sql语句的一些体会

    本文会使用一个案例,就mybatis的一些基础语法进行讲解.案例中使用到的数据库表和对象如下: article表:这个表存放的是文章的基础信息 -- ------------------------- ...

  5. 最近b站好像把blv格式换成m4s,改成mp4之后没有声音,

    我研究了几个小时,然后知道一个方法,但是必须有电脑.1.m4s 的视频改为mp4可以拖进pr2.m4s的音频不能直接拖进pr(会报错),改为mp3也一样,要先改为mp3,然后在格式工厂里面选择,mp3 ...

  6. docker 安装redis cluster集群

    安装Redis镜像 docker pull yyyyttttwwww/redis 创建redis容器 docker run -it -d --name r1 -p 5001:6379 --net=ne ...

  7. shell 判断一个字符串是否由字母数字组成

    摘自:http://blog.51cto.com/lynnteng0/804520 describe="it's a describe by yourself" if echo & ...

  8. ubuntu中cmake版本升级

    在网上下载一个项目,编译提示版本太低 CMake Error at CMakeLists.txt: (cmake_minimum_required): CMake 编译方式安装(需要openssl) ...

  9. eclipse :代码自动补全不生效解决办法

    参考文章:https://blog.csdn.net/qq_35033270/article/details/79285821 请见下图! 恢复缺省值即可!

  10. precommit那些事儿

    一.使用背景 我们有将 lint 命令添加进 npm scripts 中,但是很多人在提交代码时都会忘记或者没有习惯去执行检查,结果就是导致不符合规范的代码被上传到远端代码仓库. 二.问题分析 我们可 ...