如何提升.net应用程序权限?

时间:2011-09-08 16:30:15

标签: windows security elevated-privileges

我有一个应用程序会在启动时检查更新,如果找到更新,它会通过网络将一些文件复制到程序文件文件夹。显然,Standard Users在正常情况下无法执行此类任务。

我尝试创建服务来执行更新过程,但我遇到了一些安全问题,我在超级用户中有asked this question个问题。

现在,考虑到大多数应用程序需要提升权限才能执行此类任务,我认为这可能是正确的方法。但是如何在XP(包括XP)的所有Windows版本下请求更新程序的提升。我发现了很多关于清单文件的主题,但由于我需要使用它来使用XP,我无法专门为UAC创建解决方案。

1 个答案:

答案 0 :(得分:2)

只有在启动过程中才能提升权限;正在运行的进程权限无法提升。为了提升现有应用程序,必须使用动词“runas”创建应用程序进程的新实例:

private static string ElevatedExecute(NameValueCollection parameters)
{
    string tempFile = Path.GetTempFileName();
    File.WriteAllText(tempFile, ConstructQueryString(parameters));

    try
    {
        ProcessStartInfo startInfo = new ProcessStartInfo();
        startInfo.UseShellExecute = true;
        startInfo.WorkingDirectory = Environment.CurrentDirectory;
        Uri uri = new Uri(Assembly.GetExecutingAssembly().GetName().CodeBase);
        startInfo.FileName = uri.LocalPath;
        startInfo.Arguments = "\"" + tempFile + "\"";
        startInfo.Verb = "runas";
        Process p = Process.Start(startInfo);
        p.WaitForExit();
        return File.ReadAllText(tempFile);
    }
    catch (Win32Exception exception)
    {
        return exception.Message;
    }
    finally
    {
        File.Delete(tempFile);
    }
}

用户确认以管理员身份执行程序后,在没有UI的情况下执行同一应用程序的另一个实例;一个可以显示在没有提升权限的情况下运行的UI,另一个可以在后台运行并具有提升的权限。第一个进程等待,直到第二个进程完成执行。有关更多信息和工作示例,您可以查看MSDN archive

为了防止所有这些对话诡计在一个漫长的过程中,您需要使用embedding the appropriate manifest in your application提升的权限来运行整个主机进程,以要求'highestAvailable'执行级别:这将导致UAC提示您的应用启动后立即显示,并导致所有子进程使用提升的权限运行,而无需其他提示。