"ClickOnce unterstützt die Anforderungsausführungsebene 'requireAdministrator' nicht."

91

Also habe ich eine Anwendung geschrieben, die Zugriff auf die Registrierung erfordert. Ich hatte keine Build-Einstellungen berührt und wollte das Ding zum Laufen bringen, bevor ich die anderen Berührungen wie eine Beschreibung oder einen Namen hinzufügte.

Aus heiterem Himmel erhalte ich einen Fehler, der nicht verschwindet. ClickOnce does not support the request execution level 'requireAdministrator'.Jetzt hatte ich ClickOnce in dieser Anwendung nicht berührt. Ich hatte lediglich eine Manifestdatei beigefügt, in der diese Berechtigungen angefordert wurden.

Mein Problem ist jetzt, dass dieser Fehler nicht behoben wird und ich mein Programm nicht kompilieren kann. Irgendwelche Ratschläge, was zu tun ist? (Randnotiz: Ich gehe gleich ins Bett, also werde ich das morgen nachmittag überprüfen).

LMS
quelle
4
Ich hasse es, hier das Offensichtliche zu sagen, aber Sie haben ein Manifest hinzugefügt, in dem requireAdministratorBerechtigungen angefordert wurden , und ClickOnce hat angefangen, sich darüber zu beschweren, dass es nicht unterstützt wirdrequireAdministrator . Das Problem sollte sehr klar sein. ClickOnce sieht die Notwendigkeit einer Erhöhung in Ihrem Manifest (das Teil Ihrer Anwendung wird). Ich bin nicht sicher, was Sie hier mehr brauchen ...
Ken White
4
@ KenWhite: Es ist jedoch vielleicht nicht ganz offensichtlich oder logisch, dass die Administratoranforderung in Kombination mit einmaligem Klicken Sie daran hindert , das Projekt zu kompilieren , nicht nur auszuführen, sondern es auch.
500 - Interner
@ 500-InternalServerError, Logik sollte Ihnen sagen, dass ein Kausalzusammenhang einfach dadurch besteht, dass das Hinzufügen von "erfordert Admin" dazu führt, dass es nicht kompiliert wird, weil etwas mit "erfordert Admin nicht unterstützt" zu tun hat, IMO. :-)
Ken White
1
Das Problem ist nicht, dass ich ClickOnce- und Administratorberechtigungen verwenden möchte, sondern dass ich Administratorberechtigungen verwenden möchte und diese zuvor (ungefähr 10 Mal) mit ihnen kompiliert habe. Diesmal sagt ClickOnce jedoch, dass sie nicht kompatibel sind.
LMS
9
@ KenWhite das Problem ist nicht so klar, wie Sie vorschlagen. Das Problem tritt auf, wenn Sie auf die Schaltfläche "Veröffentlichen" klicken (zumindest für mich). Ich fügte das Manifest hinzu und wählte "requireAdministrator" aus, wonach das Programm einwandfrei funktionierte. Erst als ich auf "Veröffentlichen" geklickt habe, wurde dieser Fehler angezeigt und konnte ihn nicht beheben, bis ich in die Einstellungen ging und "ClickOnce" deaktivierte. Die Lösung besteht also nicht darin, dass "requireAdministrator" nicht unterstützt wird, sondern dass "ClickOnce" nicht aktiviert werden kann und Sie nicht auf "Publish" klicken können, wenn Sie "requireAdministrator" festgelegt haben.
Gavin Coates

Antworten:

147

Bearbeiten: Dieser Kommentar gibt auch eine gute Antwort.

Ein einmaliger Klick wird aktiviert, wenn Sie auf "Veröffentlichen" klicken, ob Sie dies möchten oder nicht! Wenn Sie "requireAdministrator" verwenden, können Sie ClickOnce anscheinend nicht verwenden und Ihr Projekt daher nicht "veröffentlichen".


Original:

Es stellte sich heraus, dass auf der Registerkarte "Sicherheit" die Option "ClickOnce-Sicherheitseinstellungen aktivieren" aktiviert war. Obwohl ich es nicht überprüft habe. Wenn Sie das Kontrollkästchen deaktivieren, wird ClickOnce nicht mehr angezeigt und es treten Fehler auf. Es hat eine Weile gedauert, bis wir ...

LMS
quelle
3
Ah, ich dachte, das wäre offensichtlich aus der Fehlermeldung, die Sie erhalten haben;)
500 - Interner Serverfehler
3
Was mich verwirrt hatte, war, dass ich ClickOnce nicht aktiviert habe.
LMS
Gute Frage und Antwort, es hat mir geholfen, danke!
Moh
29
Ein einmaliger Klick wird aktiviert, wenn Sie auf "Veröffentlichen" klicken, ob Sie dies möchten oder nicht! Wenn Sie "requireAdministrator" verwenden, können Sie ClickOnce anscheinend nicht verwenden und Ihr Projekt daher nicht "veröffentlichen".
Gavin Coates
1
Was @GavinCoates sagt, ist richtig. Der Grund dafür ist, dass ClickOnce-Anwendungen immer pro Benutzer in seinem AppDataOrdner installiert werden . Die Erhöhung der Berechtigungen würde zu einem Wechsel des Benutzerkontexts führen, in dem die ClickOnce-Anwendung nicht einmal installiert ist.
Bertl
43

Ich weiß, dass dies eine alte Frage ist, aber ich kam zwei Jahre später hierher, also:

Sie können ClicKOnce auf der Registerkarte Sicherheit in den Projekteigenschaften deaktivieren, um das Problem zu beheben. siehe unten:

Geben Sie hier die Bildbeschreibung ein

t_plusplus
quelle
3
Und wenn Sie Ihre Anwendung veröffentlichen, wird dieses Kontrollkästchen erneut aktiviert.
Dikkini
@dikkini, genau! Wie man es deaktiviert, hat jemand eine Antwort?
sagte Fagan
@saidfagan keine Antwort oder Lösung für diesen Fall. Ich benutze util ULMerge, um exe- und dll-Dateien zu kombinieren.
Dikkini
18

Wenn Sie jemals den Veröffentlichungsassistenten oder "Jetzt veröffentlichen" verwenden, wird das Kontrollkästchen "Einmal klicken" automatisch aktiviert ...

Victor Rosu
quelle
15

Ich weiß, dass dies alt ist, aber ich bin darüber gestolpert und habe nach Antworten gesucht. In meinem Fall verwende ich die Veröffentlichungsfunktion und muss sie weiterhin verwenden. Ich benötige auch Zugriff auf Verwaltungsfunktionen. Aus diesem Grund hat keine der oben genannten Antworten für mich funktioniert.

Am Ende meiner Anwendung habe ich eine Methode hinzugefügt, die überprüft, ob sie als Administrator ausgeführt wird, und wenn dies nicht der Fall ist, starten Sie sich selbst als Administrator neu. Dazu müssen die folgenden Referenzen hinzugefügt werden.

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

Dann müssen Sie dies an einer Stelle ablegen, auf die Ihre Hauptmethode praktisch zugreifen kann. Ich verwende WPF, also habe ich es zu MainWindow.xaml.cs hinzugefügt, aber Sie können es überall früh in Ihrem Code hinzufügen. Denken Sie daran, diesen Methoden "statisch" hinzuzufügen, falls Sie sie benötigen.

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

Fügen Sie zu Beginn Ihres Programms einen Verweis auf die Methode hinzu. In meinem Fall habe ich es zu MainWindow hinzugefügt, aber das Hinzufügen zu Main funktioniert auch.

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

Hoffe das hilft!

Tyler C.
quelle
Es wird eine neue Instanz gestartet, die per Definition nicht an den Debugger angehängt wird. (Sie rufen eine neue freie (nicht angehängte) Instanz auf und schließen die an den Debugger angehängte Instanz.)
deadManN
1
@deadManN sehr wahr. Ich habe es umgangen, da ich den Debugger zu diesem Zeitpunkt noch nicht brauchte, aber ich nehme an, Sie könnten VS als Administrator ausführen, und dann würde das Programm auch im Administratormodus gestartet. Überspringen des Neustarts. Ich werde das testen, um sicher zu sein.
Tyler C
1
Für jeden, der darüber stolpert, funktioniert das oben Genannte tatsächlich.
Tyler C
>> Der Name 'Anwendung' existiert im aktuellen Kontext nicht. Fehler
vee
Dieser Code startet nur einen neuen Prozess, aber meine App ist eine Konsole, sodass die Argumente einfach leer bleiben.
Vee
5

Diese Aktion kann erreicht werden, indem Sie "ClickOnce-Sicherheitseinstellungen aktivieren" auswählen (da sie wie angegeben während einer Veröffentlichung nicht "deaktiviert" werden kann) und dann "Dies ist eine teilweise Vertrauensstellung" auswählen. "Lokales Intranet" wird automatisch im Dropdown-Menü ausgewählt, was vollkommen in Ordnung ist.

Speichern Sie Ihre Änderungen, veröffentlichen Sie die Anwendung, fertig-Ski. :-)Snippet für Sicherheitseinstellungen

Codeknacker
quelle
3

Werfen Sie einen Blick in Ihre App.Manifest-Datei und Sie werden Folgendes sehen:

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

Es gibt Anweisungen in den Kommentaren, aber nur das Löschen des "requireAdministrator" und das Einfügen dieser ist das Problem für mich gelöst:

 <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
Brian
quelle
2
OP sagt, dass sie Zugriff auf die Registrierung in ihrer Anwendung benötigen, daher ist dies keine Option.
LeeCambl
2

Ich habe das gleiche Problem. Ich behebe es, indem ich die Option " ClickOnce-Sicherheitseinstellungen aktivieren" deaktiviere. Um diese Option in Visual Studio zu finden, klicken Sie mit der rechten Maustaste auf Ihr Projekt ==> Eigenschaften ==> Sicherheit auswählen ==> ClickOnce-Sicherheitseinstellungen aktivieren (Diese Option war bereits aktiviert, also habe ich es deaktiviert und mein Problem wurde behoben).

Ragnar
quelle
2

Hier ist das Code-Snippet für 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"})

BEARBEITEN: Wenn Sie jedoch auf diese Weise bereitstellen, blockiert einige AV-Software Ihren Code.

Tzwenni
quelle
1

Für diejenigen, die das Kontrollkästchen "ClickOnce-Sicherheitseinstellungen aktivieren" deaktivieren, kann es nicht funktionieren, die von mir gefundene Methode auszuprobieren.

Lassen Sie zunächst Ihr angefordertes app.manifestExecutionLevel-Element wie folgt:

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

Und dann bearbeiten Sie Ihre Program.cs-Datei wie folgt:

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

Hauptmethode umstrukturieren wie:

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

Es funktioniert unter Windows 10 und Visual Studio 2019!

Malajisi
quelle
0

Für jeden, der darauf stößt, dachte ich, ich würde dazu beitragen, was letztendlich für mich funktioniert hat.

Ja, die Option "ClickOnce-Sicherheitseinstellungen aktivieren" wird automatisch erneut aktiviert, wenn Sie sie deaktivieren, wenn Sie " Erstellen"> "Veröffentlichen" ausführen .

Für mich muss ich nicht "Veröffentlichen" - es ist eine einfache, tragbare EXE-Datei, die geplante Aufgaben für meine Benutzer erstellt, und ich musste sicherstellen, dass sie erhöht ist, auch wenn ich als Administrator angemeldet bin.

Also habe ich mir gerade meine neueste EXE-Datei aus \ bin \ Release geholt und diese wird auf den Systemen meiner Kunden bereitgestellt.

Funktionierte wie erwartet - dh wenn ich es auf ein System mit aktivierter Benutzerkontensteuerung / mit der höchsten Einstellung stelle, ist auf der EXE-Datei das "Schild" angebracht, und wenn ich es ausführe, selbst wenn ich als Administrator angemeldet bin, es erhöht sich und ich erhalte die UAC-Eingabeaufforderung.

Meine kleine Taskplaner-App kann die Aufgabe jetzt erstellen, ohne dass der Fehler "Zugriff verweigert" angezeigt wird (der zuvor nur umgangen werden konnte, indem Sie mit der rechten Maustaste auf die EXE-Datei klicken und auf Als Administrator ausführen klicken).

Samskara
quelle
-11

gerade

Imports System.security

und U wird keine Fehlermeldung erhalten und Ihre Anwendung wird als Administrator ausgeführt

Aditya
quelle
1
Das einfache Zuweisen eines Verweises auf eine Assembly allein führt in den meisten Fällen keinen Code aus. Ohne weitere Informationen sagt uns dies nichts. Dieser Beitrag bezieht sich auf die Anforderungen an die Bearbeitung der Verwaltungsregistrierung und insbesondere auf die Bereitstellung über die Option Visual Studio Publish, mit der eine ClickOnce-Assembly generiert wird. Wegen mangelnder Klarheit oder offensichtlicher Relevanz herabgestimmt.
Anthony Mason