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

Posted

技术标签:

【中文标题】“ClickOnce 不支持请求执行级别‘requireAdministrator’。”【英文标题】:"ClickOnce does not support the request execution level 'requireAdministrator.'" 【发布时间】:2012-06-16 22:46:38 【问题描述】:

所以我正在编写一个需要访问注册表的应用程序。 我没有触及任何构建设置,希望在我添加其他内容(例如描述或名称)之前让它工作。 出乎意料的是,我得到一个不会消失的错误。 ClickOnce does not support the request execution level 'requireAdministrator'. 现在,我还没有在这个应用程序中接触过 ClickOnce。我所做的只是包含一个请求这些权限的清单文件。 我现在的问题是这个错误不会消失,我无法编译我的程序。关于做什么的任何建议? (旁注:我要睡觉了,所以明天下午我会检查一下)。

【问题讨论】:

我不想在这里说明显的,但是你添加了一个请求requireAdministrator权限的清单并且ClickOnce开始抱怨它不支持requireAdministrator。问题应该非常清楚。 ClickOnce 在您的清单中看到了提升的需要(它成为您应用程序的一部分)。我不确定您还需要什么... @KenWhite:然而,管理员要求结合单击一次可能会阻止您编译项目,而不仅仅是运行它,这可能并不完全明显也不合乎逻辑 -但确实如此。 @500-InternalServerError,逻辑应该告诉你因果关系的存在仅仅是因为添加“需要管理员”会导致它因为与“需要管理员不支持”有关而无法编译,国际海事组织。 :-) 问题不是我要使用ClickOnce和管理员权限,问题是我要使用管理员权限,之前和他们编译过(大约10次),但是这次是ClickOnce是说它不兼容。 @KenWhite 问题并不像你建议的那么清楚。当您单击“发布”按钮时会出现问题(至少对我来说是这样)。我添加了清单并选择了“requireAdministrator”,之后程序完美运行。只有当我单击发布时,我才开始收到此错误,并且无法清除它,直到我进入设置并禁用“ClickOnce”。所以解决的办法不是不支持“requireAdministrator”,而是不能启用“ClickOnce”,如果设置了“requireAdministrator”就不能点击“Publish”。 【参考方案1】:

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

无论您是否愿意,只要单击“发布”,单击一次就会启用!如果您使用的是“requireAdministrator”,那么您似乎无法使用 ClickOnce,因此无法“发布”您的项目。


原文:

原来在“安全”选项卡下,“启用 ClickOnce 安全设置”已被选中。尽管我没有检查它。 无论如何,取消选中停止 ClickOnce 给我的错误。找了好久……

【讨论】:

啊,我认为这从您收到的错误消息中很明显;) 让我困惑的是我没有启用 ClickOnce。 好问题和答案,它帮助了我,谢谢! 点击一次似乎会在您点击“发布”时启用,无论您是否愿意!如果您使用的是“requireAdministrator”,那么您似乎无法使用 ClickOnce,因此无法“发布”您的项目。 @GavinCoates 说的是正确的。原因是 ClickOnce 应用程序始终按用户安装在其AppData 文件夹中。特权提升将导致用户上下文切换,甚至没有安装 ClickOnce 应用程序。【参考方案2】:

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

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

【讨论】:

当您发布您的应用程序时,此复选框将再次被选中。 @dikkini,没错!如何禁用它,有人有答案吗? @saidfagan 对于这种情况没有答案或解决方案。我使用 util ULMerge 来组合 exe 和 dll 文件。 这对我有用,如果我必须一直禁用复选框也没关系【参考方案3】:

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

【讨论】:

【参考方案4】:

我知道这是旧的,但我偶然发现它寻找答案。就我而言,我正在使用发布功能,我需要继续使用它。我还需要访问管理功能。因此,出于这个原因,上述答案都不适合我。

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

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

然后你需要把它放在你的 main 方法可以方便地访问的地方。我正在使用 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 非常正确。我解决了这个问题,因为到那时我不需要调试器,但我想你可以以管理员身份运行 VS,然后程序也会以管理员模式启动。跳过重启。我会对此进行测试以确保。 对于任何偶然发现这一点的人,上述方法确实有效。 @vee for Winform 项目只需删除Application.Current.Shutdown(); 并使用return 退出Main() 即可正常工作。 对于您需要的新 .net core winform 应用程序:proc.FileName = Assembly.GetEntryAssembly().Location.Replace(".dll", ".exe"); (因为 1. 代码库已过时,2 程序集是“xyz.dll”而不是“xyz.exe”)【参考方案5】:

对于那些使用取消选中“启用ClickOnce安全设置”无法工作的人,请尝试我找到的方法。

首先,将您的 app.manifest requestedExecutionLevel 项保持原样:

<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!

【讨论】:

【参考方案6】:

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

保存您的更改,发布应用程序,完成滑雪。 :-)

【讨论】:

【参考方案7】:

我有同样的问题,我通过取消选中“启用 ClickOnce 安全设置”来解决它 要在 Visual Studio 中找到此选项,请右键单击您的 Project ==>properties==>Select Security==> Enable ClickOnce security settings(此选项已被选中,因此我未选中它,我的问题得到解决)。

【讨论】:

【参考方案8】:

这是 VB.NET 的代码 sn-p

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

【讨论】:

【参考方案9】:

对于遇到这种情况的任何人,我想我会贡献最终对我有用的东西。

是的,“启用 ClickOnce 安全设置”选项会自动重新检查,如果您取消选中它,当您执行 Build > Publish

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

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

按预期工作 - 即当我将它放在启用了 UAC 的系统上/在其最高设置时,.exe 上面有“屏蔽”,当我运行它时,即使登录为管理员,它提升,我得到 UAC 提示。

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

【讨论】:

我遇到了同样的问题,但上述答案均无效。我希望他们会在安全设置后重新进行单击。在大多数情况下绝对必要且是一个很好的功能,尤其是对于在线发布的应用程序,但是我希望只有本地出版物有更好的选择/解决方法。【参考方案10】:

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

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

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

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

【讨论】:

OP 说他们需要在他们的应用程序中访问注册表,所以这不是一个选项。 requireAdministrator 权限需要写入注册表,所以这是一个要求。 ClickOnce 不支持请求执行级别asInvoke 某些 DLL 不允许您设置 "asInvoke"【参考方案11】:

只是

Imports System.security

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

【讨论】:

在大多数情况下,仅将引用单独分配给程序集不会执行任何代码。没有更多的发布,这告诉我们什么。这篇文章是关于管理注册表编辑的要求,更具体地说,是通过生成 ClickOnce 程序集的 Visual Studio 发布选项进行部署。由于缺乏明确性或明显相关性而被否决。 这...这是一个不。除了将您的行数增加 1 之外,这绝对不会做任何事情。引用一个程序集而不引用该程序集中的任何对象或调用方法将绝对不会做任何事情。就像之前的评论所说的那样。

以上是关于“ClickOnce 不支持请求执行级别‘requireAdministrator’。”的主要内容,如果未能解决你的问题,请参考以下文章