当我从我的网站下载我的程序到我的 windows 2003 机器时,它上面有一个块,你必须右键单击 exe,然后属性,然后选择按钮“取消阻止”。
我想在我的安装程序中添加检测文件何时被阻止,因此没有足够的权限。
但是我不能轻易地重现让我的 exe 处于需要解除阻塞的状态。
我怎样才能让解除阻止出现在我的 exe 上,以便我可以测试这个功能?
当我从我的网站下载我的程序到我的 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 上搜索“Persistent Zone Identifier Object”。基本上你CoCreateInstance
有CLSID_PersistentZoneIdentifier
并请求一个IPersistFile
接口。然后,您使用相关文件的名称进行调用IPersistFile::Load
。接下来,QI为一个IZoneIdentifier
接口和用于IZoneIdentifier::GetId
获取文件的区域。如果没有“网络标记”,您应该得到URLZONE_LOCAL_MACHINE
. 另一个回复中提到的 3 的 ZoneId 是URLZONE_INTERNET
. (枚举被调用URLZONE
,也记录在 MSDN 上,或参见。)您可以通过调用或然后调用sdk\inc\urlmon.h
来删除或更改“网络标记” 。MSDN 上有关于所有这些的更多详细信息。祝你好运!IZoneIdentifier::Remove
IZoneIdentifier::SetId
IPersistFile::Save
感谢这对我帮助很大。
如果您创建包含内容的批处理文件,则可以使该过程更加容易。
echo [ZoneTransfer] > Zone.Identifier
echo ZoneId=3 >> Zone.Identifier
more Zone.Identifier > %1:Zone.Identifier
这将为您生成 Zone.Identifier 并相应地标记文件。
要运行它,只需提供文件名,例如,如果文件名为 mark.bat
mark.bat myfile.txt