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.

Foi útil?

Solução

De:
http: // sociais .msdn.microsoft.com / Fóruns / en-US / windowsgeneraldevelopmentissues / thread / bf4f7dfa-5553-41d3-9c8e-311ee4a88599 /

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

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top