我正在寻找一种方法,用作禁用UAC的替代方法,以在整个系统生命周期内保持应用程序持久性。
我的应用程序在每次系统启动时运行,并且它需要提升的权限,因此当启用UAC时,它会在每次重新启动系统时询问用户是否运行我的应用程序。这非常乏味,如果每次都发生这种情况会变得很烦人。如果UAC被禁用,则此警告不再出现,但当然这对用户非常有害,因为它可能会导致计算机上的威胁。
我的问题是;在C ++中,我如何以编程方式允许文件/应用程序在用户PC上的任何事件中持久化,仅用于我的应用程序,而不是每次都获得UAC警告!
我正在寻找任何可能的方法,漏洞利用,旁路方法,任何事情,我现在非常绝望,因为我已经坚持这个程序好几天了,我只有99.9%完成了我的工作项目。我真的需要通过这个。非常感谢您提供给我的任何建议!
答案 0 :(得分:3)
第一步是确定您的程序是否真的需要管理员权限。有时,程序仅以管理员权限运行,但是由于微不足道的原因:例如,在错误的位置生成日志文件,或者打开应该为只读访问打开的文件以进行完全访问。如果是这种情况,您可以解决问题并避免任何进一步的结构变化。
其次,询问您的程序是否始终需要管理员权限,或仅在用户执行某些操作时。在后一种情况下,您可能只应在必要时提升;并且意味着用户不需要在每次重新启动时批准程序启动,它还有助于保护用户无需进行管理更改。如果UAC配置为每次都需要密码,这一点尤其重要。
第三,询问您的程序是否真的需要用户界面。如果没有,那么它应该是一个系统服务。
如果您的程序确实一直需要管理员权限,并且确实需要用户界面,那么您需要将其分为两部分,一部分包含用户界面,另一部分包含需要提升权限的功能。
用户界面部分应该是用户登录时运行的程序,就像您的程序现在一样。提升的权限部分应该是系统服务。
主逻辑可能属于任一部分,也可能需要分成两部分;它完全取决于上下文。 (系统服务确实需要包含足够的逻辑,以确保它所执行的特权操作是安全和适当的。它不能简单地执行用户界面部分告诉它的任何操作。)
这两个部分可以使用任何形式的inter-process communication和/或synchronization进行交互,这是最方便的。您需要注意它们将在不同的远程桌面会话中;例如,如果为同步创建事件对象,则名称必须以Global\
前缀开头。
您需要考虑通过Switch User或同时因为该计算机是远程桌面服务器,可以同时登录多个用户。这可能意味着服务组件需要支持多个同时发生的客户端,这会影响您对IPC的选择和实施。或者,用户界面组件需要检测另一个实例是否已在运行,并等待该实例在尝试连接之前消失。
您还需要考虑当登录用户没有管理权限时程序应如何反应。目前这样的用户根本无法运行您的程序,可能使提示比管理员用户更烦人!如果程序可以正常地为非管理员用户工作,那么您不需要做任何特别的事情。如果程序不适用于非管理员用户,或者某些功能应该受到限制,那么(a)GUI组件需要相应地表现,例如,通过静默退出; (b)服务组件需要检查GUI组件运行的上下文。 GUI组件进行检查是不够的,因为如果用户愿意,用户可以欺骗它;服务组件也必须检查。
最简单的方法是使用GetTokenInformation和TokenElevationType选项;如果令牌类型为TokenElevationTypeLimited或TokenElevationTypeFull,则该用户具有管理员权限。如果令牌类型是TokenElevationTypeDefault,则没有拆分令牌;用户不是管理员,是本地管理员帐户,还是UAC已关闭;在这种情况下,请使用CheckTokenMembership检查用户是否在Administrators组中。
在某些情况下,某些任务需要UAC批准才有意义,即使其他任务没有。这些任务不需要涉及服务组件;在用户同意的情况下,GUI组件可以自行升级,以执行它们。