如何比较两个可执行文件?

7

我有一个文件,不需要UAC警告。我使用C#.NET将该文件复制到另一个位置。

 File.Copy("Original.exe", "Copy.exe");

现在我知道Copy.exe需要在Windows 7/Vista下运行时出现UAC警告。我应该如何比较Original.exe和Copy.exe以确定文件发生了什么变化,并手动更改它,使其不再需要UAC。我可以使用哪个工具来实现? 这两个可执行文件是相同的文件:如何知道这两个文件的区别?

2
“Copy.exe” 是真正的目标文件名吗?Windows 使用“安装程序检测”将一些具有更新/安装相关关键词的文件标记为需要管理员权限。 - max
不,这只是一个示例。原始名称是UpdatePriv.exe。 - Rafik Bari
5
比情况更为如此。尝试从文件名中删除“Update”部分。 - max
4
相关问题:https://dev59.com/nm855IYBdhLWcg3wz3zo - max
哇,@max你太厉害了!非常感谢。 - Rafik Bari
1
@max请将您的评论添加为答案。 - user844541
3个回答

6
Windows安装程序检测技术是这种行为的原因。有一系列条件会强制将可执行文件视为需要管理员特权:
  • 32位可执行文件
  • 没有requestedExecutionLevel的应用程序
  • 作为启用了LUA的标准用户运行的交互式进程
在创建32位进程之前,会检查以下属性以确定它是否为安装程序:
  • 文件名包括“install”、“setup”、“update”等关键字。
  • 以下版本资源字段中的关键字:供应商、公司名称、产品名称、文件说明、原始文件名、内部名称和导出名称。
  • 嵌入在可执行文件中的并置清单中的关键字。
  • 链接在可执行文件中的特定StringTable条目中的关键字。
  • 在可执行文件中链接的RC数据中的关键属性。
  • 在可执行文件中的目标字节序列。
相关的MSDN文章:http://technet.microsoft.com/en-us/library/cc709628%28WS.10%29.aspx 可能的解决方案:
  • 如果您是可执行文件的作者,请使用指定的requestedExecutionLevel包含清单
  • 如果您无法访问源代码,请尝试使用适当的工具(例如mt或可能是某些通用资源编辑器)添加或修改清单
  • 避免在可执行文件名中使用关键字updateinstallsetup

1
在复制文件后,尝试设置文件的 ACL 如下:
var file = new FileInfo("copy.exe")
 var fileSecurity = file.GetAccessControl();
 fileSecurity.AddAccessRule(new FileSystemAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null),
                                                                FileSystemRights.FullControl,
                                                                AccessControlType.Allow));
 file.SetAccessControl(fileSecurity);

0

你可能会发现问题与文件位置有关,而不是文件本身。Win 7非常挑剔,特别是如果你试图在Program Files下更改任何内容。

你是否尝试将原始文件放到新位置以检查是否也需要UAC批准?


是的,我试过了!每当我使用File.Copy()方法复制文件时,复制后的文件都需要UAC批准! - Rafik Bari
那么,如果您手动重命名并将文件复制到新位置,我可以假设您不需要UAT批准,这样理解是否正确? - DeanOC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接