所以我正在编写一个需要访问注册表的应用程序。
我没有触及任何构建设置,希望在添加其他触摸之前让事情正常工作,例如描述或名称。
出乎意料的是,我得到了一个不会消失的错误。 ClickOnce does not support the request execution level 'requireAdministrator'.
现在,我还没有触及此应用程序中的ClickOnce。我所做的只是包括一个请求这些权限的清单文件。
我现在的问题是这个错误不会消失,我无法编译我的程序。关于该怎么做的任何建议? (旁注:我准备去睡觉了,明天下午我会检查一下。)
答案 0 :(得分:136)
编辑:此评论也给出了一个很好的答案。
无论您是否想要,只要点击“发布”,点击一次就会启用!如果您使用“requireAdministrator”,则表明您无法使用ClickOnce,因此无法“发布”您的项目。
<强>原始强>
原来,在“安全”选项卡下,选中了“启用ClickOnce安全设置”。即使我没有检查它。 无论如何,取消选中停止ClickOnce给我的错误。这需要一段时间才能找到......
答案 1 :(得分:39)
我知道这是一个老问题,但两年后我来到这里是这样的:
您可以从项目属性的“安全”选项卡中禁用ClicKOnce以帮助解决问题;见下文:
答案 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”,这是完全正常的。
答案 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
和 您将不会收到任何错误,您的应用程序将以管理员身份运行