«ClickOnce не поддерживает уровень выполнения запроса requireAdministrator».


95

Итак, я писал приложение, требующее доступа к реестру. Я не касался каких-либо настроек сборки, желая, чтобы все работало, прежде чем я добавляю другие штрихи, такие как описание или имя.

Совершенно неожиданно я получаю ошибку, которая никуда не делась. ClickOnce does not support the request execution level 'requireAdministrator'.Я не касался ClickOnce в этом приложении. Все, что я сделал, это включил файл манифеста, запрашивающий эти разрешения.

Моя проблема сейчас в том, что эта ошибка не исчезнет, ​​и я не могу скомпилировать свою программу. Есть совет, что делать? (Примечание: я иду спать, поэтому проверю завтра днем).


4
Я не хочу говорить об очевидном здесь, но вы добавили манифест, запрашивающий requireAdministratorразрешения, и ClickOnce начал жаловаться, что он не поддерживаетrequireAdministrator . Проблема должна быть предельно ясной. ClickOnce видит необходимость повышения прав в вашем манифесте (который становится частью вашего приложения). Я не уверен, что еще вам нужно здесь ...
Кен Уайт

4
@KenWhite: Однако, возможно, не совсем очевидно и логично, что требование администратора в сочетании с однократным щелчком не позволяет вам скомпилировать проект, а не просто запустить его, но это так.
500 - Внутренняя ошибка сервера

@ 500-InternalServerError, логика должна сказать вам, что причинно-следственная связь существует просто из-за того, что добавление «требует администратора» приводит к тому, что он не компилируется из-за чего-то, связанного с «требует, чтобы администратор не поддерживался», ИМО. :-)
Ken White

1
Проблема не в том, что я хочу использовать разрешения ClickOnce и администратора, проблема в том, что я хочу использовать разрешения администратора и скомпилировал его ранее (около 10 раз) с ними, но на этот раз ClickOnce говорит, что это несовместимо.
LMS

10
@KenWhite проблема не так очевидна, как вы предполагаете. Проблема возникает, когда вы нажимаете кнопку «опубликовать» (по крайней мере, для меня). Я добавил манифест и выбрал «requireAdministrator», после чего программа заработала безупречно. Только когда я нажал кнопку «Опубликовать», я начал получать эту ошибку и не мог ее очистить, пока я не зашел в настройки и не отключил «ClickOnce». Таким образом, решение не в том, что «requireAdministrator» не поддерживается, а в том, что «ClickOnce» не может быть включен, и вы не можете нажать «Опубликовать», если у вас установлен «requireAdministrator».
Гэвин Коутс

Ответы:


148

Изменить: этот комментарий тоже дает хороший ответ.

Нажмите один раз, чтобы активировать его всякий раз, когда вы нажимаете «Опубликовать», хотите вы этого или нет! Если вы используете requireAdministrator, то окажется, что вы не можете использовать ClickOnce и, следовательно, не можете «опубликовать» свой проект.


Оригинал:

Оказывается, на вкладке «Безопасность» был установлен флажок «Включить параметры безопасности ClickOnce». Хотя я не проверял. В любом случае, снятие флажка остановило ClickOnce, чтобы выдавать мне ошибки. Потребовалось время, чтобы найти ...


3
Ах, я подумал, что это очевидно из сообщения об ошибке, которое вы получили;)
500 - Internal Server Error

3
Меня смутило то, что я не включил ClickOnce.
LMS

Хороший вопрос и ответ, мне помогло, спасибо!
Мох

29
Нажмите один раз, чтобы активировать его всякий раз, когда вы нажимаете «Опубликовать», хотите вы этого или нет! Если вы используете «requireAdministrator», то окажется, что вы не можете использовать ClickOnce и, следовательно, не можете «опубликовать» свой проект.
Гэвин Коутс

1
То, что говорит @GavinCoates, правильно. Причина в том, что приложения ClickOnce всегда устанавливаются для каждого пользователя в свою AppDataпапку. Повышение привилегий приведет к переключению пользовательского контекста, в котором приложение ClickOnce даже не установлено.
Bertl

44

Я знаю, что это старый вопрос, но я пришел сюда два года спустя, поэтому:

Вы можете отключить ClicKOnce на вкладке «Безопасность» в свойствах проекта, чтобы решить эту проблему; увидеть ниже:

введите описание изображения здесь


3
И когда вы опубликуете свое приложение, этот флажок будет снова установлен.
dikkini

@dikkini, точно! как отключить, есть у кого ответ?
saidfagan

@saidfagan нет ответа или решения по этому делу. Я использую утилиту ULMerge для объединения файлов exe и dll.
dikkini

Это работает для меня, не имеет значения, нужно ли мне постоянно отключать этот флажок
Профессор Зум,

18

Если вы когда-либо использовали мастер публикации или «Опубликовать сейчас», флажок «Щелкнуть один раз» будет установлен автоматически ...


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 как администратор, и тогда программа также будет запущена в режиме администратора. пропуская перезагрузку. Я проверю это, чтобы быть уверенным.
Tyler C

1
Для любого, кто наткнется на это, приведенное выше действительно работает.
Tyler C

>> Название «Приложение» не существует в текущем контексте. error
vee

Этот код запускает только новый процесс, но мое приложение является консольным, поэтому аргументы просто остаются пустыми.
vee

5

Это действие можно выполнить, выбрав «Включить параметры безопасности ClickOnce» (поскольку его нельзя «снять» во время публикации, как указано), а затем выбрав «Это приложение с частичным доверием». "Местная интрасеть" будет автоматически выбрана в раскрывающемся меню, и это нормально.

Сохраняем изменения, публикуем заявку, готово-лыжи. :-)Фрагмент настроек безопасности


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


1

Для всех, кто сталкивался с этим, я подумал, что внесу свой вклад в то, что в итоге сработало для меня.

Да, параметр «Включить параметры безопасности ClickOnce» автоматически проверяется повторно, если вы его снимаете, когда вы выполняете « Сборка»> «Опубликовать» .

Мне не нужно «публиковать» - это простой переносимый .exe, который создает запланированные задачи для моих пользователей, и мне нужно было убедиться, что он повышен, даже когда вы вошли в систему как администратор.

Итак, я просто взял свой последний .exe из \ bin \ Release и это то, что развернулось в системах моих клиентов.

Работает так, как ожидалось - то есть когда я помещаю его в систему с включенным UAC / с максимальным значением, на .exe есть «щит», и когда я запускаю его, даже когда я вошел в систему как администратор, он поднимается, и я получаю приглашение UAC.

Мое маленькое приложение-планировщик задач теперь может создавать задачи без появления ошибки «Доступ запрещен» (которую раньше можно было обойти, только щелкнув правой кнопкой мыши файл .exe и выбрав «Запуск от имени администратора»).


1
У меня была такая же проблема, и ни один из приведенных выше ответов не помог. Я бы хотел, чтобы они переделали щелчок один раз в настройках безопасности. Абсолютно необходимая и хорошая функция в большинстве случаев, особенно для приложений, публикуемых в Интернете, однако я бы хотел, чтобы был лучший вариант / обходной путь только для местных публикаций.
SkiSharp

-12

только

Imports System.security

и U не получит ошибки, и ваше приложение будет запущено от имени администратора


1
Простое присвоение ссылки на сборку в большинстве случаев не приведет к выполнению какого-либо кода. Без дополнительных сообщений это нам ничего не говорит. Этот пост касается требований административного редактирования реестра и, в частности, развертывания с помощью параметра публикации Visual Studio, который генерирует сборку ClickOnce. Проголосовали против из-за отсутствия ясности или очевидной релевантности.
Энтони Мейсон

Это ... это нет. Это не сделает абсолютно ничего, кроме увеличения количества строк на 1. Обращение к сборке без ссылки на какой-либо объект или вызывающий метод в этой сборке абсолютно ничего не даст. Как и в предыдущем комментарии.
SkiSharp
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.