"ClickOnce no admite el nivel de ejecución de solicitudes 'requireAdministrator'".

93

Entonces estaba escribiendo una aplicación que requiere acceso al registro. No había tocado ninguna configuración de compilación, quería que todo funcionara antes de agregar los otros toques, como una descripción o un nombre.

De repente, aparece un error que no desaparece. ClickOnce does not support the request execution level 'requireAdministrator'.Ahora, no había tocado ClickOnce en esta aplicación. Todo lo que hice fue incluir un archivo de manifiesto solicitando estos permisos.

Mi problema ahora es que este error no desaparecerá y no puedo compilar mi programa. ¿Algún consejo sobre qué hacer? (Nota al margen: estoy a punto de irme a la cama, así que lo comprobaré mañana por la tarde).

LMS
fuente
4
Odio decir lo obvio aquí, pero agregó un manifiesto solicitando requireAdministratorpermisos y ClickOnce comenzó a quejarse de que no es compatiblerequireAdministrator . El problema debería ser extremadamente claro. ClickOnce está viendo la necesidad de elevación en su manifiesto (que se convierte en parte de su aplicación). No estoy seguro de qué más necesitas aquí ...
Ken White
4
@KenWhite: Sin embargo, quizás no sea del todo obvio ni lógico que el requisito de administrador en combinación con hacer clic una vez le impida compilar el proyecto, no solo ejecutarlo, sino que lo hace.
500 - Error interno del servidor
@ 500-InternalServerError, la lógica debería decirle que existe una relación causal simplemente por el hecho de que agregar "requiere Admin" hace que no se compile debido a algo relacionado con "requiere Admin no compatible", IMO. :-)
Ken White
1
El problema no es que quiera usar ClickOnce y permisos de administrador, el problema es que quiero usar permisos de administrador y lo he compilado previamente (unas 10 veces) con ellos, pero esta vez ClickOnce dice que es incompatible.
LMS
10
@KenWhite, el problema no es tan claro como sugieres. El problema ocurre cuando haces clic en el botón "publicar" (al menos me lo hizo). Agregué el manifiesto y seleccioné "requireAdministrator", después de lo cual el programa funcionó sin problemas. Solo cuando hice clic en publicar, comencé a recibir este error y no pude borrarlo, hasta que entré en la configuración y deshabilité "ClickOnce". Por lo tanto, la solución no es que "requireAdministrator" no sea compatible, sino que "ClickOnce" no se puede habilitar y no puede hacer clic en "Publicar" si tiene configurado "requireAdministrator".
Gavin Coates

Respuestas:

147

Editar: Este comentario también da una buena respuesta.

Hacer clic una vez aparece para habilitarse siempre que haga clic en "Publicar", ¡lo quiera o no! Si está utilizando "requireAdministrator", parece que no puede utilizar ClickOnce y, por tanto, no puede "Publicar" su proyecto.


Original:

Resulta que en la pestaña Seguridad, se marcó "Habilitar la configuración de seguridad de ClickOnce". Aunque no lo comprobé. De todos modos, desmarcar eso hizo que ClickOnce me diera errores. Eso tomó un tiempo para encontrar ...

LMS
fuente
3
Ah, pensé que era obvio por el mensaje de error que recibió;)
500 - Error interno del servidor
3
Lo que me había confundido era que no habilité ClickOnce.
LMS
Buena pregunta y respuesta, me ayudó, ¡Gracias!
Moh
29
Hacer clic una vez aparece para habilitarse siempre que haga clic en "Publicar", ¡lo quiera o no! Si está usando "requireAdministrator", entonces parece que no puede usar ClickOnce y, por lo tanto, no puede "Publicar" su proyecto.
Gavin Coates
1
Lo que dice @GavinCoates es correcto. La razón es que las aplicaciones ClickOnce siempre se instalan por usuario en su AppDatacarpeta. La elevación de privilegios causaría un cambio en el contexto del usuario donde la aplicación ClickOnce ni siquiera está instalada.
bertl
43

Sé que esta es una vieja pregunta, pero vine aquí dos años después, así que:

Puede deshabilitar ClicKOnce desde la pestaña Seguridad en las propiedades del proyecto para ayudar con el problema; vea abajo:

ingrese la descripción de la imagen aquí

t_plusplus
fuente
3
Y cuando publiques tu aplicación, esta casilla de verificación se volverá a marcar.
dikkini
@dikkini, ¡exactamente! cómo desactivarlo, alguien tiene una respuesta?
saidfagan
@saidfagan no hay respuesta ni solución para este caso. Utilizo ULMerge para combinar archivos exe y dll.
dikkini
18

Si alguna vez utiliza el asistente de publicación o 'Publicar ahora', la casilla de verificación de hacer clic una vez se selecciona automáticamente ...

Víctor Rosu
fuente
16

Sé que esto es antiguo, pero me encontré con él buscando respuestas. En mi caso, estoy usando la función de publicación y necesito seguir usándola. También necesito acceso a las capacidades de administración. Entonces, por esa razón, ninguna de las respuestas anteriores funcionó para mí.

Terminé agregando un método al inicio de mi aplicación que verifica si se está ejecutando como administrador y, si no lo está, se reinicia como administrador. Para hacer esto, necesita agregar las siguientes referencias.

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

Luego, deberá poner esto en algún lugar al que su método principal tenga acceso útil. Estoy usando WPF, así que lo agregué a MainWindow.xaml.cs, pero puede agregarlo en cualquier lugar al principio de su código. Solo recuerde agregar "estático" a estos métodos si lo necesita.

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

Por último, al inicio de su programa, agregue una referencia al método. En mi caso, lo agregué a MainWindow, pero agregarlo a Main también funciona.

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

¡Espero que esto ayude!

Tyler C
fuente
inicia una nueva instancia, que por definir no se adjunta al depurador ... (llama a una nueva instancia gratuita (sin adjuntar) y cierra la adjunta al depurador)
deadManN
1
@deadManN muy cierto. Lo solucioné ya que no necesitaba el depurador cuando llegué a ese punto, pero supongo que podría ejecutar VS como administrador y luego el programa también se iniciaría en modo de administrador. omitiendo el reinicio. Lo probaré para estar seguro.
Tyler C
1
Para cualquiera que se encuentre con esto, lo anterior de hecho funciona.
Tyler C
>> El nombre 'Aplicación' no existe en el contexto actual. error
vee
Este código solo inicia un nuevo proceso, pero mi aplicación es una consola, por lo que los argumentos se dejan vacíos.
vee
5

Esta acción se puede lograr seleccionando "Habilitar la configuración de seguridad de ClickOnce" (ya que no se puede "desmarcar" durante una Publicación, como se indica) y luego seleccionando "Esta es una aplicación de confianza parcial". "Intranet local" se seleccionará automáticamente en el menú desplegable, lo cual está perfectamente bien.

Guarde sus cambios, publique la aplicación, done-skis. :-)Fragmento de configuración de seguridad

Descifrador de códigos
fuente
2

Eche un vistazo en el archivo de manifiesto de su aplicación y verá esto:

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

Hay instrucciones allí en los comentarios, pero simplemente eliminar el "requireAdministrator" e insertarlo en el lugar me resolvió el problema:

 <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
Brian
fuente
2
OP dice que requieren acceso al registro en su aplicación, por lo que esta no es una opción.
LeeCambl
requireAdministratorSe requiere privilegio para escribir en el registro, por lo que sería un requisito.
SkiSharp
ClickOnce no admite el nivel de ejecución de la solicitudasInvoke
SkiSharp
2

Tengo el mismo problema y lo resuelvo desmarcando la opción " Habilitar la configuración de seguridad de ClickOnce" Para encontrar esta opción en Visual Studio Haga clic con el botón derecho en su Proyecto ==> propiedades ==> Seleccionar seguridad ==> Habilitar la configuración de seguridad de ClickOnce (esta opción fue ya marcado, así que lo desmarqué y mi problema se resolvió).

Ragnar
fuente
2

Aquí está el fragmento de código para 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"})

EDITAR: Pero si implementa de esta manera, algún software AV bloquea su código.

Tzwenni
fuente
1

Para aquellos que usan desmarcar "Habilitar la configuración de seguridad de ClickOnce" no pueden funcionar, para probar el método que encuentro.

Primero, deje su elemento app.manifest requiredExecutionLevel como está:

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

Y luego edita su archivo Program.cs así:

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

reestructurar el método principal como:

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

¡Funciona en Windows 10 y Visual Studio 2019!

malajisi
fuente
1

Para cualquiera que se haya encontrado con esto, pensé en contribuir con lo que terminó funcionando para mí.

Sí, la opción 'Habilitar la configuración de seguridad de ClickOnce' se vuelve a marcar automáticamente, si la desmarcas, cuando haces Crear> Publicar .

Para mí, no necesito 'Publicar', es un .exe simple y portátil que crea Tareas Programadas para mis usuarios y necesitaba asegurarme de que esté elevado, incluso cuando inicie sesión como Administrador.

Así que acabo de tomar mi último .exe de \ bin \ Release y eso es lo que se implementa en los sistemas de mis clientes.

Funcionó como se esperaba, es decir, cuando lo puse en un sistema con UAC habilitado / en su configuración más alta, el .exe tiene el 'escudo', y cuando lo ejecuto, incluso cuando estoy conectado como administrador, se eleva y recibo el mensaje UAC.

Mi pequeña aplicación de programación de tareas ahora puede crear la tarea sin obtener un error de 'Acceso denegado' (que anteriormente solo se podía solucionar haciendo clic derecho en el .exe y haciendo clic en Ejecutar como administrador).

Samskara
fuente
Tuve exactamente el mismo problema, y ​​ninguna de las respuestas anteriores funcionó. Me gustaría que volvieran a trabajar la configuración de seguridad de hacer clic una vez. Absolutamente necesario y una buena característica en la mayoría de los casos, especialmente para las aplicaciones que se publican en línea, sin embargo, me gustaría que hubiera una mejor opción / solución alternativa solo para las publicaciones locales.
SkiSharp
-12

sólo

Imports System.security

y no obtendrá ningún error y su aplicación se ejecutará como administrador

Aditya
fuente
1
La simple asignación de una referencia a un ensamblado no ejecutará ningún código en la mayoría de los casos. Sin más posteado, esto no nos dice nada. Esta publicación trata sobre el requisito de la edición del registro administrativo y, más específicamente, la implementación a través de la opción Publicar de Visual Studio, que genera un ensamblado ClickOnce. Votado en contra por falta de claridad o aparente relevancia.
Anthony Mason
Esto ... esto es un no. Esto no hará absolutamente nada excepto aumentar el recuento de líneas en 1. Hacer referencia a un ensamblado sin referencia a ningún objeto o método de llamada dentro de ese ensamblado no hará absolutamente nada. Como se indicó en el comentario anterior.
SkiSharp