当我将我的程序从我的网站下载到Windows 2003机器时,它被阻止了,您需要右键单击exe,然后选择属性,再选择“取消阻止”按钮。
我希望在我的安装程序中添加检测功能,以便在文件被阻止且没有足够权限时进行识别。
但是我无法简单地重现我的exe处于需要取消阻止状态的情况。
我该如何让取消阻止选项出现在我的exe上,以便我可以测试这个功能?
当我将我的程序从我的网站下载到Windows 2003机器时,它被阻止了,您需要右键单击exe,然后选择属性,再选择“取消阻止”按钮。
我希望在我的安装程序中添加检测功能,以便在文件被阻止且没有足够权限时进行识别。
但是我无法简单地重现我的exe处于需要取消阻止状态的情况。
我该如何让取消阻止选项出现在我的exe上,以便我可以测试这个功能?
这是使用NTFS文件流完成的。下载的文件中添加了一个名为“Zone.Identifier”的流。当IE7下载某些类型的文件时,该流包含以下内容:
[ZoneTransfer]
ZoneId=3
最简单的设置方法是创建一个包含这些内容的文本文件,并使用 more 命令将其添加到备用数据流中。
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”。基本上,你需要使用CLSID_PersistentZoneIdentifier
调用CoCreateInstance
并请求一个IPersistFile
接口。然后,使用所涉及文件的名称调用IPersistFile::Load
。接下来,QI一个IZoneIdentifier
接口并使用IZoneIdentifier::GetId
获取文件的区域。如果没有“网络标记”,则应该获得URLZONE_LOCAL_MACHINE
。另一个回复中提到的ZoneId 3是URLZONE_INTERNET
。(枚举称为URLZONE
,也在MSDN上记录,或参见)。您可以通过调用IZoneIdentifier::Remove
或IZoneIdentifier::SetId
来删除或更改“网络标记”,然后调用IPersistFile::Save
。关于所有这些的更多详细信息,请参阅MSDN。祝好运!
非常感谢,这对我很有帮助。
如果您创建一个包含内容的批处理文件,您可以使流程变得更加容易。
echo [ZoneTransfer] > Zone.Identifier
echo ZoneId=3 >> Zone.Identifier
more Zone.Identifier > %1:Zone.Identifier
这将为您生成Zone.Identifier并相应地标记文件。
只需提供文件名即可运行它,例如,如果文件名为mark.bat。
mark.bat myfile.txt