2008-09-25 33 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