UAC(User Access Control)操作小结(C++)
这几天因为要监控office2013的安装进程,但是office2013安装程序在输入序列号之后,它会在用户的temp文件夹(临时文件夹)里生成一个新的安装程序,然后终止正在运行的安装程序,去启动temp文件夹里的安装程序。问题就出在启动temp文件夹的安装程序,它会跳UAC窗口,直接导致我根本无法直接对之后的安装程序进行监控。所以研究了一下如何操作UAC。下面我来说说我的研究小结。
首先来介绍一下UAC窗口的进程。UAC的进程名叫“consent.exe”,这个进程跟notepad一样也在system32目录下。每当有一个程序启动且权限不足时,都会在consent.exe进程下生成一个对应线程。
不过consent.exe进程和notepad.exe进程的访问权限不一样,如果你想访问以得到consent.exe进程的信息(如句柄,PID等),必须以管理员权限启动你的程序,才能访问它。否则无权对其访问。
接下来说说,如何绕过UAC(C++):
方法一:设置工程属性
工程属性的→链接器→文件清单→跳过UAC UI保护→是(uiAccess=true),这样设置以后,必须重新编译工程。而且当按下F5运行时,VS会提示必须以管理员模式运行,你选择了以管理员模式运行之后,VS会自动重启。当你再次按下F5运行时,VS报错了。VS提示说无法打开你编译好的exe程序,那是因为设置了uiAccess=true后,要求程序都必须以管理员模式运行。然后我们右击打开编译好的exe,选择属性,然后勾选管理员模式选项。之后再按下F5就可以正常运行程序,而起程序启动其它程序时,也不会再跳出UAC窗口了,当然前提是你必须让启动的程序继承权限。
方法二:采用ShellExecuteEx启动程序,并设置相应参数
ShellExecuteEx函数是微软在推出UAC后扩展的一个函数。这个函数的参数是结构体SHELLEXECUTEINFO。这个结构体有一个成员叫lpVerb,将其设置为“runas”。程序就可以跳过UAC,不过前提也是你的程序具有管理员权限。
代码如下:
// Initialize the structure.
SHELLEXECUTEINFO sei = { sizeof(SHELLEXECUTEINFO) };
// Ask for privileges elevation.
sei.lpVerb = TEXT("runas");
// Create a Command Prompt fromwhich you will be able to start
// other elevated applications.
sei.lpFile = TEXT("E:\\Program Files\\Microsoft Office\\Office15\\FIRSTRUN.EXE");
sei.lpParameters = TEXT("/OEMPIPC");
// Don't forget this parameter; otherwise, the window will be hidden.
sei.nShow = SW_SHOWNORMAL;
ShellExecuteEx(&sei);
除了以上2中方法之外,微软还提供3个类来操作UAC。这3个类是EnableUAC、UACExecutionLevel 和 UACUIAccess。
详见http://msdn.microsoft.com/zh-cn/library/bb384691.aspx