.net Windows中的权限提升

.net Windows中的权限提升,.net,windows,security,winapi,operating-system,.net,Windows,Security,Winapi,Operating System,我正在编写一个应用程序,它将由具有用户权限的GUI部分和作为服务使用本地系统权限的服务器部分组成。GUI部件有时需要执行一些需要高权限(管理员/本地系统)的操作。GUI应用程序可以请求服务执行此操作,服务也可以执行此操作(当然是在身份验证和授权之后) 但是,如果服务可以运行具有本地系统权限的命令,该命令将在用户桌面的上下文中运行(以便用户可以与命令的GUI交互),则会更方便。可能吗 NET中的解决方案更可取,但C/C++也不错。有四种方法可以从非提升GUI进程运行提升代码: 将提升的逻辑移动到单

我正在编写一个应用程序,它将由具有用户权限的GUI部分和作为服务使用本地系统权限的服务器部分组成。GUI部件有时需要执行一些需要高权限(管理员/本地系统)的操作。GUI应用程序可以请求服务执行此操作,服务也可以执行此操作(当然是在身份验证和授权之后)

但是,如果服务可以运行具有本地系统权限的命令,该命令将在用户桌面的上下文中运行(以便用户可以与命令的GUI交互),则会更方便。可能吗


NET中的解决方案更可取,但C/C++也不错。

有四种方法可以从非提升GUI进程运行提升代码:

  • 将提升的逻辑移动到单独的.exe文件中,该文件有自己的清单要求提升。然后,GUI应用程序可以使用
    CreateProcess()
    在需要时运行它

  • 让GUI应用程序使用
    ShellExecute/Ex()
    “runas”
    动词或第三方启动新的提升进程。您可以使用不同的.exe文件,也可以使用具有不同命令行参数的相同.exe文件,这并不重要

  • 将提升的逻辑移动到自己的COM对象中,然后GUI应用程序可以在需要时使用来实例化该对象

  • 让GUI应用程序与该服务通信,然后该服务可用于在用户会话中运行新进程(可以是单独的.exe,也可以是具有不同命令行参数的.exe,这无关紧要)。使用检索用户的令牌,并在
    STARTUPINFO
    结构中指定用户的桌面


  • 第四个选项看起来像我想要实现的(尽管1或2目前可能有效)。但我还没有完全理解令牌应该如何构造。使用WTSQueryUserToken()检索它不意味着它是以用户权限而不是系统权限(这是我所需要的)运行的吗?我发现这也很有用:。