在未提升的上下文中执行代码

Posted

技术标签:

【中文标题】在未提升的上下文中执行代码【英文标题】:Execute Code in an Unelevated Context 【发布时间】:2016-05-10 22:44:18 【问题描述】:

我的应用程序以管理员身份运行(已提升),但我需要在当前用户的上下文中运行某些代码块(未提升)。

    如何在未提升的上下文中运行给定的代码块?

    有没有办法通过模拟来做到这一点,而不需要我知道用户的域、名称和密码?

    是否有其他 API 可以做到这一点,或者有一种方法可以简单地使用属性?

    同样,有没有办法检测我当前在提升的环境中运行,以便我知道我需要首先降低提升?

我正在使用 C# 6.0、.NET 4.x(其中 x >= 5)和 Visual Studio 2015。

【问题讨论】:

【参考方案1】:
    您可以通过将需要以未提升权限运行的代码封装在单独的程序集(.exe 文件)中并将其作为新进程启动来实现此目的。看看Start non-elevated process from elevated process。

    检查您是否处于高位环境中:

    static bool IsAdministrator()
    
        WindowsIdentity identity = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(identity);
        return principal.IsInRole (WindowsBuiltInRole.Administrator);
    
    

    (取自:Detect if running as Administrator with or without elevated privileges?)

【讨论】:

有没有办法在同一范围内运行一段代码(更不用说进程了)? ——如果我反其道而行之,以非管理员身份运行,并请求提升特定范围的权限,那么可以这样做吗? -- 我更喜欢使用类似于SPSecurity.RunWithElevatedPrivileges 的模式,但用于桌面。 @BrainSlugs83:我认为除了开始一个新进程之外,没有其他方法可以改变海拔高度。另外,请参见此处:Using UAC with c#、Windows sudo 好吧,等等,其他应用程序是如何做到的? - 许多在您首次启动时不提示提升的应用程序中会有一些按钮,当您单击它时,您会收到一个 UAC 提示,它会在其中提升。在文本左侧的按钮上通常有某种 UAC 屏蔽。 -- 这是不同的 Windows 功能吗?也许我问错了问题? 也许他们正在后台生成一个新进程? SO 文章:How to elevate privileges only when required 和 How to UAC elevate a COM component with .NET 提到了另一种方式 - 注册 COM 组件,然后创建它的提升实例。 有趣。谢谢,我得看看那个。

以上是关于在未提升的上下文中执行代码的主要内容,如果未能解决你的问题,请参考以下文章

变量对象/变量提升

变量对象/变量提升

原型模式故事链--JS执行上下文变量提升函数声明

浏览器中的 JavaScript执行机制:07 | 变量提升:JavaScript代码是按顺序执行的吗?

278 执行上下文执行上下文栈:变量提升与函数提升,执行上下文,执行上下文栈,全局执行上下文,函数执行上下文,练习题

479 变量提升机制