强制应用程序获得管理员权限

5

我需要将我的应用程序赋予管理员权限,但我知道它将在用户会话中运行而不是管理员帐户。

我已经查看了其他网站,但没有找到任何有用的信息。

我尝试编辑清单等其他方法,并插入了以下行:

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

当我尝试使用ClickOnce发布时,这给了我一个错误,但在调试时没有。

你能帮助我吗?

2个回答

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提示将在那时显示。这里还有一个好处是,用户可能不会每次使用应用程序时都运行这个特定的逻辑 - 因此当他们不需要时,他们不会被提示所困扰。


@Matth 抱歉,我不太清楚你的问题。目标是在提升模式下运行一些代码。除非您是管理员,否则您需要提示来提升您的应用程序。 - avs099
将使用此应用程序的工程师作为计算机上的用户帐户。该应用程序执行需要管理员权限的特权过程。出于安全原因,他们的管理员帐户不会提供给外部。我只想对用户透明。同样的原则,我已经成功地通过命令调用程序而无需UAC。p.StartInfo.UserName =“user” p.StartInfo.Password =“secret”但唯一的担心是我的命令提示符被显示出来。虽然我喜欢它在后台运行。 - Atoxis
你尝试过使用 ProcessStartInfo.WindowStyle 吗?http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.windowstyle.aspx - avs099
是的,我尝试过: Process clone = new Process(); System.Security.SecureString secret = new system.Security.SecureString(); foreach (char c in pwd) secret.AppendChar(c); clone.StartInfo.UserName = user; clone.StartInfo.Password = secret; clone.StartInfo.FileName = "dsfo.exe"; clone.StartInfo.Arguments = lblAdress.Text + @" 0 0 " + tmp + "ADC.img"; clone.StartInfo.UseShellExecute = false; clone.StartInfo.CreateNoWindow = true; clone.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; clone.Start(); - Atoxis
让我们在聊天中继续这个讨论。点击此处进入聊天室 - avs099
@Atoxis - 你能解决这个问题吗?现在一切都好了吗? - avs099

1

我相信这种行为是有意为之的。

ClickOnce 应用程序旨在可在没有管理员权限的情况下安装。无法在运行时提升它们的权限,因为这意味着实际上一个没有管理员权限的用户可以安装并以管理员身份运行应用程序;这将是一种安全风险。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接