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