如何防止Vista要求提升patch.exe?

时间:2009-02-10 20:03:27

标签: windows-vista uac patch

[对不起,这不是一个直接的编程问题。但我最近切换到一台新的Vista机器,我保持启用UAC(请不要告诉我禁用它,它不是一个选项)。]

每次运行gnu的patch.exe时,我都会从Vista获得一个提升对话框。如果我将patch.exe重命名为foo.exe它不会这样做,所以我认为这是Vista的“启发式”之一。

有谁知道如何禁用此功能?这让我疯狂,谷歌没有帮助。

或者我应该为patch.exe添加一个清单,告诉系统不要试图提升它?这会起作用,如果是这样,你怎么做出这样的表现呢?

非常感谢,到目前为止,我一直在墙上撞了一个小时。

3 个答案:

答案 0 :(得分:5)

自:
http://social.msdn.microsoft.com/Forums/en-US/windowsgeneraldevelopmentissues/thread/bf4f7dfa-5553-41d3-9c8e-311ee4a88599/

  

如果您可以添加清单   受影响的可执行文件声明a   'asInvoker'的requestExecutionLevel   它应该停止提示。

关于UAC架构和转换现有应用程序的相关指南,以便它们正常工作(靠近页面的底部五分之一):

http://technet.microsoft.com/en-us/library/cc709628.aspx

最后,如何编写这样的清单:

http://www.google.com/search?q=writing+a+uac+manifest

- 亚当

答案 1 :(得分:5)

问题是您的应用程序不包含带有 requestedExectutionLevel 的程序集清单。

背景

所有正确编写的Windows应用程序都需要具有程序集清单。从2006年开始,您需要拥有的一个元素是 requestedExecutionLevel ,它指定您的应用程序是否只能在用户是管理员时才能运行。

如果您的应用程序没有程序集清单,或者它没有 requestedExecutionLevel ,Windows会认为它是 legacy 应用程序,并且希望保留它正在运行。

遗留应用程序的一个兼容性问题是它们中的一些可能是安装程序或udpater,并且只能在以管理员身份运行时才能运行。 Windows尝试通过文件名猜测这些应用程序:

  • 设置
  • 更新
  • 补丁

所有文件名的示例都是由兼容性启发式捕获的,试图自动提升 用户。

如果应用程序没有程序集清单,则它不是有效编写的Windows应用程序。

正确的解决方案

正确的解决方案是添加所有正确应用程序将具有的程序集清单。这禁用了启发式。

示例UAC“asInvoker”清单:

<?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> 

答案 2 :(得分:3)

在我的情况下,我必须编写一个包装程序来实现以下功能:

将“patch.exe”文件复制到系统的临时文件夹(%TMP%)中,并使用其他名称:“apply.exe”

2 - 使用所需的参数执行“%TMP%\ apply.exe”。

3 - 删除“%TMP%\ apply.exe”文件

您无需编写清单。

如果需要计算“patch.exe”完整路径,假设.exe位于%PATH%环境变量上,则可以在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;
}

否则,如果您不想为patch.exe位置的%PATH%变量添加新条目,则可以将patch.exe完整路径传递给包装程序。