系统开启UAC情形下开机自启动程序如何以管理员权限启动
系统开启UAC情形下开机自启动程序如何以管理员权限启动
题记:本文阐述的是在Windows系统开启UAC的情况下,开机自启动程序需要以管理员权限启动,
系统弹出UAC对话框,用户同意的情形下启动程序
处理步骤:
1.判断Windows系统版本(Windows XP以上系统才有UAC,不包括Windows XP);若系统版本高于Windows XP,则执行步骤2;
2.判断系统是否开启UAC;若开启,则执行步骤3;
3.判断进程当前是否是以管理员权限启动;若不是管理员权限,则执行步骤4;
4.以特殊参数调用ShellExecuteEx函数,重新启动进程。
以下为参考代码:
//判断进程是否以管理员身份运行
bool isProcessRunAsAdmin()
{
SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
PSID AdministratorsGroup;
BOOL b = AllocateAndInitializeSid(
&NtAuthority,
2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0,
&AdministratorsGroup);
if (b) {
CheckTokenMembership(NULL, AdministratorsGroup, &b);
FreeSid(AdministratorsGroup);
}
return b == TRUE;
}
//main函数
int main(int argc, char* argv[])
{
//任何对文件的操作在这里都不允许,不然会导致进程启动失败
OSVERSIONINFO osvi;
ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&osvi);
if (5 < osvi.dwMajorVersion) {
std::wstring wstrValue;
//以下函数为查询注册表,读者可自行实现
int iReturn = CUtility::queryRegValue(HKEY_LOCAL_MACHINE, L"Software\\Microsoft
\\Windows\\CurrentVersion\\Policies\\System", L"EnableLUA", wstrValue);
if (Success == iReturn) {
if (1 == *(int*)wstrValue.c_str() && false == isProcessRunAsAdmin()) {
wchar_t szPath[MAX_PATH] = {0};
GetModuleFileName(NULL, szPath, MAX_PATH);
std::wcout << szPath << std::endl;
std::wstring wstrParams;
for (int i = 1; i < argc; ++i) {
for (int j = 0; j < std::strlen(argv[i]); ++j) {
wstrParams.push_back(static_cast<wchar_t>(argv[i][j]));
}
}
SHELLEXECUTEINFO sei = {0};
sei.cbSize = sizeof(SHELLEXECUTEINFOW);
sei.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI;
sei.lpFile = szPath;
sei.lpParameters = wstrParams.c_str();
sei.nShow = SW_SHOW;
sei.lpVerb = TEXT("runas");
sei.lpDirectory = NULL;
BOOL iRet = ShellExecuteEx(&sei);
if (TRUE != iRet) {
fprintf(stdout, "ShellExecuteEx Failure. Error Code is : %d", GetLastError());
}
return 0;
}
} else {
return 0;
}
}
//接下来为程序正常处理逻辑
}
系统开启UAC情形下开机自启动程序如何以管理员权限启动的更多相关文章
- .net core程序强制以管理员权限启动
当我们编写windows程序的时候,很多时候需要程序默认以管理员权限运行,以前在.net 程序中直接新建一个app.manifest,设置requestedExecutionLevel 节点即可 &l ...
- Android开机自启动程序
背景知识:当Android启动时,会发出一个系统广播,内容为ACTION_BOOT_COMPLETED,它的字符串常量表示为 android.intent.action.BOOT_COMPLETED. ...
- Inno Setup打包的程序提升为管理员权限
Inno Setup打包的程序在Win7 64位系统上安装,安装步骤最后一步若选中运行程序,会跳出一个错误提示框. 这是因为64位win7系统运行程序时需要管理员权限,而打包的文件并没有这个权限就试图 ...
- 【程序打包工具 Inno Setup】CreateProcess 失败:代码 740(Inno Setup打包的程序提升为管理员权限)
原文参考 https://www.cnblogs.com/SnailProgramer/p/4243666.html http://blog.csdn.net/x356982611/article/d ...
- Vista之前的版本,默认本地登陆用户都以管理员权限启动程序
Vista之前的版本,默认本地登陆用户都以管理员权限启动程序,之后的OS版本默认都没有管理员权限,需要用户提权才能做某些操作,否则需要管理员权限的操作都会失败MSSQL是用户名账号连接,Socket方 ...
- Inno Setup CreateProcess 失败:代码 740(Inno Setup打包的程序提升为管理员权限)
原文参考 https://www.cnblogs.com/SnailProgramer/p/4243666.html http://blog.csdn.net/x356982611/article/d ...
- C# 程序默认使用管理员权限(转载)
1.从A程序启动B程序,当B程序需要管理员权限的时候代码如下 A程序里面启动B程序的代码如下 ProcessStartInfo startInfo = new ProcessStartInfo(); ...
- VS2019如何设置程序以管理员权限启动
最重要的一点.本文解释的是C#项目如何以管理员权限启动. 一个很大的误导项 该图片是C++程序的项目配置属性.C#项目中并找不到.然而网上的很多教程没有说清楚.导致我找了这个菜单找了很久. C#项目的 ...
- Win8.1开机自启动程序
动机: 开机自启动goagent与锐捷 问题: goagent没有自启动选项;锐捷开启"登录后启动"却一直没有启动 解决方案: 使用计划任务启动goagent+彻底关闭UAC使锐捷 ...
随机推荐
- 54、Spark Streaming:DStream的transformation操作概览
一. transformation操作概览 Transformation Meaning map 对传入的每个元素,返回一个新的元素 flatMap 对传入的每个元素,返回一个或多个元素 filter ...
- SSH框架整合1
======================web.xml======================= <?xml version="1.0" encoding=" ...
- hdoj - 1864 最大报销额
Problem Description 现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具(B类).差旅(C类),要求每张发票的总额不得超过1000元,每张发票上,单项物品 ...
- 【Django】Django项目结构与单元测试
学校的软工项目要开发一个网站,自然的想到用python+Django来做.由于之前没有用Django开发过大型的网站项目,所以遇到了一些问题.记录在此,便于以后查阅. 今天完成了项目结构的设计.部分的 ...
- Predictive Analysis in Network Function Virtualization
摘要 网络功能虚拟化(NFV)体系结构的最新部署获得了极大的关注.虚拟化虽然带来了诸如降低成本和简化网络功能部署之类的好处,但它增加了附加层,从而降低了较低层故障的透明度.为了改善虚拟网络功能(VNF ...
- RedHat离线安装Python3以及各种依赖
RedHat离线安装Python3以及各种依赖 1, yum install -y ncurses-libs zlib-devel mysql-devel bzip2-devel openssl-de ...
- VMware7.1安装教程
VMWare是一个"虚拟PC"软件公司.它的产品可以使你在一台机器上同时运行二个或更多Windows.DOS.LINUX系 统.与"多启动"系统相比,VMWar ...
- linux学习(3):linux常用命令大全
Linux常用命令大全(非常全!!!) 最近都在和Linux打交道,感觉还不错.我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制,当然,这也是很多人喜欢linux的原因,比较短 ...
- Sword libcurl库CURLE_COULDNT_CONNECT错误
CURL: CURLE_COULDNT_CONNECT问题分析 测试环境描述在使用libcurl写http客户端进行压力测试的时候会遇到curl_easy_perform()返回CURLE_COULD ...
- Bladex-Boot使用Postman调用服务说明
一:GitBladex-Boot项目,并启动服务 二:打开Postman 三:使用Post,调用http://localhost/blade-auth/oauth/token/ 配置:Header中增 ...