程序跳过UAC研究及实现思路(两种方法,现在可能都不行了)
网上很对跳过UAC资料都是说如果让UAC弹出窗体,并没有真正跳过弹窗,这里结合动态提权+计划任务实现真正意义上的跳过UAC弹窗,运行程序的时候可以不出现UAC窗体,并且程序还是以高权限运行。
vista及其以后系统多程序的安全进行了控制,经过允许的程序才能执行,但是每次运行程序都弹出UAC控制窗体很烦人,网上看了一些资料,大致归纳出两种方案:
方案一:程序自身具备高权限(win7下带有盾牌图标),通过一个低权限程序调用计划任务来调用程序自身,实现跳过UAC弹窗
方案二:程序自身是普通权限,通过运行时动态提升权限结合计划任务实现跳过UAC弹窗
两种方案都需要通过计划任务来实现,因为几乎任务权限很高,通过高权限的计划任务调用程序,就不会有UAC弹窗提示。
下面以方案二实现来说一下:
首先创建一个普通权限的进程,在进程初始化的时候进行判断,以对话框程序为例。代码如下:
- BOOL CSkipUACDemoApp::InitInstance()
- {
- if (IsEnableUAC() && !IsProcessRunAsAdmin())
- {
- BOOL bSkipUAC = FALSE;
- HINSTANCE hInstance = 0;
- if(bSkipUAC )//跳过
- {
- MessageBox(NULL,_T("跳过UAC"),_T("提示"),MB_OK);
- //跳过UAC弹窗关键部分,通过运行计划任务实现跳过UAC弹窗
- hInstance = ShellExecute(NULL,_T("open"),_T("schtasks.exe"),_T(" /run /TN \"SkipUAC\""),NULL,SW_HIDE);
- }
- if (!bSkipUAC || ((int)hInstance <= 32))
- {
- MessageBox(NULL,_T("进行提权操作"),_T("提示"),MB_OK);
- RunElevated(NULL,_T("进程全路径"));
- }
- return FALSE;
- }
- MessageBox(NULL,_T("高权限运行程序"),_T("提示"),MB_OK);
- //代码省略
- .......................................
- }
检查是否设置了UAC控制:IsEnableUAC() (忘记参考自哪里了,抱歉)
检查进程是否以高权限运行:IsProcessRunAsAdmin() 参考:http://blog.csdn.net/just_fancy/article/details/6310347
动态提升权限:RunElevated() 参考:http://blog.csdn.net/jehnjehn/article/details/7564548
其中,计划任务需要提前创建,名称SkipUAC,名字可以随便取,只要对应上就行
下面给出其他三个函数代码,网上找到:
- BOOL
- RunElevated( HWND hwnd,
- LPCTSTR pszPath,
- LPCTSTR pszParameters = NULL,
- LPCTSTR pszDirectory = NULL )
- {
- SHELLEXECUTEINFO shex;
- memset( &shex, 0, sizeof( shex) );
- shex.cbSize = sizeof( SHELLEXECUTEINFO );
- shex.fMask = 0;
- shex.hwnd = hwnd;
- shex.lpVerb = _T("runas");
- shex.lpFile = pszPath;
- shex.lpParameters = pszParameters;
- shex.lpDirectory = pszDirectory;
- shex.nShow = SW_NORMAL;
- return ::ShellExecuteEx( &shex );
- }
- BOOL IsProcessRunAsAdmin()
- {
- SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
- PSID AdministratorsGroup;
- BOOL bIsAdmin = AllocateAndInitializeSid(
- &NtAuthority,
- 2,
- SECURITY_BUILTIN_DOMAIN_RID,
- DOMAIN_ALIAS_RID_ADMINS,
- 0, 0, 0, 0, 0, 0,
- &AdministratorsGroup);
- if (bIsAdmin)
- {
- CheckTokenMembership(NULL, AdministratorsGroup, &bIsAdmin);
- FreeSid(AdministratorsGroup);
- }
- return bIsAdmin == TRUE ;
- }
- BOOL IsEnableUAC(void)
- {
- BOOL bEnableUAC = FALSE;
- OSVERSIONINFO ovi = {0};
- ovi.dwOSVersionInfoSize = sizeof(ovi);
- if (::GetVersionEx(&ovi))
- {
- // window vista or windows server 2008 or later operating system
- if ( ovi.dwMajorVersion > 5 )
- {
- HKEY hKey = NULL;
- DWORD dwType = REG_DWORD;
- DWORD dwEnableLUA = 0;
- DWORD dwSize = sizeof(DWORD);
- LSTATUS lRet = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,
- _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\"),
- 0, KEY_READ, &hKey);
- if( ERROR_SUCCESS == lRet )
- {
- lRet = ::RegQueryValueEx(hKey, _T("EnableLUA"), NULL, &dwType, (BYTE*)&dwEnableLUA, &dwSize);
- ::RegCloseKey(hKey);
- if( ERROR_SUCCESS == lRet )
- {
- bEnableUAC = (dwEnableLUA) ? TRUE : FALSE;
- }
- }
- }
- }
- return bEnableUAC;
- }
这样运行的程序始终都能以高权限运行,并且可以设置是否跳过UAC弹窗。
演示程序源码下载:http://download.csdn.net/detail/daiafei/6771671
(win7可以 win8.1不行)
由于在win7下,使用ITask接口无法控制计划任务创建多个实例的进程,另外写了个演示程序,演示程序及源码下载:http://download.csdn.net/detail/daiafei/6814109
界面中的复选框勾选的时候会检查计划任务是否需要创建及是否创建成功,取消创建会删除计划任务。
http://blog.csdn.net/daiafei/article/details/17578723
程序跳过UAC研究及实现思路(两种方法,现在可能都不行了)的更多相关文章
- 【Qt】实现程序重启的两种方法
Qt5/PyQt5 实现程序重启的两种方法 前言 最近在写一个开源项目,需要实现一个程序自动重启的功能.尝试了好几种方式,效果均不太理想. 一开始的实现思路是,记为思路一吧.大概就是写一些 shell ...
- WPF程序将DLL嵌入到EXE的两种方法
WPF程序将DLL嵌入到EXE的两种方法 这一篇可以看作是<Visual Studio 版本转换工具WPF版开源了>的续,关于<Visual Studio 版本转换工具WPF版开源了 ...
- C#中得到程序当前工作目录和执行目录的五种方法
string str="";str += "\r\n" + System.Diagnostics.Process.GetCurrentProcess().Mai ...
- 在Java Web程序中使用监听器可以通过以下两种方法
之前学习了很多涉及servlet的内容,本小结我们说一下监听器,说起监听器,编过桌面程序和手机App的都不陌生,常见的套路都是拖一个控件,然后给它绑定一个监听器,即可以对该对象的事件进行监听以便发生响 ...
- jquery/js/a标签实现当前页面跳转的两种方法
在逛购物网站首页时经常看到侧边导航栏,当我们点击导航栏中某一项时会跳转到当前页面的某一处 有两种方法实现,一种是利用js计算好各位置的高度,通过绑定事件使页面跳转到指定位置,另一种是利用a标签进行当前 ...
- vue里使用element饿了么的el-menu+vue-router实现路由跳转的两种方法
最近准备写一个echarts的可视化展示案例,首先用vue-cli3创建了一个项目(好像vue-cli4也出来,感觉变化不大,就没升级了) 然后,开始配置路由↓下面是我的router.js文件 imp ...
- 跳转Activity两种方法
摘要:假设从A界面开启另外一个B界面根据是否需要返回数据分为两种方式 一.无需返回数据方式 在A界面中调用startActivity方法进行直接跳转即可 二.需要返回数据方式 1.在A界面中调用sta ...
- 让程序只运行一个实例(Delphi篇)(三种方法,其中使用全局原子的方法比较有意思)
Windows 下一个典型的特征就是多任务,我们可以同时打开多个窗口进行操作,也可以同时运行程序的多个实例,比如可以打开许多个资源管理器进行文件的移动复制操作.但有时出于某种考虑(比如安全性),我们要 ...
- 在linux环境下编译运行OpenCV程序的两种方法
原来以为在Ubuntu下安装好了OpenCV之后,自己写个简单的程序应该很容易吧,但是呢,就是为了编译一个简单的显示图片的程序我都快被弄崩溃了. 在谷歌和上StackOverFlow查看相关问题解答之 ...
随机推荐
- scala 主从构造器
package cn.scala_base.oop.scalaclass /** * 构造器分为两种,一种是主构造器,另一种是从构造器,所有的从构造器必须在其方法体 * 的第一行调用主构造器 * * ...
- Cordova之打包签名apk
首先是关于apk签名,Android程序的安装是以包名(package name)进行区分的,就是同样的包名会被认作是同一个程序.这样就可以进行升级.替换.但是包名是一个可以被查看的字符串,这样就可能 ...
- 读取和修改xml文件
如有一个xml文件DownData.xml,内容如下 <?xml version="1.0" standalone="yes"?> <Root ...
- CUDA中的常量内存__constant__
GPU包含数百个数学计算单元,具有强大的处理运算能力,可以强大到计算速率高于输入数据的速率,即充分利用带宽,满负荷向GPU传输数据还不够它计算的.CUDA C除全局内存和共享内存外,还支持常量内存,常 ...
- 使用Toast进行用户提醒(转)
Toast是Android提供的一个轻量级的用户提醒控件,使用也很简单,就相当一个极简的dialog!!!下面将向您介绍一些Toast的详细用法: 1.普遍使用的方法: Context context ...
- QList介绍(QList比QVector更快,这是由它们在内存中的存储方式决定的。QStringList是在QList的基础上针对字符串提供额外的函数。at()操作比操作符[]更快,因为它不需要深度复制)非常实用
FROM:http://apps.hi.baidu.com/share/detail/33517814 今天做项目时,需要用到QList来存储一组点.为此,我对QList类的说明进行了如下翻译. QL ...
- matlab Tricks(二十七)—— 可变输入参数输出参数的适配
matlab 内置的对 varargin/varargout(nargin/nargout)的支持,使得 matlab 的输入参数和输出参数,有了更为灵活的传递和使用: 比如对于 matlab 原生支 ...
- 双目相机标定以及立体测距原理及OpenCV实现
单目相机标定的目标是获取相机的内参和外参,内参(1/dx,1/dy,Cx,Cy,f)表征了相机的内部结构参数,外参是相机的旋转矩阵R和平移向量t.内参中dx和dy是相机单个感光单元芯片的长度和宽度,是 ...
- 參数传递(引用,指针,值传递)C++11
C++中,函数的參数传递方式有值传递.地址传递.传地址有指针和引用方式. 在函数參数中,传地址的理由有: 1.使被调函数能够改动主调函数中的数据对象: 2.传地址能够降低数据拷贝,提高程序运行速度. ...
- python3获取天气预报
#!/usr/local/bin/python3 #coding=utf-8 ''' Created on 2011-2-25 @author: http://www.cnblogs.com/txw1 ...