Unblock File from within .net 4 c#
Solution 1
It's stored in the :Zone.Identifier
stream (more < c:\theapp.exe:Zone.Identifier
) you need to use the native IO routines to manipulate them, here is a managed wrapper.
Solution 2
Based on your input I have done the following code:
public class FileUnblocker {
[DllImport("kernel32", CharSet = CharSet.Unicode, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool DeleteFile(string name);
public bool Unblock(string fileName) {
return DeleteFile(fileName + ":Zone.Identifier");
}
}
Thanks to Stuart Dunkeld, Alex K(+1) and Sven to show me the direction.
UPDATE I have posted the code here for a feedback if it would work reliable in production environment. If someone want to use it, check out there.
Solution 3
The official way to manage this identifier is with the PersistentZoneIdentifier COM object: http://msdn.microsoft.com/en-us/library/ms537029(v=vs.85).aspx
HCL
Updated on June 01, 2022Comments
-
HCL almost 2 years
Is there a possibility to unblock a file that is downloaded from the internet from within a c# program. Surfing the internet I have learned, that the information is written in an alternative stream of a (NTFS) file that contains the current zone information (value 3 is from the internet and is interpreted as blocked).
Is there a managed possiblity to either clear or change the zone information (unblock) of a file or is there a managed copy function that copies the files without the zone information? If not, how can I do with PInvoke but without including a foreign assembly (I'm not allowed to do this in a current project).
-
Sam Axe almost 9 yearsUpdates like this should be posted as an edit to your question.
-
Sam Axe almost 9 yearsWhile this may work for now, it is an implementation detail. The Persistent Zone Identifier object, as mentioned by @citizenmatt, is the bit responsible for creating these. As such, MS may at any time, via Windows update or OS version, change how/where that data is stored.