禁用UAC的替代方案
Alternative to disabling UAC
我正在寻找一种方法,作为禁用UAC的替代方案,以在系统的整个生命周期中保持应用程序的持久性。
每次系统启动时,我的应用程序都会运行,并且它需要提升的权限,因此当启用UAC时,每次系统重新启动时,它都会询问用户是否运行我的应用软件。这是非常乏味的,如果每次都发生,可能会变得令人讨厌。如果UAC被禁用,该警告将不再出现,但这对用户来说当然是非常有害的,因为它可能会对用户的计算机造成威胁。
我的问题是;在C++中,我如何以编程方式允许文件/应用程序在用户电脑上的任何事件中持久存在,而不每次都收到UAC警告!
我正在寻找任何可能的方法,漏洞,绕过方法,任何东西,我现在真的很绝望,因为我已经被这个程序卡住了好几天了,我的项目只完成了99.9%。我真的需要解决这个问题。非常感谢你给我的任何建议!
第一步是确定您的程序是否真的需要管理员权限。有时程序只以管理员权限运行,但原因很简单:例如,日志文件在错误的位置生成,或者本应以只读访问方式打开的文件却以完全访问方式打开。如果是这样的话,你可以解决问题,避免任何进一步的结构变化。
其次,询问您的程序是否一直需要管理员权限,或者仅当用户执行某些操作时才需要。在后一种情况下,你可能只应该在必要的时候提升;这不仅意味着用户不需要在每次重新启动时批准程序启动,还有助于保护用户不在无意中进行管理更改。如果UAC配置为每次都需要密码,这一点尤其重要。
第三,询问你的程序是否真的需要一个用户界面。如果不是,那么它应该是一个系统服务。
如果您的程序确实一直需要管理员权限,并且确实需要用户界面,那么您需要将其分为两部分,一部分包含用户界面,另一部分包含需要提升权限的功能。
用户界面部分应该是一个在用户登录时运行的程序,就像您的程序现在所做的那样。提升的特权部分应该是系统服务。
主要逻辑可能属于任一部分,也可能需要一分为二;这完全取决于上下文。(系统服务确实需要包含足够的逻辑,以确保其执行的特权操作是安全和适当的。它不能简单地做用户界面部分告诉它做的任何事情。)
这两个部分可以使用任何最方便的进程间通信和/或同步形式进行交互。您需要知道他们将处于不同的远程桌面会话中;例如,如果创建用于同步的事件对象,则名称必须以Global
前缀开头。
您需要考虑可能有多个用户同时登录,可能是通过交换机用户登录,也可能是因为计算机是远程桌面服务器。这可能意味着服务组件需要同时支持多个客户端,这会影响您对IPC的选择和实现。或者,用户界面组件需要检测到另一个实例已经在运行,并等待该实例消失后再尝试连接。
您还需要考虑当登录的用户没有管理权限时,程序应该如何反应。目前,这样的用户根本无法运行您的程序,这可能会使提示比管理员用户更烦人!如果程序对非管理员用户正常工作是可以的,那么你不需要做任何特别的事情。如果程序不应该为非管理员用户工作,或者如果某些功能应该受到限制,则(a)GUI组件需要相应地表现,例如,静默退出;以及(b)服务组件需要检查GUI组件正在其中运行的上下文。仅仅由GUI组件进行检查是不够的,因为如果用户愿意,他或她可以欺骗它;服务组件也必须进行检查。
最简单的方法可能是将GetTokenInformation与TokenElevationType选项一起使用;如果令牌类型为TokenElevationTypeLimited或TokenElelectionTypeFull,则用户具有管理员权限。如果令牌类型为TokenElevationTypeDefault,则不存在拆分令牌;用户不是管理员,是本地管理员帐户,或者UAC已关闭;在这种情况下,请使用CheckTokenMembership检查用户是否在Administrators组中。
在某些情况下,某些任务需要UAC批准可能也是明智的,即使其他任务没有。这样的任务不需要涉及服务组件;GUI组件可以在用户同意的情况下提升自己来执行它们。
- 运行同一解决方案的另一个项目的项目
- Project Euler问题4的错误解决方案
- 计算每个节点的树高,帮助我解释这个代码解决方案
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- visual c++,如何获取解决方案目录中的代码
- 有没有办法在远程设备上打开和编辑visual Studio 2017解决方案
- C++Matching Brackets 2解决方案不起作用
- 在 ubuntu3 上C++ goto 定义有什么解决方案吗16.04?
- C++11 中不同类型的对象的 std::array 的替代方案
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 别名模板的专业化 C++11 中没有开销的最佳替代方案
- 我的固定时间步长与增量时间和插值的解决方案是错误的吗?
- 无法在问题解决方案中执行输出逻辑
- 最大的回文产品 - 程序未运行,编写解决方案但无法理解问题
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- 在一个解决方案中针对第三方静态库 (Creo) 的不同版本(版本)进行构建
- 如何巧妙地编写两个函数——一个用于检查是否存在解决方案,另一个用于获取所有解决方案
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- N-queen问题:无法弄清楚为什么我的解决方案不起作用
- 禁用UAC的替代方案