禁用UAC的替代方案

Alternative to disabling UAC

本文关键字:方案 UAC 禁用      更新时间:2023-10-16

我正在寻找一种方法,作为禁用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组件可以在用户同意的情况下提升自己来执行它们。