„ClickOnce nie obsługuje poziomu wykonania żądania„ requireAdministrator ”.”

95

Pisałem więc aplikację, która wymaga dostępu do rejestru. Nie dotknąłem żadnych ustawień kompilacji, chcąc, aby rzecz działała, zanim dodałem inne elementy, takie jak opis lub nazwa.

Niespodziewanie wyskakuje mi błąd, który nie znika. ClickOnce does not support the request execution level 'requireAdministrator'.Teraz nie dotknąłem ClickOnce w tej aplikacji. Wszystko, co zrobiłem, to załączyć plik manifestu z prośbą o te uprawnienia.

Mój problem polega na tym, że ten błąd nie zniknie i nie mogę skompilować programu. Jakieś rady, co robić? (Na marginesie: idę spać, więc sprawdzę jutro po południu).

LMS
źródło
4
Nienawidzę mówićrequireAdministrator tutaj tego, co oczywiste, ale dodałeś manifest z prośbą o uprawnienia, a ClickOnce zaczął narzekać, że nie obsługujerequireAdministrator . Problem powinien być bardzo jasny. ClickOnce widzi potrzebę podniesienia uprawnień w Twoim manifeście (który staje się częścią Twojej aplikacji). Nie jestem pewien, czego więcej tutaj potrzebujesz ...
Ken White
4
@KenWhite: Być może nie jest jednak całkowicie oczywiste ani logiczne, że wymóg administratora w połączeniu z jednokrotnym kliknięciem uniemożliwia skompilowanie projektu, a nie tylko jego uruchomienie - ale tak.
500 - Wewnętrzny błąd serwera,
@ 500-InternalServerError, logika powinna ci powiedzieć, że związek przyczynowy istnieje po prostu przez fakt, że dodanie „wymaga administratora” powoduje, że nie kompiluje się z powodu czegoś związanego z „nie wymaga obsługi administracyjnej”, IMO. :-)
Ken White
1
Problem nie polega na tym, że chcę używać ClickOnce i uprawnień administratora, problemem jest to, że chcę korzystać z uprawnień administratora i skompilowałem je wcześniej (około 10 razy) z nimi, ale tym razem ClickOnce mówi, że jest niekompatybilny.
LMS
10
@KenWhite problem nie jest tak jasny, jak sugerujesz. Problem pojawia się po kliknięciu przycisku „publikuj” (przynajmniej w moim przypadku). Dodałem manifest i wybrałem „requireAdministrator”, po czym program działał bez zarzutu. Dopiero gdy kliknąłem publikuj, zacząłem otrzymywać ten błąd i nie mogłem go wyczyścić, dopóki nie przeszedłem do ustawień i nie wyłączyłem „ClickOnce”. Rozwiązanie nie polega więc na tym, że opcja „requireAdministrator” nie jest obsługiwana, ale że opcja „ClickOnce” nie może być włączona i nie można kliknąć opcji „Publikuj”, jeśli ustawiono opcję „requireAdministrator”.
Gavin Coates,

Odpowiedzi:

148

Edycja: ten komentarz również daje dobrą odpowiedź.

Kliknij raz pojawi się, aby włączyć się za każdym razem, gdy klikniesz „Opublikuj”, czy tego chcesz, czy nie! Jeśli używasz „requireAdministrator”, to wygląda na to, że nie możesz użyć ClickOnce i dlatego nie możesz „opublikować” swojego projektu.


Oryginał:

Okazuje się, że w zakładce Zabezpieczenia zaznaczono opcję „Włącz ustawienia zabezpieczeń ClickOnce”. Chociaż tego nie sprawdziłem. W każdym razie, odznaczenie tego zatrzymało ClickOnce, powodując błędy. Trochę czasu zajęło znalezienie ...

LMS
źródło
3
Ach, myślałem, że to oczywiste z komunikatu o błędzie, który otrzymałeś;)
500 - Wewnętrzny błąd serwera
3
Zmyliło mnie to, że nie włączyłem ClickOnce.
LMS,
Dobre pytanie i odpowiedź, pomogło mi, dzięki!
Moh,
29
Kliknij raz pojawi się, aby włączyć się za każdym razem, gdy klikniesz „Opublikuj”, czy tego chcesz, czy nie! Jeśli używasz „requireAdministrator”, to wygląda na to, że nie możesz użyć ClickOnce i dlatego nie możesz „opublikować” swojego projektu.
Gavin Coates,
1
To, co mówi @GavinCoates, jest poprawne. Powodem jest to, że aplikacje ClickOnce są zawsze instalowane na użytkownika w jego AppDatafolderze. Podniesienie uprawnień spowodowałoby zmianę kontekstu użytkownika, w którym aplikacja ClickOnce nie jest nawet zainstalowana.
bertl
44

Wiem, że to stare pytanie, ale przyjechałem tu dwa lata później, więc:

Aby pomóc w rozwiązaniu problemu, możesz wyłączyć ClicKOnce z zakładki Bezpieczeństwo we właściwościach projektu; patrz poniżej:

wprowadź opis obrazu tutaj

t_plusplus
źródło
3
A kiedy opublikujesz swoją aplikację, to pole wyboru zostanie ponownie zaznaczone.
dikkini
@dikkini, dokładnie! jak to wyłączyć, ktoś ma odpowiedź?
powiedział fagan
@saidfagan nie ma odpowiedzi ani rozwiązania w tej sprawie. Używam ULMerge do łączenia plików exe i dll.
dikkini
To działa dla mnie, nie ma znaczenia, czy muszę cały czas wyłączać pole wyboru
Professor Zoom
18

Jeśli kiedykolwiek użyjesz kreatora publikowania lub opcji „Opublikuj teraz”, pole wyboru jednorazowego kliknięcia zostanie automatycznie zaznaczone ...

Victor Rosu
źródło
16

Wiem, że to stare, ale natknąłem się na to, szukając odpowiedzi. W moim przypadku używam funkcji publikowania i muszę jej nadal używać. Potrzebuję też dostępu do funkcji administratora. Z tego powodu żadna z powyższych odpowiedzi nie zadziałała.

Skończyło się na dodaniu metody na samym początku mojej aplikacji, która sprawdza, czy jest uruchomiona jako administrator, a jeśli nie, ponownie uruchom się jako administrator. Aby to zrobić, potrzebujesz następujących odniesień.

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

Następnie musisz umieścić to w miejscu, do którego Twoja główna metoda ma wygodny dostęp. Używam WPF, więc dodałem go do MainWindow.xaml.cs, ale możesz dodać go w dowolnym miejscu na początku kodu. Pamiętaj tylko, aby dodać „statyczne” do tych metod, jeśli tego potrzebujesz.

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

Na koniec dodaj odniesienie do metody na początku programu. W moim przypadku dodałem go do MainWindow, ale dodanie go do Main też działa.

public MainWindow()
{
    InitializeComponent();
    AdminRelauncher(); //This is the only important line here, add it to a place it gets run early on.
}

Mam nadzieję że to pomoże!

Tyler C.
źródło
uruchamia nową instancję, która zgodnie z definicją nie jest dołączana do debuggera .. (wywołujesz nową wolną (niedołączoną) instancję i
zamykasz
1
@deadManN bardzo prawdziwe. Poradziłem sobie z tym, ponieważ nie potrzebowałem debugera do tego momentu, ale przypuszczam, że możesz uruchomić VS jako administrator, a następnie program zostałby również uruchomiony w trybie administratora. pomijanie restartu. Przetestuję to dla pewności.
Tyler C
1
Dla każdego, kto się na to natknie, powyższe w rzeczywistości działa.
Tyler C
>> Nazwa „Aplikacja” nie istnieje w obecnym kontekście. błąd
vee
Ten kod uruchamia tylko nowy proces, ale moja aplikacja jest konsolą, więc argumenty pozostawiają puste.
vee
5

Tę czynność można wykonać, wybierając opcję „Włącz ustawienia zabezpieczeń ClickOnce” (ponieważ nie można jej „usunąć zaznaczenia” podczas publikowania, jak wspomniano), a następnie wybierając opcję „To jest częściowo zaufana aplikacja”. „Lokalny intranet” zostanie automatycznie wybrany z rozwijanego menu, co jest w porządku.

Zapisz zmiany, opublikuj aplikację, gotowe narty. :-)Fragment ustawień zabezpieczeń

CodeBreaker
źródło
2

Spójrz na swoją aplikację. Plik Manifest, a zobaczysz to:

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

W komentarzach są instrukcje, ale samo usunięcie „requireAdministrator” i wstawienie tego w to miejsce rozwiązało problem:

 <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
Brian
źródło
2
OP twierdzi, że potrzebują dostępu do rejestru w swojej aplikacji, więc nie ma takiej opcji.
LeeCambl
requireAdministratorwymagane jest uprawnienie do zapisu w rejestrze, więc byłby to wymóg.
SkiSharp
ClickOnce nie obsługuje poziomu wykonania żądaniaasInvoke
SkiSharp
2

Mam ten sam problem i rozwiązuję go, usuwając zaznaczenie opcji „ Włącz ustawienia zabezpieczeń ClickOnce”. Aby znaleźć tę opcję w programie Visual Studio, kliknij prawym przyciskiem myszy projekt ==> właściwości ==> Wybierz zabezpieczenia ==> Włącz ustawienia zabezpieczeń ClickOnce (ta opcja była już zaznaczone, więc odznaczyłem to i mój problem został rozwiązany).

Ragnar
źródło
2

Oto fragment kodu dla 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"})

EDYCJA: Ale jeśli wdrażasz w ten sposób, niektóre oprogramowanie AV blokuje twój kod.

Tzwenni
źródło
1

Dla tych, którzy używają odznacz „Włącz ustawienia zabezpieczeń ClickOnce”, nie mogą działać, aby wypróbować metodę, którą znalazłem.

Najpierw pozostaw element app.manifest requiredExecutionLevel bez zmian:

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

Następnie edytuj plik Program.cs w ten sposób:

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

restrukturyzuj główną metodę, taką jak:

    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());
            }
        }

Działa na Windows 10 i Visual Studio 2019!

malajisi
źródło
1

Pomyślałem, że każdemu, kto na to wpadł, oddam to, co w końcu zadziałało.

Tak, opcja `` Włącz ustawienia zabezpieczeń ClickOnce '' zostanie automatycznie ponownie zaznaczona, jeśli ją odznaczysz, kiedy zrobisz Kompiluj> Publikuj .

Nie muszę „publikować” - to prosty, przenośny plik .exe, który tworzy zaplanowane zadania dla moich użytkowników i musiałem upewnić się, że jest podniesiony, nawet gdy jestem zalogowany jako administrator.

Więc właśnie pobrałem mój najnowszy plik .exe z \ bin \ Release i właśnie to zostaje wdrożone w systemach moich klientów.

Działał zgodnie z oczekiwaniami - tj. Kiedy umieszczam go w systemie z włączonym UAC / przy najwyższym ustawieniu, plik .exe ma na sobie `` osłonę '', a kiedy go uruchamiam, nawet gdy jestem zalogowany jako Administrator, podnosi się i pojawia się monit UAC.

Moja mała aplikacja do planowania zadań może teraz tworzyć zadanie bez wyświetlania błędu „Odmowa dostępu” (który wcześniej można było obejść tylko przez kliknięcie prawym przyciskiem myszy pliku .exe i kliknięcie Uruchom jako administrator).

Samskara
źródło
Miałem dokładnie ten sam problem i żadna z powyższych odpowiedzi nie działała. Chciałbym, aby ponownie uruchomili kliknięcie po ustawieniach zabezpieczeń. W większości przypadków absolutnie konieczna i dobra funkcja, szczególnie w przypadku aplikacji publikowanych online, jednak żałuję, że nie ma lepszej opcji / obejścia tylko dla lokalnych publikacji.
SkiSharp
-12

właśnie

Imports System.security

a U nie pojawi się żaden błąd, a Twoja aplikacja będzie działać jako administrator

Aditya
źródło
1
Zwykłe przypisanie odwołania do samego zestawu nie spowoduje wykonania żadnego kodu w większości przypadków. Bez dalszych opublikowanych nic nam to nie mówi. Ten wpis dotyczy wymagania administracyjnego edytowania rejestru, a dokładniej wdrażania za pośrednictwem opcji Visual Studio Publish, która generuje zestaw ClickOnce. Głosowano w dół z powodu braku jasności lub widocznego znaczenia.
Anthony Mason
To ... to jest nie. Nie da to absolutnie nic poza zwiększeniem liczby linii o 1. Odwołanie się do zestawu bez odniesienia do żadnego obiektu lub metody wywołującej w tym zestawie nie da absolutnie nic. Jak w poprzednim komentarzu.
SkiSharp