7

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

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

    Process.Start(processInfo);
}

这很好用。

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

4

2 回答 2

9

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

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

于 2011-07-18T15:55:43.043 回答
1

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

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

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

于 2011-07-18T16:20:47.177 回答