在Windows 2003的文件属性中重现被阻止的exe"取消阻止"选项

时间:2020-03-06 14:44:42  来源:igfitidea点击:

当我从网站上将程序下载到Windows 2003机器上时,它上面有一个阻止程序,我们必须右键单击exe,然后单击属性,然后选择"取消阻止"按钮。

我想在安装程序中添加检测,以了解文件何时被阻止,因此没有足够的权限。

但是我无法轻易地重现将我的exe置于需要解除阻止的状态。

我怎样才能使解除阻止出现在我的exe上,以便我可以测试此功能?

解决方案

这是使用NTFS文件流完成的。有一个名为" Zone.Identifier"的流已添加到下载的文件中。当IE7下载流中包含的某些类型的文件时:

[ZoneTransfer]
ZoneId=3

设置它的最简单方法是创建一个包含这些内容的文本文件,然后使用更多文件将其添加到备用流中。

Zone.Identifier.txt:

[ZoneTransfer]
ZoneId=3

命令:

more Zone.Identifier.txt > file.exe:Zone.Identifier

然后,我们进行检查的方法是尝试打开Zone.Identifier流并查找ZoneId = 3,或者简单地假设该流是否存在,则用户将收到该警告。

同样重要的是要注意,这与权限无关。管理员会看到相同的警告;这完全与文件的来源和类型有关。当用户取消选中"在打开此文件之前始终询问"复选框,然后单击"运行"时,整个流消失。

有一个受支持的API,在MSDN上有记录。在MSDN上搜索"持久性区域标识符对象"。基本上,我们将CoCreateInstance和CLSID_PersistentZoneIdentifier一起请求IPersistFile接口。然后,使用相关文件名调用IPersistFile :: Load。接下来,使用QI表示" IZoneIdentifier"接口,并使用" IZoneIdentifier :: GetId"获取文件区域。如果没有"网络标记",则应获取" URLZONE_LOCAL_MACHINE"。在另一个答复中提到的ZoneId为3是" URLZONE_INTERNET"。 (该枚举称为" URLZONE",并且也记录在MSDN上,或者参见" sdk \ inc \ urlmon.h"。)我们可以通过调用IZoneIdentifier :: Remove或者来删除或者更改"网络标记"。 IZoneIdentifier :: SetId,然后调用IPersistFile :: Save。在MSDN上有关于所有这些的更多详细信息。祝你好运!