如何防止 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谁有这个文件,可以免费分享一下嘛?