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

时间:2012-07-15 22:28:53

标签: c# .net visual-studio-2010

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

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

现在我看到Copy.exe需要在Windows 7 / Vista下运行UAC警告。

我如何在Original.exe和Copy.exe之间进行比较,以确切了解文件发生了什么并手动更改,以便它不再需要UAC。我可以使用哪种工具来实现这一目标?

enter image description here

可执行的是同一个文件:如何知道这两个文件之间的区别?

3 个答案:

答案 0 :(得分:6)

Windows Installer Detection Technology就是这种行为的原因。有一组条件迫使可执行文件被视为需要管理员权限:

  
      
  1. 32位可执行文件
  2.   
  3. 没有requestedExecutionLevel的应用程序
  4.   
  5. 以启用LUA的标准用户身份运行的交互式进程
  6.         

    在创建32位进程之前,以下属性是   检查以确定它是否是安装程序:

         
        
    • 文件名包含"安装,"等关键字。 "设置," "更新,"等
    •   
    • 以下版本控制资源字段中的关键字:供应商,公司名称,产品名称,文件描述,原始文件名,   内部名称和导出名称。
    •   
    • 可执行文件中嵌入的并排清单中的关键字。
    •   
    • 可执行文件中链接的特定StringTable条目中的关键字。
    •   
    • 可执行文件中链接的RC数据中的关键属性。
    •   
    • 可执行文件中的目标字节序列。
    •   

相关MSDN文章:http://technet.microsoft.com/en-us/library/cc709628%28WS.10%29.aspx

可能的解决方案:

  • 如果您是可执行文件的作者,请包含指定requestedExecutionLevel
  • 的清单
  • 如果您无法访问源代码 - 请尝试使用适当的实用程序添加或修改清单(例如mt或某些通用资源编辑器)
  • 避免使用可执行文件名中的关键字updateinstallsetup

答案 1 :(得分: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);

答案 2 :(得分:0)

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

您是否尝试将原始文件放在新位置以检查是否还需要UAC批准?