【发布时间】:2013-04-29 21:44:02
【问题描述】:
我有一些需要管理员权限的设置功能,其结果被另一个未运行提升的应用程序使用。因此,为了让我的单元测试真正反映现实,我需要调用设置函数,然后以某种方式降低海拔,以便我可以调用使用设置的函数。有没有相当简单的方法可以做到这一点?看来我应该可以使用
创建限制令牌
和
ImpersonateLoggedOnUser
有什么例子吗?
【问题讨论】:
标签: unit-testing winapi uac
我有一些需要管理员权限的设置功能,其结果被另一个未运行提升的应用程序使用。因此,为了让我的单元测试真正反映现实,我需要调用设置函数,然后以某种方式降低海拔,以便我可以调用使用设置的函数。有没有相当简单的方法可以做到这一点?看来我应该可以使用
创建限制令牌
和
ImpersonateLoggedOnUser
有什么例子吗?
【问题讨论】:
标签: unit-testing winapi uac
UAC 提升仅在进程启动时执行。一旦进程开始运行,就不可能(取消)提升进程。因此,要执行您正在尝试的操作,您需要单独的流程。您可以:
运行最初未提升的 .exe,并在需要调用设置函数时启动新的提升进程。非提升进程可以使用ShellExecute/Ex() 和"runas" 动词,或使用第三方CreateProcessElevated() 实现,以提升状态启动新进程。
运行最初提升的 .exe 并让它调用设置函数,然后在需要调用使用者函数时使用 CreateRestrictedToken() 和 CreateProcessAsUser() 启动单独的非提升进程。
将设置函数移动到 COM 对象中,然后在非提升状态下运行 .exe,并在需要调用设置函数时使用 COM Elevation Moniker 实例化处于提升状态的 COM 对象.
对于 #1 和 #2,为了便于管理,您可以将所有代码放在一个 .exe 文件中,该文件只运行自身的新副本,向其传递一个命令行参数,告诉它要调用哪些函数和然后立即退出。
【讨论】: