14

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

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

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

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

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

4

3 回答 3

5

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

如果您可以将清单添加到受影响的可执行文件中,声明 requestExecutionLevel 为“asInvoker”,它应该停止提示。

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

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

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

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

-亚当

于 2009-02-10T20:14:37.720 回答
5

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

背景

所有正确编写的 Windows 应用程序都必须具有程序集清单。从 2006 年开始,您需要具备的元素之一是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> 
于 2009-06-19T02:50:04.220 回答
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 完整路径传递给包装程序。

于 2013-07-17T07:29:46.107 回答