[对不起,这不是一个直接的编程问题。但我最近切换到一台新的Vista机器,我保持启用UAC(请不要告诉我禁用它,它不是一个选项)。]
每次运行gnu的patch.exe时,我都会从Vista获得一个提升对话框。如果我将patch.exe重命名为foo.exe它不会这样做,所以我认为这是Vista的“启发式”之一。
有谁知道如何禁用此功能?这让我疯狂,谷歌没有帮助。
或者我应该为patch.exe添加一个清单,告诉系统不要试图提升它?这会起作用,如果是这样,你怎么做出这样的表现呢?
非常感谢,到目前为止,我一直在墙上撞了一个小时。
答案 0 :(得分:5)
如果您可以添加清单 受影响的可执行文件声明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完整路径传递给包装程序。