2008-09-25 32 views
7

当我从我的网站上下载我的程序到我的Windows 2003机器时,它有一个块,你必须右键单击exe文件,然后属性,然后选择“Unblock”按钮。在Windows 2003的文件属性中重现被阻止的exe“unblock”选项

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

但我不能eaisly重现获取我的EXE在这种状态,它需要畅通无阻。

我怎样才能让我的exe文件出现unblock,这样我就可以测试这个功能了?

回答

19

这是使用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,或者简单地假设如果流存在于你的用户将收到该警告的全部位置。

还需注意的是,这与权限无关。管理员看到相同的警告;这完全取决于文件的来源和类型。当用户取消选中“在打开此文件前始终询问”框,然后单击“运行”,整个流将消失。

+0

伟大的信息,感谢您的帮助。 – 2008-09-25 20:59:39

11

有一个支持的API,在MSDN上有记录。在MSDN上搜索“持久区域标识符对象”。基本上你CoCreateInstanceCLSID_PersistentZoneIdentifier和请求IPersistFile接口。然后,您可以拨打IPersistFile::Load来查询相关文件的名称。接下来,QI为IZoneIdentifier接口并使用IZoneIdentifier::GetId来获取文件的区域。如果没有“网络标记”,则应该获得URLZONE_LOCAL_MACHINE。在另一个回复中提到的3区ZoneId是URLZONE_INTERNET。 (枚举被称为URLZONE,也在MSDN上记录,或参见sdk\inc\urlmon.h。)您可以通过拨打IZoneIdentifier::RemoveIZoneIdentifier::SetId然后致电IPersistFile::Save删除或更改“网络标记”。有关MSDN上所有这些的更多详细信息。祝你好运!

1

非常感谢您的帮助。

如果创建包含内容的批处理文件,您可以使处理更加简单。

echo [ZoneTransfer] > Zone.Identifier 
echo ZoneId=3 >> Zone.Identifier 
more Zone.Identifier > %1:Zone.Identifier 

这将为您生成Zone.Identifier并相应地标记文件。

要运行它只提供文件名例如如果该文件被称为mark.bat

mark.bat myfile.txt