Depois que meu programa é instalado em uma máquina cliente, como forço meu programa a ser executado como administrador no Windows 7?
Depois que meu programa é instalado em uma máquina cliente, como forço meu programa a ser executado como administrador no Windows 7?
Respostas:
Você deseja modificar o manifesto incorporado ao programa. Isso funciona no Visual Studio 2008 e superior: Projeto + Adicionar novo item, selecione "Arquivo de manifesto do aplicativo". Mude o <requestedExecutionLevel>
elemento para:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
O usuário recebe o prompt do UAC quando inicia o programa. Use sabiamente; sua paciência pode se desgastar rapidamente.
Adicionar um requestedExecutionLevel
elemento ao seu manifesto é apenas metade da batalha; você deve se lembrar que o UAC pode ser desligado. Se for, você deve executar a verificação da maneira antiga e abrir uma caixa de diálogo de erro se o usuário não for administrador
(ligue IsInRole(WindowsBuiltInRole.Administrator)
para o seu tópico CurrentPrincipal
).
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
bem
IsInRole
Anders fala.
As etapas detalhadas são as seguintes.
Observe que, usando esse código, você precisa desativar as configurações de segurança do ClickOnce; para isso, entre em Propriedades -> Segurança -> Segurança do ClickOnce
New Item...
não é uma opção no meu projeto do Serviço Instalador. Como eu adicionaria o manifesto do aplicativo? Posso adicioná-lo ao meu projeto principal, mas não é o instalador.
Eu implementei algum código para fazê-lo manualmente:
using System.Security.Principal;
public bool IsUserAdministrator()
{
bool isAdmin;
try
{
WindowsIdentity user = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(user);
isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);
}
catch (UnauthorizedAccessException ex)
{
isAdmin = false;
}
catch (Exception ex)
{
isAdmin = false;
}
return isAdmin;
}
Você pode incorporar um arquivo de manifesto no arquivo EXE, o que fará com que o Windows (7 ou superior) sempre execute o programa como administrador.
Você pode encontrar mais detalhes na Etapa 6: Criar e incorporar um manifesto de aplicativo (UAC) (MSDN).
Enquanto trabalhava no Visual Studio 2008, clique com o botão direito do mouse Project -> Add New Item
e escolha Application Manifest File
.
No arquivo de manifesto, você encontrará a tag requestedExecutionLevel
e poderá definir o nível para três valores:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
OU
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
OU
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
Para definir seu aplicativo para ser executado como administrador, você deve escolher o meio.
Conforme
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
convém adicionar um manifesto de aplicativo se ainda não tiver um ou não souber como adicioná-lo. Como alguns projetos não adicionam automaticamente um arquivo de manifesto separado, primeiro vá às propriedades do projeto, navegue até o Aplicativo guia e verifique se o seu projeto não está excluindo o manifesto na parte inferior da torneira.
No Visual Studio 2010, clique com o botão direito do mouse no nome do seu projeto. Aperte "View Windows Settings", isso gera e abre um arquivo chamado "app.manifest". Nesse arquivo, substitua "asInvoker" por "requireAdministrator", conforme explicado nas seções comentadas no arquivo.
Outra maneira de fazer isso, apenas no código, é detectar se o processo está sendo executado como administrador, como na resposta do @NG. . E, em seguida, abra o aplicativo novamente e feche o atual.
Uso esse código quando um aplicativo precisa apenas de privilégios de administrador quando executado sob certas condições, como quando se instala como um serviço. Portanto, ele não precisa funcionar como administrador o tempo todo, como as outras respostas o forçam também.
Observe no código abaixo NeedsToRunAsAdmin
um método que detecta se, nas condições atuais, são necessários privilégios de administrador. Se isso retornarfalse
o código não se elevará. Essa é uma grande vantagem dessa abordagem em relação às outras.
Embora esse código tenha as vantagens mencionadas acima, ele precisa se reiniciar como um novo processo que nem sempre é o que você deseja.
private static void Main(string[] args)
{
if (NeedsToRunAsAdmin() && !IsRunAsAdmin())
{
ProcessStartInfo proc = new ProcessStartInfo();
proc.UseShellExecute = true;
proc.WorkingDirectory = Environment.CurrentDirectory;
proc.FileName = Assembly.GetEntryAssembly().CodeBase;
foreach (string arg in args)
{
proc.Arguments += String.Format("\"{0}\" ", arg);
}
proc.Verb = "runas";
try
{
Process.Start(proc);
}
catch
{
Console.WriteLine("This application requires elevated credentials in order to operate correctly!");
}
}
else
{
//Normal program logic...
}
}
private static bool IsRunAsAdmin()
{
WindowsIdentity id = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(id);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
runas
como administrador de um usuário não administrador; caso contrário, ele será aberto silenciosamente com as permissões de usuário atual (verificadas no Windows 7 de 64 bits). Pelo que sei, a única coisa que você pode fazer com o UAC desativado e o direito de administrador está em falta é interromper a execução em um momento adequado.
Você pode criar o manifesto usando o ClickOnce Security Settings e depois desabilitá-lo:
Right click on the Project -> Properties -> Security -> Enable ClickOnce Security Settings
Depois de clicar nele, um arquivo será criado na pasta de propriedades do projeto chamada app.manifest, uma vez criado, você pode desmarcar a opçãoEnable ClickOnce Security Settings
opção
Abra esse arquivo e altere esta linha:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
para:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
Isso fará com que o programa exija privilégios de administrador.
Esta é uma versão simplificada desta resposta , acima de @NG
public bool IsUserAdministrator()
{
try
{
WindowsIdentity user = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(user);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
catch
{
return false;
}
}
Clique com o botão direito do mouse no executável, vá para Propriedades> Compatibilidade e marque a caixa 'Executar este programa como administrador'.
Se você deseja executá-lo como administrador para todos os usuários, faça o mesmo em 'alterar configuração para todos os usuários'.