"ClickOnce не підтримує рівень виконання запиту 'requireAdministrator.'"


93

Тому я писав заявку, яка вимагає доступу до реєстру. Я не торкався жодних налаштувань збірки, бажаючи налагодити роботу, перш ніж додати інші штрихи, наприклад, опис чи назву.

Я несподівано отримую помилку, яка не зникне. ClickOnce does not support the request execution level 'requireAdministrator'.Тепер я не торкався ClickOnce у цій програмі. Все, що я зробив, - це включити файл маніфесту із запитом на ці дозволи.

Зараз моя проблема в тому, що ця помилка не зникне, і я не можу скомпілювати свою програму. Будь-яка порада, що робити? (Примітка: Я збираюся лягти спати, тому я перевірю це завтра вдень).


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

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

@ 500-InternalServerError, логіка повинна сказати вам, що причинно-наслідковий зв’язок існує просто завдяки тому, що додавання "вимагає адміністратора" призводить до того, що воно не компілюється через щось спільне з "адміністратор не підтримується", IMO. :-)
Кен Вайт

1
Проблема не в тому, що я хочу використовувати ClickOnce та дозволи адміністратора, проблема полягає в тому, що я хочу використовувати дозволи адміністратора і вже раніше (близько 10 разів) їх компілював з ними, але цього разу ClickOnce каже, що він несумісний.
LMS

10
@KenWhite проблема не така зрозуміла, як ви пропонуєте. Проблема виникає, коли ви натискаєте кнопку "опублікувати" (принаймні, це сталося для мене). Я додав маніфест і вибрав "requireAdministrator", після чого програма працювала бездоганно. Лише коли я натиснув "Опублікувати", я почав отримувати цю помилку і не міг її усунути, поки не зайшов у налаштування та не вимкнув "ClickOnce". Отже, рішення полягає не в тому, що "requireAdministrator" не підтримується, а в тому, що "ClickOnce" не може бути ввімкнено, і ви не можете натиснути "Опублікувати", якщо для вас встановлено "requireAdministrator".
Gavin Coates

Відповіді:


147

Редагувати: Цей коментар теж дає хорошу відповідь.

Клацніть один раз, щоб увімкнути його, коли ви натискаєте "Опублікувати", хочете ви цього чи ні! Якщо ви використовуєте "requireAdministrator", то, схоже, ви не можете використовувати ClickOnce, а отже, не можете "Опублікувати" свій проект.


Оригінал:

Виявляється, на вкладці Безпека було встановлено прапорець «Увімкнути налаштування безпеки ClickOnce». Хоча я цього не перевіряв. У будь-якому випадку, зняття позначки, що зупинило ClickOnce, дало мені помилки. Це зайняло деякий час, щоб знайти ...


3
Ах, я думав, що це очевидно з повідомлення про помилку, яке ви отримали;)
500 - Внутрішня помилка сервера

3
Мене збентежило те, що я не ввімкнув ClickOnce.
LMS

Гарне запитання та відповідь, це мені допомогло, дякую!
Moh

29
Клацніть один раз, щоб увімкнути його, коли ви натискаєте "Опублікувати", хочете ви цього чи ні! Якщо ви використовуєте "requireAdministrator", то, схоже, ви не можете використовувати ClickOnce, а отже, не можете "Опублікувати" свій проект.
Gavin Coates

1
Те, що каже @GavinCoates, є правильним. Причина полягає в тому, що програми ClickOnce завжди встановлюються на кожного користувача в його AppDataпапці. Підвищення привілеїв призведе до перемикання контексту користувача, де програма ClickOnce навіть не встановлена.
bertl

43

Я знаю це давнє запитання, але я прийшов сюди через два роки, тому:

Ви можете вимкнути ClicKOnce на вкладці Безпека у властивостях проекту, щоб допомогти вирішити проблему; Дивись нижче:

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


3
І коли ви опублікуєте свою програму, цей прапорець буде знову встановлений.
dikkini

@dikkini, саме так! як його відключити, хтось має відповідь?
saidfagan

@saidfagan не має відповіді чи рішення для цього випадку. Я використовую util 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 як адміністратор, і тоді програма також запустилася б в режимі адміністратора. пропуск перезапуску. Я перевірю це, щоб бути впевненим.
Тайлер С

1
Для тих, хто натрапляє на це, вищесказане насправді працює.
Тайлер С,

>> Назва "Програма" не існує у поточному контексті. помилка
vee

Цей код лише запускає новий процес, але мій додаток є консольним, тому аргументи залишаються порожніми.
ві

5

Цю дію можна досягти, вибравши "Увімкнути налаштування безпеки ClickOnce" (оскільки її не можна "зняти" під час публікації, як зазначено), а потім вибравши "Це часткова програма довіри". "Локальний інтранет" буде автоматично обраний у спадному меню, що цілком нормально.

Збережіть зміни, опублікуйте додаток, готові лижі. :-)Фрагмент налаштувань безпеки


2

Загляньте у свій додаток. Файл маніфесту, і ви побачите це:

 <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

Для кожного, хто зіткнувся з цим, я думав, що внесу те, що в підсумку працює на мене.

Так, параметр «Увімкнути налаштування безпеки ClickOnce» автоматично отримує повторну перевірку, якщо ви знімаєте прапорець, коли ви виконуєте « Збірка»> «Опублікувати» .

Для мене мені не потрібно "Публікувати" - це простий, портативний .exe, який створює заплановані завдання для моїх користувачів, і мені потрібно було переконатися, що воно підвищено, навіть коли ви ввійшли як адміністратор.

Тож я просто захопив свій останній файл .exe з \ bin \ Release, і саме це розгортається в системах моїх клієнтів.

Працював так, як очікувалося - тобто, коли я ставлю його в систему з увімкненим UAC / при найвищому рівні, .exe має на ньому "щит", і коли я запускаю його, навіть коли ввійшов до системи як адміністратор, він піднімається, і я отримую запит UAC.

Мій маленький додаток планувальника завдань тепер може створити завдання, не отримуючи помилку "Відмовлено у доступі" (яку раніше можна було вирішити, лише клацнувши правою кнопкою миші .exe та натиснувши Запустити від імені адміністратора).


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

-12

просто

Imports System.security

і U не отримає жодної помилки, і ваша програма працюватиме як адміністратор


1
Просто призначення посилання на збірку не буде виконувати будь-який код в більшості випадків. Якщо не розміщувати більше, це нічого не говорить нам. Ця публікація стосується вимоги редагування адміністративного реєстру та, зокрема, розгортання за допомогою опції Visual Studio Publish, яка генерує збірку ClickOnce. Проголосував за відсутність ясності або очевидну прихильність.
Ентоні Мейсон,

Це ... це ні. Це не призведе до абсолютно нічого, крім збільшення кількості ліній на 1. Посилання на збірку без посилання на будь-який об’єкт або метод виклику в цій збірці абсолютно нічого не зробить. Як і в попередньому коментарі.
SkiSharp
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.