如何防止 Vista 需要对 patch.exe 进行提升?

Posted

技术标签:

【中文标题】如何防止 Vista 需要对 patch.exe 进行提升?【英文标题】:How to prevent Vista from requiring elevation on patch.exe? 【发布时间】:2010-10-06 17:51:37 【问题描述】:

[很抱歉,这不是直接的编程问题。但是我最近切换到了一台新的 Vista 机器,在该机器上我保持 UAC 处于启用状态(请不要告诉我禁用它,这不是一个选项)。]

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

有谁知道如何禁用它?这让我发疯了,谷歌也帮不上忙。

或者我应该为 patch.exe 添加一个清单来告诉系统不要尝试提升它吗?这会起作用吗?如果会,你如何制作这样的清单?

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

【问题讨论】:

*** 用于编程问题。在 SO 的 IT 版本可用之前,您可以尝试将其作为此处列出的站点之一询问:***.com/questions/321618/… 这与编程有关。我用了“清单”这个词! 您可以将问题概括为编程问题,“我有一个名为 patch.exe 的软件会导致 Vista UAC 出现问题。我无法更改软件的名称,我该如何获取它以与执行它的用户相同的权限运行,所以它不请求管理员?” 【参考方案1】:

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

如果您可以将清单添加到 受影响的可执行文件声明 'asInvoker' 的请求执行级别 它应该停止提示。

有关 UAC 架构和转换现有应用程序以使其正常工作的相关指南(接近页面底部的五分之一):

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

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

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

-亚当

【讨论】:

【参考方案2】:

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

背景

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

如果您的应用程序没有程序集清单,或者如果它没有 requestedExecutionLevel,Windows 将假定它是一个旧版应用程序,并做一些希望保留的事情它正在运行。

遗留应用程序的一个兼容性问题是其中一些可能是安装程序或 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> 

【讨论】:

如果您在非管理员帐户下使用它,它将崩溃并显示以下消息:“请求的操作需要提升:(” @Roberto Luis Bisbé:您在一个确实需要管理员权限的程序上进行了尝试。 您可以通过调用链接器 mt.exe -nologo -manifest my.manifest -outputresource:patch.exe 将此清单应用于 exe【参考方案3】:

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

1-将“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 完整路径传递给您的包装程序。

【讨论】:

以上是关于如何防止 Vista 需要对 patch.exe 进行提升?的主要内容,如果未能解决你的问题,请参考以下文章

vax_patch.exe谁有这个文件,可以免费分享一下嘛?

本地patch是啥意思

Windows Vista/7:如何对输出音频混合进行采样?

如何防止用户调整 clistctrl(报告视图)的列宽?

[转]Patch文件结构详解

如何防止在我的桌面上启动 TaskManager?