“ClickOnce不支持请求执行级别'requireAdministrator。'”

时间:2012-06-13 22:04:21

标签: c# wpf compiler-errors clickonce

所以我正在编写一个需要访问注册表的应用程序。 我没有触及任何构建设置,希望在添加其他触摸之前让事情正常工作,例如描述或名称。

出乎意料的是,我得到了一个不会消失的错误。 ClickOnce does not support the request execution level 'requireAdministrator'.现在,我还没有触及此应用程序中的ClickOnce。我所做的只是包括一个请求这些权限的清单文件。

我现在的问题是这个错误不会消失,我无法编译我的程序。关于该怎么做的任何建议? (旁注:我准备去睡觉了,明天下午我会检查一下。)

11 个答案:

答案 0 :(得分:136)

编辑:此评论也给出了一个很好的答案。

  无论您是否想要,只要点击“发布”,

点击一次就会启用!如果您使用“requireAdministrator”,则表明您无法使用ClickOnce,因此无法“发布”您的项目。


<强>原始

原来,在“安全”选项卡下,选中了“启用ClickOnce安全设置”。即使我没有检查它。 无论如何,取消选中停止ClickOnce给我的错误。这需要一段时间才能找到......

答案 1 :(得分:39)

我知道这是一个老问题,但两年后我来到这里是这样的:

您可以从项目属性的“安全”选项卡中禁用ClicKOnce以帮助解决问题;见下文:

enter image description here

答案 2 :(得分:18)

如果您曾使用过发布向导或“立即发布”,则会自动选中“点击一次”复选框...

答案 3 :(得分:10)

我知道这已经过时了,但我偶然发现它寻找答案。在我的情况下,我使用发布功能,我需要继续使用它。我还需要访问管理功能。因此,上述答案都不适合我。

我最后在应用程序的最开始添加了一个方法,用于检查它是否以管理员身份运行,如果不是,则重新启动自己作为管理员。为此,您需要添加以下参考。

using System;
using System.Diagnostics;
using System.Reflection;
using System.Security.Principal;

然后你需要把它放在你的主方法有方便访问的地方。我使用WPF,所以我将它添加到MainWindow.xaml.cs,但您可以在代码的早期任何地方添加它。只记得添加&#34;静态&#34;如果你需要这些方法。

private void AdminRelauncher()
{
    if (!IsRunAsAdmin())
    {
        ProcessStartInfo proc = new ProcessStartInfo();
        proc.UseShellExecute = true;
        proc.WorkingDirectory = Environment.CurrentDirectory;
        proc.FileName = Assembly.GetEntryAssembly().CodeBase;

        proc.Verb = "runas";

        try
        {
            Process.Start(proc);
            Application.Current.Shutdown();
        }
        catch(Exception ex)
        {
            Console.WriteLine("This program must be run as an administrator! \n\n" + ex.ToString());
        }
    }
}

private bool IsRunAsAdmin()
{
    try
    {
        WindowsIdentity id = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(id);
        return principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch (Exception)
    {
        return false;
    }
}

最后,在程序开始时,添加对方法的引用。在我的情况下,我将它添加到MainWindow,但将其添加到Main也可以。

public MainWindow()
{
    InitializeComponent();
    AdminRelauncher(); //This is the only important line here, add it to a place it gets run early on.
}

希望这有帮助!

答案 4 :(得分:3)

查看您的app.Manifest文件,您会看到:

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

评论中有说明,但只是删除&#34; requireAdministrator&#34;并插入这个地方解决了我的问题:

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

答案 5 :(得分:2)

我遇到同样的问题我通过取消选中&#34; 启用ClickOnce安全设置来解决问题&#34; 在Visual Studio中查找此选项右键单击项目==&gt;属性==&gt;选择安全性==&gt;启用ClickOnce安全设置(此选项已经过检查,因此我取消选中它,我的问题得到解决)。

答案 6 :(得分:2)

可以通过选择“启用ClickOnce安全设置”来实现此操作(因为在发布期间不能“取消选中”,如上所述),然后选择“这是部分信任应用程序”。将在下拉菜单中自动选择“本地Intranet”,这是完全正常的。

保存更改,发布应用程序,完成滑雪板。 : - )Security Settings Snippet

答案 7 :(得分:2)

以下是VB.NET的代码片段

If Not New WindowsPrincipal(WindowsIdentity.GetCurrent).IsInRole(WindowsBuiltInRole.Administrator) Then
            Process.Start(New ProcessStartInfo With { _
                                                     .UseShellExecute = True, _
                                                     .WorkingDirectory = Environment.CurrentDirectory, _
                                                     .FileName = Assembly.GetEntryAssembly.CodeBase, _
                                                     .Verb = "runas"})

编辑:但如果以这种方式部署,某些AV软件会阻止您的代码。

答案 8 :(得分:1)

对于那些使用取消选中“启用ClickOnce安全设置”的用户无效,请尝试我发现的方法。

首先,将您的app.manifest requestExecutionLevel项目保留为原样

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

然后您像这样编辑Program.cs文件:

using System;
using System.Diagnostics;
using System.Reflection;
using System.Security.Principal;
using System.Windows.Forms;

重建主要方法,例如:

    static void Main()
        {
            var wi = WindowsIdentity.GetCurrent();
            var wp = new WindowsPrincipal(wi);

            bool runAsAdmin = wp.IsInRole(WindowsBuiltInRole.Administrator);

            if (!runAsAdmin)
            {
                // It is not possible to launch a ClickOnce app as administrator directly,
                // so instead we launch the app as administrator in a new process.
                var processInfo = new ProcessStartInfo(Assembly.GetExecutingAssembly().CodeBase);

                // The following properties run the new process as administrator
                processInfo.UseShellExecute = true;
                processInfo.Verb = "runas";

                // Start the new process
                try
                {
                    Process.Start(processInfo);
                }
                catch (Exception)
                {
                    // The user did not allow the application to run as administrator
                    MessageBox.Show("Sorry, but I don't seem to be able to start " + 
                       "this program with administrator rights!");
                }

                // Shut down the current process
                Application.Exit();
            }
            else
            {
                // We are running as administrator
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
        }

它可在Windows 10和Visual Studio 2019上运行!

答案 9 :(得分:1)

对于遇到此问题的任何人,我都认为我应该为最终为我工作所做的贡献。

是的,执行 Build>发布时,如果取消选中“启用ClickOnce安全设置”选项,则会自动对其进行重新检查。

对我来说,我不需要“发布”-这是一个简单的可移植.exe,可以为我的用户创建计划任务,即使是以管理员身份登录,我也需要确保它已提升。 / p>

所以我只是从 \ bin \ Release 中获取了最新的.exe,这就是在我的客户端系统上部署的东西。

按预期方式工作-即,当我将其安装在启用了UAC的系统上/以其最高设置运行时,.exe带有“盾”,并且在我运行它时,即使以管理员,它会升高,并且出现UAC提示。

我的小任务计划程序应用程序现在可以创建任务而不会出现“访问被拒绝”错误(以前,只能通过右键单击.exe并单击以管理员身份运行来解决此问题。)

答案 10 :(得分:-11)

Imports System.security

和 您将不会收到任何错误,您的应用程序将以管理员身份运行