强制应用程序具有管理员权限

时间:2012-04-19 11:48:56

标签: c# clickonce privileges administrator

我需要授予应用程序管理员权限,因为它知道它将从用户会话而不是管理员帐户运行。

我看过其他网站,但找不到任何有用的东西。

我尝试在其他内容中编辑清单,并插入了行:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

这在尝试使用ClickOnce发布时出错,但在我调试时却没有。

你能帮助我吗?

2 个答案:

答案 0 :(得分:5)

首先 - 确实,设计不允许以管理员身份安装和ClickOnce应用:http://msdn.microsoft.com/en-us/library/142dbbz4(v=vs.90).aspx

看一下这篇文章:http://antscode.blogspot.ca/2011/02/running-clickonce-application-as.html - 它解释了如何以管理员身份运行ClickOnce应用程序。但是 - 不得不说我已走过这条道路 - 而且我没有太多运气。这种方法遇到了很多麻烦(尝试使用管理员权限运行ClickOnce应用程序)。据我所知,最大的问题是自动更新无法正常工作。更不用说非管理员用户可能需要一直输入管理员凭据。

因此,我的建议是重新考虑您的逻辑,并将您需要以管理员身份完成的部分封装在一个单独的EXE文件中 - 并让用户明白当他点击该文件时按钮,UAC提示符将显示(可能通过添加“屏蔽”图标到按钮)。在那个button_click事件中做了类似这样的事情:

// 2. Run Photoshop action on this image (and wait for the task to complete)
if (string.IsNullOrWhiteSpace(this.PhotoshopEnhanceActionAbsPath) == false)
{
    var pi = new ProcessStartInfo(this.PhotoshopEnhanceActionAbsPath,  "\"" + imgPhotoshopActionAbsPath + "\"");
    pi.UseShellExecute = true;
    pi.Verb = "runas";
    var photoshopAction = Process.Start(pi);
    var success = photoshopAction.WaitForExit();
    if (success == false)
    {
        // do something here
    }                
}

这种方法对我来说非常有效。关键在于:

pi.UseShellExecute = true;
pi.Verb = "runas";

它以管理员权限运行您的EXE - 因此此时将显示UAC提示。这里的另一个好结果是,用户每次使用应用程序时都可能无法运行这个特定的逻辑 - 因此当他们不需要时,他们不会被提示烦恼。

答案 1 :(得分:1)

我很确定这种行为是设计的。

ClickOnce应用程序可在没有管理员权限的情况下进行安装。它不可能在运行时提升它们,因为这意味着可以有效地安装没有管理员权限的用户然后以管理员身份运行应用程序;这将是一种安全风险。