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).
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.
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.
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
来源:https://stackoverflow.com/questions/6374673/unblock-file-from-within-net-4-c-sharp