«ClickOnce ne prend pas en charge le niveau d’exécution des requêtes« requireAdministrator ».»


93

J'écrivais donc une application qui nécessite un accès au registre. Je n'avais touché à aucun paramètre de construction, voulant faire fonctionner la chose avant d'ajouter les autres touches, telles qu'une description ou un nom.

À l'improviste, j'obtiens une erreur qui ne disparaîtra pas. ClickOnce does not support the request execution level 'requireAdministrator'.Maintenant, je n'avais pas touché ClickOnce dans cette application. Tout ce que j'avais fait était d'inclure un fichier manifeste demandant ces autorisations.

Mon problème maintenant est que cette erreur ne disparaîtra pas et je ne peux pas compiler mon programme. Un conseil sur quoi faire? (Note latérale: je suis sur le point d'aller me coucher, donc je vérifierai cela demain après-midi).


4
Je déteste énoncer l'évidence ici, mais vous avez ajouté un manifeste demandant des requireAdministratorautorisations et ClickOnce a commencé à se plaindre qu'il ne prend pas en chargerequireAdministrator . Le problème doit être extrêmement clair. ClickOnce voit le besoin d'élévation dans votre manifeste (qui devient une partie de votre application). Je ne sais pas ce dont vous avez besoin de plus ici ...
Ken White

4
@KenWhite: Cependant, il n'est peut-être pas tout à fait évident ni logique que l'exigence d'administration associée au clic une fois vous empêche de compiler le projet, pas seulement de l'exécuter - mais c'est le cas.
500 - Erreur de serveur interne le

@ 500-InternalServerError, la logique devrait vous dire qu'une relation causale existe simplement par le fait que l'ajout de "nécessite Admin" l'empêche de se compiler en raison de quelque chose à voir avec "nécessite Admin non pris en charge", IMO. :-)
Ken White

1
Le problème n'est pas que je veux utiliser ClickOnce et les autorisations d'administrateur, le problème est que je veux utiliser les autorisations d'administrateur et que je l'ai compilé précédemment (environ 10 fois) avec eux, mais cette fois, ClickOnce dit qu'il est incompatible.
LMS du

10
@KenWhite le problème n'est pas aussi clair que vous le suggérez. Le problème se produit lorsque vous cliquez sur le bouton «publier» (du moins pour moi). J'ai ajouté le manifeste et sélectionné "requireAdministrator", après quoi le programme a fonctionné parfaitement. Ce n'est que lorsque j'ai cliqué sur publier que j'ai commencé à recevoir cette erreur, et je n'ai pas pu l'effacer, jusqu'à ce que je suis entré dans les paramètres et désactivé "ClickOnce". La solution n'est donc pas que "requireAdministrator" ne soit pas pris en charge, mais que "ClickOnce" ne peut pas être activé et vous ne pouvez pas cliquer sur "Publier" si vous avez défini "requireAdministrator".
Gavin Coates

Réponses:


147

Edit: Ce commentaire donne également une bonne réponse.

Cliquer une fois semble être activé chaque fois que vous cliquez sur "Publier", que vous le vouliez ou non! Si vous utilisez "requireAdministrator", il apparaît que vous ne pouvez pas utiliser ClickOnce et que vous ne pouvez donc pas "Publier" votre projet.


Original:

Il s'avère que sous l'onglet Sécurité, "Activer les paramètres de sécurité ClickOnce" a été coché. Même si je ne l'ai pas vérifié. Quoi qu'il en soit, décocher cela a arrêté ClickOnce de me donner des erreurs. Cela a mis du temps à trouver ...


3
Ah, je pensais que c'était évident à partir du message d'erreur que vous avez reçu;)
500 - Erreur du serveur interne

3
Ce qui m'avait dérouté, c'est que je n'avais pas activé ClickOnce.
LMS

Bonne question et réponse, cela m'a aidé, merci!
Moh

29
Cliquer une fois semble être activé chaque fois que vous cliquez sur "Publier", que vous le vouliez ou non! Si vous utilisez "requireAdministrator", il apparaît que vous ne pouvez pas utiliser ClickOnce et que vous ne pouvez donc pas "Publier" votre projet.
Gavin Coates

1
Ce que dit @GavinCoates est correct. La raison en est que les applications ClickOnce sont toujours installées par utilisateur dans son AppDatadossier. L'élévation de privilèges entraînerait un basculement du contexte utilisateur dans lequel l'application ClickOnce n'est même pas installée.
bertl

43

Je sais que c'est une vieille question mais je suis venu ici deux ans plus tard alors:

Vous pouvez désactiver ClicKOnce à partir de l'onglet Sécurité sur les propriétés du projet pour résoudre le problème; voir ci-dessous:

entrez la description de l'image ici


3
Et lorsque vous publierez votre application, cette case sera à nouveau cochée.
dikkini

@dikkini, exactement! comment le désactiver, quelqu'un a une réponse?
saidfagan

@saidfagan pas de réponse ou de solution pour ce cas. J'utilise util ULMerge pour combiner des fichiers exe et dll.
dikkini

18

Si jamais vous utilisez l'assistant de publication ou «Publier maintenant», la case à cocher «clic unique» est automatiquement sélectionnée ...


16

Je sais que c'est vieux mais je suis tombé dessus à la recherche de réponses. Dans mon cas, j'utilise la fonction de publication et je dois continuer à l'utiliser. J'ai également besoin d'accéder aux capacités d'administration. Donc, pour cette raison, aucune des réponses ci-dessus n'a fonctionné pour moi.

J'ai fini par ajouter une méthode au tout début de mon application qui vérifie si elle est exécutée en tant qu'administrateur et si ce n'est pas le cas, se relance en tant qu'administrateur. Pour ce faire, vous devez ajouter les références suivantes.

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

Ensuite, vous devrez placer ceci quelque part auquel votre méthode principale a un accès pratique. J'utilise WPF, je l'ai donc ajouté à MainWindow.xaml.cs mais vous pouvez l'ajouter n'importe où au début de votre code. N'oubliez pas d'ajouter "statique" à ces méthodes si vous en avez besoin.

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

Enfin, au démarrage de votre programme, ajoutez une référence à la méthode. Dans mon cas, je l'ai ajouté à MainWindow mais l'ajouter à Main fonctionne aussi.

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

J'espère que cela t'aides!


il démarre une nouvelle instance, qui par définition ne s'attache pas au débogueur .. (vous appelez une nouvelle instance gratuite (non attachée) et fermez celle attachée au débogueur)
deadManN

1
@deadManN très vrai. Je l'ai contourné car je n'avais pas besoin du débogueur au moment où j'en suis arrivé à ce point, mais je suppose que vous pouvez exécuter VS en tant qu'administrateur, puis le programme serait également lancé en mode administrateur. sauter le redémarrage. Je vais tester ça pour être sûr.
Tyler C

1
Pour quiconque tombe sur cela, ce qui précède fonctionne en fait.
Tyler C

>> Le nom 'Application' n'existe pas dans le contexte actuel. Erreur
vee le

Ce code ne lance qu'un nouveau processus, mais mon application est une console, donc les arguments laissent simplement vides.
vee le

5

Cette action peut être réalisée en sélectionnant «Activer les paramètres de sécurité ClickOnce» (car il ne peut pas être «décoché» lors d'une publication, comme indiqué), puis en sélectionnant «Ceci est une application de confiance partielle». "Intranet local" sera automatiquement sélectionné dans le menu déroulant, ce qui est parfaitement bien.

Sauvegardez vos modifications, publiez l'application, done-skis. :-)Extrait des paramètres de sécurité


2

Jetez un œil dans votre fichier app.Manifest et vous verrez ceci:

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

Il y a des instructions là-bas dans les commentaires, mais supprimer simplement le "requireAdministrator" et l'insérer à l'endroit a résolu le problème pour moi:

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

2
OP dit qu'ils ont besoin d'accéder au registre dans leur application, ce n'est donc pas une option.
LeeCambl

requireAdministratorun privilège est requis pour écrire dans le registre, ce serait donc une condition.
SkiSharp

ClickOnce ne prend pas en charge le niveau d'exécution de la requêteasInvoke
SkiSharp

2

J'ai le même problème s Je le résous en décochant la case « Activer les paramètres de sécurité ClickOnce» Pour trouver cette option dans Visual Studio Cliquez avec le bouton droit sur votre projet ==> propriétés ==> Sélectionnez Sécurité ==> Activer les paramètres de sécurité ClickOnce (Cette option était déjà vérifié, donc je l'ai décoché et mon problème est résolu).


2

Voici l'extrait de code pour 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"})

EDIT: Mais si vous déployez de cette manière, certains logiciels AV bloquent votre code.


1

Pour ceux qui utilisent décocher "Activer les paramètres de sécurité ClickOnce" ne peut pas fonctionner, pour essayer la méthode que je trouve.

Tout d'abord, laissez votre élément app.manifest demandéExecutionLevel tel quel:

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

Et puis vous éditez votre fichier Program.cs comme ceci:

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

restructurer la méthode principale comme:

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

Cela fonctionne sur Windows 10 et Visual Studio 2019!


1

Pour tous ceux qui ont rencontré cela, j'ai pensé que je contribuerais à ce qui a fonctionné pour moi.

Oui, l'option `` Activer les paramètres de sécurité ClickOnce '' est automatiquement re-cochée, si vous la décochez, lorsque vous faites Construire> Publier .

Pour moi, je n'ai pas besoin de «publier» - c'est un .exe simple et portable qui crée des tâches planifiées pour mes utilisateurs et je devais m'assurer qu'il était élevé, même lorsque je me suis connecté en tant qu'administrateur.

J'ai donc récupéré mon dernier .exe à partir de \ bin \ Release et c'est ce qui est déployé sur les systèmes de mes clients.

A fonctionné comme prévu - c'est-à-dire lorsque je le mets sur un système avec UAC activé / à son réglage le plus élevé, le .exe a le `` bouclier '' dessus, et quand je l'exécute, même lorsque je suis connecté en tant qu'administrateur, il élève et j'obtiens l'invite UAC.

Ma petite application de planificateur de tâches est maintenant capable de créer la tâche sans obtenir une erreur `` Accès refusé '' (qui auparavant, ne pouvait être contournée qu'en cliquant avec le bouton droit sur le .exe et en cliquant sur Exécuter en tant qu'administrateur).


J'ai eu exactement le même problème, et aucune des réponses ci-dessus n'a fonctionné. Je souhaite qu'ils retravaillent les paramètres de sécurité Click Once. Absolument nécessaire et une bonne fonctionnalité dans la plupart des cas, en particulier pour les applications publiées en ligne, mais j'aimerais qu'il y ait une meilleure option / solution de contournement uniquement pour les publications locales.
SkiSharp

-12

juste

Imports System.security

et U n'obtiendra aucune erreur et votre application sera exécutée en tant qu'administrateur


1
Le simple fait d'assigner une référence à un assembly seul n'exécutera aucun code dans la plupart des cas. Sans plus de posté, cela ne nous dit rien. Cet article concerne l'exigence de modification du registre administratif et plus spécifiquement le déploiement via l'option de publication de Visual Studio qui génère un assembly ClickOnce. Évalué pour manque de clarté ou de pertinence apparente.
Anthony Mason du

C'est ... c'est non. Cela ne fera absolument rien sauf augmenter votre nombre de lignes de 1. Référencer un assembly sans référence à un objet ou à une méthode d'appel dans cet assembly ne fera absolument rien. Comme le commentaire précédent indiqué.
SkiSharp
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.