【问题标题】:Restart program unelevated重新启动程序未提升
【发布时间】:2011-10-07 19:37:18
【问题描述】:

由于某种原因,我的 C# 程序需要以提升的权限重新启动。我使用下面的代码来实现它:

private static void RestartForPermissionsFix()
{
    ProcessStartInfo processInfo = new ProcessStartInfo();
    processInfo.Verb = "runas";
    processInfo.FileName = Assembly.GetExecutingAssembly().Location;

    Process.Start(processInfo);
}

这很好用。

“修复我的权限”后,我想重新启动程序未提升。我在没有“runas”的情况下尝试了与上面相同的方法,但它不起作用。我假设从提升的进程启动的进程会自动提升。有什么想法吗?

【问题讨论】:

    标签: c# uac elevation elevated-privileges


    【解决方案1】:

    为了从高完整性进程以中等完整性启动进程,我相信您必须使用 OpenProcessToken 获取当前进程令牌,复制它,使用 SetTokenInformation 从令牌中删除高完整性 SID,然后使用该令牌使用CreateProcessAsUser 创建新进程。这将类似于this example,除了添加低完整性 SID 之外,您必须删除高完整性 SID。注意:我没有对此进行测试,所以我不能 100% 确定它会起作用。

    我建议您让原始未提升的进程继续运行,并让它等待其提升的对应进程完成(例如使用Process.WaitForExit)。一旦完成,它可以像以前一样继续不提升。这样会容易得多,也更万无一失。

    【讨论】:

    • 我支持让第一个(未提升的)进程运行并在第二个(提升的)进程完成后恢复它的想法(您可以使用Process.WaitForExit())。
    • 谢谢斯文。当然,您的建议要简单得多。我稍微重构了我的程序,以便让两个实例并行运行没有问题。
    • @coffee_machine:另外一点信息:如果用户是实际受限用户,那么重新启动 unlevated 将是一个坏主意的原因之一是。在这种情况下,提升会在不同的帐户中执行该过程,您必须以某种方式弄清楚原始帐户是什么才能使用这些凭据启动该过程。我自己在那个配置中运行。
    • elevation executes the process in a different account - 雷蒙德explains what to do in this situation
    【解决方案2】:

    我想自动更新的应用程序遇到了同样的问题(更新程序需要提升的权限)。

    我所做的是创建一个外部 .exe,它将以提升的权限启动我的更新程序,等待它退出,然后以正常权限重新启动我的应用程序。

    然后我将这个 .exe 嵌入到我的主应用程序中,并在我更新它时在离开我的应用程序之前启动这个 .exe

    【讨论】:

      猜你喜欢
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      • 2013-07-19
      • 2011-04-25
      • 2011-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多