网上很对跳过UAC资料都是说如果让UAC弹出窗体,并没有真正跳过弹窗,这里结合动态提权+计划任务实现真正意义上的跳过UAC弹窗,运行程序的时候可以不出现UAC窗体,并且程序还是以高权限运行。

vista及其以后系统多程序的安全进行了控制,经过允许的程序才能执行,但是每次运行程序都弹出UAC控制窗体很烦人,网上看了一些资料,大致归纳出两种方案:

方案一:程序自身具备高权限(win7下带有盾牌图标),通过一个低权限程序调用计划任务来调用程序自身,实现跳过UAC弹窗

方案二:程序自身是普通权限,通过运行时动态提升权限结合计划任务实现跳过UAC弹窗

两种方案都需要通过计划任务来实现,因为几乎任务权限很高,通过高权限的计划任务调用程序,就不会有UAC弹窗提示。

下面以方案二实现来说一下:

首先创建一个普通权限的进程,在进程初始化的时候进行判断,以对话框程序为例。代码如下:

  1. BOOL CSkipUACDemoApp::InitInstance()
  2. {
  3. if (IsEnableUAC() && !IsProcessRunAsAdmin())
  4. {
  5. BOOL bSkipUAC = FALSE;
  6. HINSTANCE hInstance = 0;
  7. if(bSkipUAC )//跳过
  8. {
  9. MessageBox(NULL,_T("跳过UAC"),_T("提示"),MB_OK);
  10. //跳过UAC弹窗关键部分,通过运行计划任务实现跳过UAC弹窗
  11. hInstance = ShellExecute(NULL,_T("open"),_T("schtasks.exe"),_T(" /run /TN \"SkipUAC\""),NULL,SW_HIDE);
  12. }
  13. if (!bSkipUAC || ((int)hInstance <= 32))
  14. {
  15. MessageBox(NULL,_T("进行提权操作"),_T("提示"),MB_OK);
  16. RunElevated(NULL,_T("进程全路径"));
  17. }
  18. return FALSE;
  19. }
  20. MessageBox(NULL,_T("高权限运行程序"),_T("提示"),MB_OK);
  21. //代码省略
  22. .......................................
  23. }

检查是否设置了UAC控制:IsEnableUAC() (忘记参考自哪里了,抱歉)

检查进程是否以高权限运行:IsProcessRunAsAdmin() 参考:http://blog.csdn.net/just_fancy/article/details/6310347

动态提升权限:RunElevated() 参考:http://blog.csdn.net/jehnjehn/article/details/7564548

其中,计划任务需要提前创建,名称SkipUAC,名字可以随便取,只要对应上就行

下面给出其他三个函数代码,网上找到:

  1. BOOL
  2. RunElevated(    HWND hwnd,
  3. LPCTSTR pszPath,
  4. LPCTSTR pszParameters = NULL,
  5. LPCTSTR pszDirectory = NULL )
  6. {
  7. SHELLEXECUTEINFO shex;
  8. memset( &shex, 0, sizeof( shex) );
  9. shex.cbSize        = sizeof( SHELLEXECUTEINFO );
  10. shex.fMask        = 0;
  11. shex.hwnd        = hwnd;
  12. shex.lpVerb        = _T("runas");
  13. shex.lpFile        = pszPath;
  14. shex.lpParameters    = pszParameters;
  15. shex.lpDirectory    = pszDirectory;
  16. shex.nShow        = SW_NORMAL;
  17. return ::ShellExecuteEx( &shex );
  18. }
  19. BOOL  IsProcessRunAsAdmin()
  20. {
  21. SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
  22. PSID AdministratorsGroup;
  23. BOOL  bIsAdmin = AllocateAndInitializeSid(
  24. &NtAuthority,
  25. 2,
  26. SECURITY_BUILTIN_DOMAIN_RID,
  27. DOMAIN_ALIAS_RID_ADMINS,
  28. 0, 0, 0, 0, 0, 0,
  29. &AdministratorsGroup);
  30. if (bIsAdmin)
  31. {
  32. CheckTokenMembership(NULL, AdministratorsGroup, &bIsAdmin);
  33. FreeSid(AdministratorsGroup);
  34. }
  35. return  bIsAdmin == TRUE ;
  36. }
  37. BOOL IsEnableUAC(void)
  38. {
  39. BOOL bEnableUAC = FALSE;
  40. OSVERSIONINFO ovi = {0};
  41. ovi.dwOSVersionInfoSize = sizeof(ovi);
  42. if (::GetVersionEx(&ovi))
  43. {
  44. // window vista or windows server 2008 or later operating system
  45. if ( ovi.dwMajorVersion > 5 )
  46. {
  47. HKEY hKey = NULL;
  48. DWORD dwType = REG_DWORD;
  49. DWORD dwEnableLUA = 0;
  50. DWORD dwSize = sizeof(DWORD);
  51. LSTATUS lRet = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,
  52. _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\"),
  53. 0, KEY_READ, &hKey);
  54. if( ERROR_SUCCESS == lRet )
  55. {
  56. lRet = ::RegQueryValueEx(hKey, _T("EnableLUA"), NULL, &dwType, (BYTE*)&dwEnableLUA, &dwSize);
  57. ::RegCloseKey(hKey);
  58. if( ERROR_SUCCESS == lRet )
  59. {
  60. bEnableUAC = (dwEnableLUA) ? TRUE : FALSE;
  61. }
  62. }
  63. }
  64. }
  65. return bEnableUAC;
  66. }

这样运行的程序始终都能以高权限运行,并且可以设置是否跳过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研究及实现思路(两种方法,现在可能都不行了)的更多相关文章

  1. 【Qt】实现程序重启的两种方法

    Qt5/PyQt5 实现程序重启的两种方法 前言 最近在写一个开源项目,需要实现一个程序自动重启的功能.尝试了好几种方式,效果均不太理想. 一开始的实现思路是,记为思路一吧.大概就是写一些 shell ...

  2. WPF程序将DLL嵌入到EXE的两种方法

    WPF程序将DLL嵌入到EXE的两种方法 这一篇可以看作是<Visual Studio 版本转换工具WPF版开源了>的续,关于<Visual Studio 版本转换工具WPF版开源了 ...

  3. C#中得到程序当前工作目录和执行目录的五种方法

    string str="";str += "\r\n" + System.Diagnostics.Process.GetCurrentProcess().Mai ...

  4. 在Java Web程序中使用监听器可以通过以下两种方法

    之前学习了很多涉及servlet的内容,本小结我们说一下监听器,说起监听器,编过桌面程序和手机App的都不陌生,常见的套路都是拖一个控件,然后给它绑定一个监听器,即可以对该对象的事件进行监听以便发生响 ...

  5. jquery/js/a标签实现当前页面跳转的两种方法

    在逛购物网站首页时经常看到侧边导航栏,当我们点击导航栏中某一项时会跳转到当前页面的某一处 有两种方法实现,一种是利用js计算好各位置的高度,通过绑定事件使页面跳转到指定位置,另一种是利用a标签进行当前 ...

  6. vue里使用element饿了么的el-menu+vue-router实现路由跳转的两种方法

    最近准备写一个echarts的可视化展示案例,首先用vue-cli3创建了一个项目(好像vue-cli4也出来,感觉变化不大,就没升级了) 然后,开始配置路由↓下面是我的router.js文件 imp ...

  7. 跳转Activity两种方法

    摘要:假设从A界面开启另外一个B界面根据是否需要返回数据分为两种方式 一.无需返回数据方式 在A界面中调用startActivity方法进行直接跳转即可 二.需要返回数据方式 1.在A界面中调用sta ...

  8. 让程序只运行一个实例(Delphi篇)(三种方法,其中使用全局原子的方法比较有意思)

    Windows 下一个典型的特征就是多任务,我们可以同时打开多个窗口进行操作,也可以同时运行程序的多个实例,比如可以打开许多个资源管理器进行文件的移动复制操作.但有时出于某种考虑(比如安全性),我们要 ...

  9. 在linux环境下编译运行OpenCV程序的两种方法

    原来以为在Ubuntu下安装好了OpenCV之后,自己写个简单的程序应该很容易吧,但是呢,就是为了编译一个简单的显示图片的程序我都快被弄崩溃了. 在谷歌和上StackOverFlow查看相关问题解答之 ...

随机推荐

  1. 截断正态分布(Truncated normal distribution)

    Truncated normal distribution - Wikipedia Normal Distribution 称为正态分布,也称为高斯分布,Truncated Normal Distri ...

  2. Android开发之assets目录下资源使用总结

    预前知识: Android资源文件分类: Android资源文件大致可以分为两种: 第一种是res目录下存放的可编译的资源文件: 这种资源文件系统会在R.Java里面自动生成该资源文件的ID,所以访问 ...

  3. 把搜狗输入法词库导入Google拼音输入法

    为PC端Google拼音输入法增加词库 为什么折腾词库 都在说百度.讯飞等输入法上传用户词库,为了安全建议大家使用google输入法之类,话说回来,要想使用智能联想功能是不是就得把你输入习惯放在他的里 ...

  4. 在CSDN博客中添加量子恒道统计功能的做法

    作者:朱金灿 来源:http://blog.csdn.net/clever101 什么是量子恒道统计?量子恒道统计是一套免费的网站流量统计分析系统.致力于为所有个人站长.个人博主.所有网站管理者.第三 ...

  5. xshell/putty 连接 linux 虚拟机 connection failed 的解决方案

    ubuntu 默认并没有安装 ssh 服务,如果通过 ssh(XShell/putty) 连接 ubuntu 虚拟机,则需要手动安装 ssh-server(ssh 分客户端和 openssh-clie ...

  6. zoj 3820 Building Fire Stations(二分法+bfs)

    题目链接:zoj 3820 Building Fire Stations 题目大意:给定一棵树.选取两个建立加油站,问说全部点距离加油站距离的最大值的最小值是多少,而且随意输出一种建立加油站的方式. ...

  7. 斯托克斯定理(Stokes' theorem)

    1. 几种形式 ∮∂SPdx+Qdy+Rdz=∬S∣∣∣∣∣∣cosα∂∂xPcosβ∂∂yQcosγ∂∂zR∣∣∣∣∣∣dS ∮∂Ωw=∬Ωdw 左边是内积: 右边是外积: 物理上的应用: ∮∂SE ...

  8. automapper如何全局配置map条件过滤null值空值对所有映射起效

    原文 automapper如何全局配置map条件过滤null值空值对所有映射起效 我们在使用automapper的时候经常会遇到这样的问题:假设展示给用户的数据我们用UserDto类,User类就是我 ...

  9. windown下linux子系统的安装和卸载

    原文:windown下linux子系统的安装和卸载 安装 第一步  打开开发人员模式 第二步  勾选适用linux的window子系统 第三步  打开powershell 第四步  在PowerShe ...

  10. 对于ado.net dataProvider的介绍

    学习刘皓的 ADO.NET入门教程(二)了解.NET数据提供程序 而来 这篇文章很一般,主要是对dataProvider做了个简单的介绍.因为在该系列文章中提到,ado.net主要有两部分 dataP ...