Como evitar Vista de exigir elevação na patch.exe?
-
22-08-2019 - |
Pergunta
[Lamento que isso não é diretamente uma questão de programação. Mas eu tenho mudado recentemente para uma nova máquina Vista onde eu estou mantendo o UAC habilitado (por favor, não me diga para desativá-lo, não é uma opção).]
Toda vez que eu corro patch.exe do GNU eu recebo um diálogo elevação do Vista. Se eu mudar o nome patch.exe para foo.exe ele não faz isso, então eu suponho que este é um dos "heurística" do Vista.
Alguém sabe como desativar isso? Ele está dirigindo-me louco e os Googles não estão ajudando.
Ou devo adicionar um manifesto apenas para patch.exe para dizer ao sistema para não tentar elevar esta? Será que o trabalho, e se assim como você faz tal um manifesto?
Muito obrigado, foi batendo a cabeça contra a parede por uma hora neste até agora.
Solução
Se você pode adicionar um manifesto ao afetada executável declarar uma requestedExecutionLevel de 'asInvoker' ele deve parar avisar.
guia Associated na arquitetura UAC e converter aplicações existentes para que eles funcionem corretamente (perto da quinta parte inferior da página):
http://technet.microsoft.com/en-us/library /cc709628.aspx
Por fim, como escrever tal um manifesto:
http://www.google.com/search?q = escrita + a + UAC + manifesto
-Adam
Outras dicas
O problema é que a sua aplicação não contém um manifesto do assembly com um requestedExectutionLevel .
Fundo
Todos os aplicativos do Windows corretamente escritos são obrigados a ter um manifesto do assembly. E a partir de 2006 um dos elementos você é obrigado a ter é um requestedExecutionLevel que especifica se a sua aplicação só pode funcionar se o usuário é um administrador.
Se o seu aplicativo não tem um manifesto do assembly, ou se ele não tem um requestedExecutionLevel O Windows irá assumir que é uma legado do aplicativo e fazer coisas para espero mantê -lo funcionando.
Uma coisa compatibilidade para aplicações legadas é que alguns deles podem ser um instalador, ou um udpater, e só pode funcionar quando executado como administrador. O Windows tenta adivinhar esses aplicativos por seus nomes:
- Configuração
- update
- remendo
são exemplos de nomes de arquivos capturados por heurísticas de compatibilidade que estão tentando automaticamente elevar para o usuário.
Se a aplicação não tem montagem manifesto, então não é uma aplicação validamente escrita do Windows.
A solução correta ??h2>
A solução correta é adicionar o manifesto do assembly que todas as aplicações corretas terá. Este desativada a heurística.
Uma amostra UAC "asInvoker" manifesto:
<?xml version="1.0" encoding="utf-8"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" />
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
No meu caso eu tive que escrever um programa wrapper que faz o seguinte:
1-cópia de arquivo "patch.exe" na pasta temporária do sistema (% TMP%) com outro nome: "apply.exe"
2-Executar "% TMP% \ apply.exe" com os argumentos desejados.
3-Delete "% TMP% \ apply.exe" arquivo
Você não precisará escrever um manifesto.
Se você precisa calcular o "patch.exe" caminho completo, assumindo o .exe está na variável de ambiente% PATH%, você pode usar o seguinte código em C #:
public string GetPatchInstallPath()
{
StringDictionary env =
System.Diagnostics.Process.GetCurrentProcess().StartInfo.EnvironmentVariables;
string pathEnvVble = env["PATH"];
string[] paths = new string[]{};
paths = pathEnvVble.Split(new char[] { ';' });
foreach (string p in paths)
{
string fullPath = Path.Combine(p, "patch.exe");
if (File.Exists(fullPath))
return fullPath;
}
return string.Empty;
}
Caso contrário, você pode passar o caminho completo patch.exe ao seu programa de envoltório se você não quiser adicionar uma nova entrada para a variável% PATH% para a sua localização patch.exe.