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


93

因此,我正在编写一个需要访问注册表的应用程序。我没有涉及任何构建设置,希望在添加其他描述(例如描述或名称)之前使此功能正常运行。

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

我现在的问题是该错误不会消失,并且我无法编译程序。有什么建议怎么办?(旁注:我要去睡觉了,所以明天下午我会检查一下)。


4
我不愿意在这里声明明显的地方,但是您添加了一个清单,请求requireAdministrator权限,ClickOnce开始抱怨它不支持requireAdministrator。这个问题应该非常清楚。ClickOnce看到清单中需要提升高度(清单已成为应用程序的一部分)。我不确定您在这里还需要什么...
肯·怀特

4
@KenWhite:但是,将管理员要求与click结合使用会阻止您编译项目,而不仅仅是运行它,但这可能并不完全明显,也不合逻辑。
500-内部服务器错误

@ 500-InternalServerError,逻辑应该告诉您存在因果关系,原因仅在于以下事实,即添加“ requires Admin”会导致它无法编译,原因是与“不支持的requires Admin”有关。:-)
肯·怀特

1
问题不是我要使用ClickOnce和管理员权限,而是我要使用管理员权限,并且以前已经与他们进行了编译(大约10次),但是这次ClickOnce表示不兼容。
LMS

10
@KenWhite问题不像您建议的那么清楚。当您单击“发布”按钮时,就会发生此问题(至少对我有用)。我添加了清单并选择了“ requireAdministrator”,之后程序可以正常工作。只有当我单击“发布”时,我才开始收到此错误,并且无法清除它,直到进入设置并禁用了“ ClickOnce”。因此,解决方案不是不支持“ requireAdministrator”,而不能启用“ ClickOnce”,并且如果设置了“ requireAdministrator”,则不能单击“发布”。
加文·科茨

Answers:


147

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

无论您是否要单击“发布”,单击一次都将显示启用!如果您使用的是“ requireAdministrator”,则似乎无法使用ClickOnce,因此无法“发布”您的项目。


原版的:

原来,在“安全性”选项卡下,已选中“启用ClickOnce安全性设置”。即使我没有检查。无论如何,如果取消选中该选项,则会停止ClickOnce并给我错误。花费了一段时间才找到...


3
啊,我认为从您收到的错误消息中可以很明显地看出来;)
500-内部服务器错误

3
让我感到困惑的是我没有启用ClickOnce。
LMS

很好的问答,对我有帮助,谢谢!

29
无论您是否想要单击,只要单击“发布”,就会显示一次单击以启用该功能!如果您使用的是“ requireAdministrator”,则似乎无法使用ClickOnce,因此无法“发布”您的项目。
加文·科茨

1
@GavinCoates说的是正确的。原因是,始终按用户将ClickOnce应用程序安装在其AppData文件夹中。特权提升将导致甚至没有安装ClickOnce应用程序的用户上下文切换。
bertl 2015年

43

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

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

在此处输入图片说明


3
当您发布应用程序时,将再次选中此复选框。
dikkini

@dikkini,完全是!如何禁用它,任何人都有答案?
saidfagan

@saidfagan对于这种情况没有答案或解决方案。我使用util ULMerge合并exe和dll文件。
dikkini


16

我知道这很旧,但是我偶然发现了它以寻找答案。就我而言,我正在使用发布功能,我需要继续使用它。我还需要访问管理功能。因此,由于上述原因,以上答案均无济于事。

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

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

然后,您需要将其放在您的主要方法可以方便访问的位置。我正在使用WPF,所以我将其添加到MainWindow.xaml.cs,但是您可以在代码的任何早期添加它。请记住,如果需要,可以在这些方法中添加“静态”。

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.
}

希望这可以帮助!


它会启动一个新实例,根据定义,该实例不会附加到调试器。.(您调用新的免费(未附加)实例,并关闭附加到调试器的实例)
deadManN

1
@deadManN非常正确。我解决了这个问题,因为到那时我不需要调试器,但是我想您可以以管理员身份运行VS,然后该程序也将以管理员模式启动。跳过重启。我将对此进行测试以确保。
泰勒C

1
对于任何对此绊脚石的人,上面的方法实际上是有效的。
泰勒(Tyler C)

>>名称“应用程序”在当前上下文中不存在。错误
vee

这段代码仅启动新进程,但我的应用程序是控制台,因此参数保留为空。

5

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

保存所做的更改,发布完成的应用程序。:-)安全设置摘要


2

看看您的app.Manifest文件,您将看到以下内容:

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

注释中有说明,但是只需删除“ requireAdministrator”并将其插入就可以为我解决问题:

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

2
OP表示他们需要访问其应用程序中的注册表,因此这不是一种选择。
LeeCambl

requireAdministrator必须具有特权才能写入注册表,因此这是必要条件。
SkiSharp

ClickOnce不支持请求执行级别asInvoke
SkiSharp,

2

我有相同的问题,可以通过取消选中“ 启用ClickOnce安全设置” 来解决,以在Visual Studio中找到此选项,右键单击您的项目==>属性==>选择安全性==>启用ClickOnce安全设置(此选项为已经检查过,因此我未选中它,而我的问题得到了解决)。


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软件会阻止您的代码。


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!


1

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

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

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

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

可以按预期方式工作-例如,当我将其放在启用了UAC的系统上/以其最高设置运行时,.exe带有“防护罩”,而当我运行它时,即使以管理员身份登录,它升高,我得到UAC提示。

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


我遇到了完全相同的问题,以上答案均无效。我希望他们可以重新处理一次单击安全性设置。在大多数情况下,这是绝对必要且良好的功能,尤其是对于在线发布的应用程序,但是我希望只有本地发布的内容才有更好的选择/解决方法。
SkiSharp于

-12

只是

Imports System.security

并且U将不会出现任何错误,并且您的应用程序将以管理员身份运行


1
在大多数情况下,仅将引用分配给程序集将不会执行任何代码。没有更多的发布,这告诉我们什么。这篇文章是关于管理注册表编辑的要求,更具体地说是通过Visual Studio Publish选项进行部署,该选项会生成ClickOnce程序集。由于缺乏明确性或明显的相关性而被否决。
Anthony Mason

这...这不是 除了将行数增加1之外,这绝对不会做任何事情。引用程序集而不引用该程序集中的任何对象或调用方法绝对不会做任何事情。就像之前的评论一样。
SkiSharp
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.