“ClickOnce não oferece suporte ao nível de execução da solicitação 'requireAdministrator'”.

93

Então, eu estava escrevendo um aplicativo que requer acesso ao registro. Eu não toquei em nenhuma configuração de construção, querendo fazer a coisa funcionar antes de adicionar outros toques, como uma descrição ou nome.

De repente, recebo um erro que não desaparece. ClickOnce does not support the request execution level 'requireAdministrator'.Bem, eu não toquei no ClickOnce neste aplicativo. Tudo o que fiz foi incluir um arquivo de manifesto solicitando essas permissões.

Meu problema agora é que esse erro não vai embora e não consigo compilar meu programa. Qualquer conselhos sobre o que fazer? (Nota lateral: estou prestes a ir para a cama, então vou verificar isso amanhã à tarde).

LMS
fonte
4
Odeio dizer o óbvio aqui, mas você adicionou um manifesto solicitando requireAdministratorpermissões e o ClickOnce começou a reclamar que não é compatívelrequireAdministrator . O problema deve ser extremamente claro. ClickOnce está vendo a necessidade de elevação em seu manifesto (que se torna parte de seu aplicativo). Não tenho certeza do que mais você precisa aqui ...
Ken White
4
@KenWhite: No entanto, talvez não seja totalmente óbvio nem lógico que o requisito do administrador em combinação com clicar uma vez o impeça de compilar o projeto, não apenas executá-lo - mas impede.
500 - Erro interno do servidor de
@ 500-InternalServerError, a lógica deve informar que existe uma relação causal simplesmente pelo fato de que adicionar "requer Admin" faz com que não seja compilado devido a algo a ver com "requer Admin não suportado", IMO. :-)
Ken White
1
O problema não é que eu queira usar o ClickOnce e as permissões de administrador, o problema é que eu quero usar as permissões de administrador e compilei anteriormente (cerca de 10 vezes) com elas, mas desta vez o ClickOnce está dizendo que é incompatível.
LMS
10
@KenWhite o problema não é tão claro quanto você sugere. O problema ocorre quando você clica no botão "publicar" (pelo menos para mim). Eu adicionei o manifesto e selecionei "requireAdministrator", após o qual o programa funcionou perfeitamente. Somente quando cliquei em publicar é que comecei a receber esse erro, e não consegui eliminá-lo, até que entrei nas configurações e desativei o "ClickOnce". Portanto, a solução não é que "requireAdministrator" não seja suportado, mas que "ClickOnce" não possa ser habilitado, e você não pode clicar em "Publicar" se tiver "requireAdministrator" definido.
Gavin Coates

Respostas:

147

Edit: Este comentário também dá uma boa resposta.

Clique uma vez para ser ativado sempre que você clicar em "Publicar", quer você queira ou não! Se você estiver usando "requireAdministrator", parece que você não pode usar o ClickOnce e, portanto, não pode "Publicar" seu projeto.


Original:

Acontece que na guia Segurança, "Ativar configurações de segurança ClickOnce" foi marcada. Mesmo que eu não tenha verificado. De qualquer forma, desmarcando isso parou o ClickOnce de me dar erros. Demorou um pouco para encontrar ...

LMS
fonte
3
Ah, pensei que era óbvio pela mensagem de erro que você recebeu;)
500 - Erro interno do servidor de
3
O que me confundiu foi que eu não habilitei o ClickOnce.
LMS de
Boa pergunta e resposta, me ajudou, obrigado!
Moh
29
Clique uma vez para ser ativado sempre que você clicar em "Publicar", quer você queira ou não! Se você estiver usando "requireAdministrator", parece que você não pode usar o ClickOnce e, portanto, não pode "Publicar" seu projeto.
Gavin Coates
1
O que @GavinCoates diz está correto. O motivo é que os aplicativos ClickOnce são sempre instalados por usuário em sua AppDatapasta. A elevação de privilégio causaria uma mudança no contexto do usuário onde o aplicativo ClickOnce nem mesmo está instalado.
bertl de
43

Eu sei que esta é uma questão antiga, mas vim aqui dois anos depois para:

Você pode desativar o ClicKOnce na guia Segurança nas propriedades do projeto para ajudar no problema; ver abaixo:

insira a descrição da imagem aqui

t_plusplus
fonte
3
E quando você publicar seu aplicativo, esta caixa de seleção será marcada novamente.
dikkini
@dikkini, exatamente! como desabilitá-lo, alguém tem uma resposta?
dissefagan em
@saidfagan nenhuma resposta ou solução para este caso. Eu uso util ULMerge para combinar arquivos exe e dll.
dikkini
18

Se você já usou o assistente de publicação ou 'Publicar agora', a caixa de seleção clicar uma vez será selecionada automaticamente ...

Victor Rosu
fonte
16

Eu sei que isso é antigo, mas me deparei com ele em busca de respostas. No meu caso, estou usando a função de publicação e preciso continuar usando-a. Eu também preciso de acesso aos recursos de administrador. Portanto, por esse motivo, nenhuma das respostas acima funcionou para mim.

Acabei adicionando um método bem no início do meu aplicativo que verifica se ele está sendo executado como um administrador e se não estiver, reinicie-se como um administrador. Para fazer isso, você precisa das seguintes referências adicionadas.

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

Em seguida, você precisará colocá-lo em algum lugar ao qual seu método principal tenha acesso acessível. Estou usando o WPF, então adicionei-o a MainWindow.xaml.cs, mas você pode adicioná-lo em qualquer lugar no início de seu código. Lembre-se de adicionar "estático" a esses métodos, caso precise.

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, no início do seu programa, adicione uma referência ao método. No meu caso, eu o adicionei à MainWindow, mas adicioná-lo ao Main também funciona.

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

Espero que isto ajude!

Tyler C
fonte
ele inicia uma nova instância, que por define não se conecta ao depurador .. (você chama uma nova instância gratuita (não anexada) e fecha aquela anexada ao depurador)
deadManN
1
@deadManN muito verdadeiro. Eu resolvi isso porque não precisava do depurador no momento em que cheguei a esse ponto, mas suponho que você poderia executar o VS como administrador e, em seguida, o programa seria iniciado no modo de administrador também. pulando o reinício. Vou testar isso para ter certeza.
Tyler C
1
Para qualquer um que tropece nisso, o que foi dito acima de fato funciona.
Tyler C
>> O nome 'Aplicativo' não existe no contexto atual. erro
vee
Este código apenas inicia um novo processo, mas meu aplicativo é um console, então os argumentos apenas deixam em branco.
vee
5

Esta ação pode ser alcançada selecionando "Ativar configurações de segurança ClickOnce" (uma vez que não pode ser "desmarcado" durante uma Publicação, conforme declarado) e, em seguida, selecionando "Este é um aplicativo de confiança parcial". "Intranet local" será automaticamente selecionado no menu suspenso, o que é perfeitamente adequado.

Salve suas alterações, publique o aplicativo, skis prontos. :-)Snippet de configurações de segurança

CodeBreaker
fonte
2

Dê uma olhada em seu arquivo app.Manifest e você verá o seguinte:

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

Há instruções nos comentários, mas apenas excluir o "requireAdministrator" e inseri-lo já resolveu o problema para mim:

 <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
Brian
fonte
2
OP diz que eles exigem acesso ao registro em seu aplicativo, portanto, esta não é uma opção.
LeeCambl
requireAdministratorprivilégio é necessário para gravar no registro, portanto, isso seria um requisito.
SkiSharp
ClickOnce não suporta o nível de execução de solicitaçãoasInvoke
SkiSharp
2

Eu tenho o mesmo problema s eu resolvê-lo desmarcando a " Ativar configurações de segurança ClickOnce" para encontrar esta opção no Visual Studio clique direito em seu projeto ==> propriedades ==> Select Segurança ==> Ativar configurações de segurança ClickOnce (Esta opção foi já marcada, então desmarquei e meu problema foi resolvido).

Ragnar
fonte
2

Aqui está o trecho 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: Mas se você implantar dessa forma, algum software AV bloqueia seu código.

Tzwenni
fonte
1

Para aqueles que usam desmarcar "Ativar configurações de segurança ClickOnce" não funciona, tente o método que encontrei.

Primeiro, deixe seu item app.manifest requiredExecutionLevel como está:

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

E então você edita seu arquivo Program.cs assim:

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

reestruturar o 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 no Windows 10 e Visual Studio 2019!

malajisi
fonte
1

Para quem já passou por isso, pensei em contribuir com o que acabou funcionando para mim.

Sim, a opção 'Ativar configurações de segurança do ClickOnce' será automaticamente verificada novamente, se você desmarcá-la, ao fazer Build> Publish .

Para mim, não preciso 'Publicar' - é um .exe simples e portátil que cria tarefas agendadas para meus usuários e eu precisava garantir que ele fosse elevado, mesmo quando conectado como administrador.

Então, peguei meu .exe mais recente em \ bin \ Release e é isso que é implantado nos sistemas dos meus clientes.

Funcionou como esperado - ou seja, quando eu coloquei em um sistema com UAC habilitado / em sua configuração mais alta, o .exe tem o 'escudo' nele, e quando eu o executo, mesmo quando conectado como administrador, ele aumenta e recebo o prompt do UAC.

Meu pequeno aplicativo agendador de tarefas agora é capaz de criar a tarefa sem obter um erro de 'Acesso negado' (que anteriormente só podia ser contornado clicando com o botão direito do mouse no .exe e clicando em Executar como administrador).

Samskara
fonte
Eu tive exatamente o mesmo problema e nenhuma das respostas acima funcionou. Gostaria que eles retrabalhassem as configurações de segurança do clique uma vez. Absolutamente necessário e um bom recurso na maioria dos casos, especialmente para aplicativos sendo publicados on-line. No entanto, gostaria que houvesse uma opção / solução alternativa melhor apenas para publicações locais.
SkiSharp
-12

somente

Imports System.security

e você não obterá nenhum erro e seu aplicativo será executado como administrador

Aditya
fonte
1
Simplesmente atribuir uma referência a um assembly sozinho não executará nenhum código na maioria dos casos. Sem mais postado, isso não nos diz nada. Esta postagem é em relação ao requisito de edição de registro administrativo e, mais especificamente, implantação por meio da opção de publicação do Visual Studio, que gera um assembly ClickOnce. Votos negados por falta de clareza ou relevância aparente.
Anthony Mason
Isso ... isso é um não. Isso não fará absolutamente nada, exceto aumentar sua contagem de linha em 1. Referenciar um assembly sem referência a qualquer objeto ou método de chamada dentro desse assembly não fará absolutamente nada. Como o comentário anterior afirmou.
SkiSharp