Comprendere il blocco e lo sblocco dei file Internet

 C Programming >> Programmazione C >  >> Tags >> File
Comprendere il blocco e lo sblocco dei file Internet

In Windows XP SP2 + IE 7 e versioni successive di Windows, i file da Internet sono contrassegnati. A volte questa funzione causa problemi.

I problemi

Oggi, quando ho avviato Visual Studio 2008 per eseguire unit test di WebOS, non è stato possibile avviare tutti i test:

  

Il messaggio è:

Per risolvere questo problema, fai clic con il pulsante destro del mouse sul file "non attendibile", scegli "Proprietà":

e fai clic su "Sblocca". Quindi l'unità prova le rocce.

Questo perché il codice viene estratto da un file zip e il file zip viene scaricato da Gmail. Poiché il file zip da Internet è bloccato, vengono bloccati anche i file estratti.

Un altro esempio (non un problema) è che se scarichiamo un installer da Internet, viene anche contrassegnato come bloccato:

 

E così è il file chm:

 

  

Lo sblocco è necessario per sfogliare il contenuto di chm.

I flussi di dati alternativi NTFS

Questo blocco di file/directory è fornito per impostazione predefinita su:

  • Windows XP SP2 con IE 7
  • Più tardi Windows, come Windows Vista

E contrassegnare il file/la directory come bloccato/sbloccato viene implementato tramite la funzione di flusso di dati alternativo, che è una caratteristica del file system NTFS. I flussi di dati alternativi sono solo alcuni dati come coppie chiave-valore allegate a un file o una cartella.

Negli scenari precedenti (La mia macchina è Windows Vista + IE 7), poiché il file WebOS.zip viene scaricato dall'allegato Gmail, il file è contrassegnato dall'impostazione di tale coppia chiave-valore:

  • chiave (nome flusso di dati):Zone.Identifier;
  • valore (contenuto del flusso di dati):[ZoneTransfer]
    ZoneId=3

Qui

  • 1 =attendibile;
  • 2 =intranet;
  • 3 =Internet;
  • 4 =non attendibile.

Il flusso di dati alternativo di cui sopra può essere esaminato tramite riga di comando:

more < WebOS.zip:Zone.Identifier

È così che il file WebOS.zip viene contrassegnato come bloccato per migliorare la sicurezza e nella finestra di dialogo delle proprietà viene visualizzato un pulsante "Sblocca".

In realtà qualsiasi file / directory contrassegnato con questo flusso di dati alternativo di Zone.Identifier viene considerato da Internet e bloccato da Windows. È possibile creare un file test.txt per testare questo:

echo test > test.txt

controllando le sue proprietà, questo test.txt è ovviamente sbloccato. Ora inietta lo stesso flusso di dati alternativo di Zone.Identifier in test.txt:

more < WebOS.zip:Zone.Identifier > test.txt:Zone.Identifier

Facendo clic sul pulsante "Sblocca", la coppia chiave-valore viene rimossa dal file, quindi il file viene trattato come sbloccato da Windows.

Se i file in WebOS.zip vengono estratti senza sbloccare WebOS.zip, anche quei file avranno lo stesso flusso di dati alternativo, indicando che provengono da Internet. Quindi sono bloccati, proprio come il file test.website.models.dll.config sopra.

Per maggiori dettagli su come proviene il flusso di dati alternativo NTFS e come funziona, controlla Wikipedia e questo articolo.

Rimuovi il flusso di dati Zone.Identifier

È possibile utilizzare diversi modi per rimuovere il flusso di dati Zone.Identifier per sbloccare file/directory:

  • Configura Windows per disabilitare questa funzione
  • Usa le righe di comando
  • Utilizzare streams.exe fornito in Sysinternals Suite
  • Rimuove programmaticamente il flusso di dati

Per disabilitare questa funzione in Windows, vai a questo posto:

  

Il comando type può essere utilizzato per rimuovere i flussi di dati:

ren WebOS.zip WebOS.zip.bak
type WebOS.zip.bak > WebOS.zip
del WebOS.zip.bak

Nel secondo passaggio, i flussi di dati di WebOS.zip.bak non arrivano a WebOS.zip.

A volte abbiamo bisogno di sbloccare in blocco file/directory. streams.exe può rimuovere tutti i flussi di dati da una directory in modo ricorsivo. E questa libreria può essere utilizzata per rimuovere a livello di codice il flusso di dati. Fornisce utili metodi di estensione come FileSystemInfo.GetAlternateDataStream(), FileSystemInfo.DeleteAlternateDataStream(), in modo che questi metodi possano essere invocati sia su FileInfo che su DirectoryInfo.

using System;
using System.Globalization;
using System.IO;

using Trinet.Core.IO.Ntfs;

public static class FileInfoExtensions
{
    private const string ZoneIdentifierStreamName = "Zone.Identifier";

    public static void Unblock(this FileInfo file)
    {
        if (file == null)
        {
            throw new ArgumentNullException("file");
        }

        if (!file.Exists)
        {
            throw new FileNotFoundException("Unable to find the specified file.", file.FullName);
        }

        if (file.Exists && file.AlternateDataStreamExists(ZoneIdentifierStreamName))
        {
            file.DeleteAlternateDataStream(ZoneIdentifierStreamName);
        }
    }
}

public static class DirectoryInfoExtensions
{
    private const string ZoneIdentifierStreamName = "Zone.Identifier";

    public static void Unblock(this DirectoryInfo directory)
    {
        directory.Unblock(false);
    }

    public static void Unblock(this DirectoryInfo directory, bool isRecursive)
    {
        if (directory == null)
        {
            throw new ArgumentNullException("file");
        }

        if (!directory.Exists)
        {
            throw new DirectoryNotFoundException(string.Format(CultureInfo.InvariantCulture, "The specified directory '{0}' cannot be found.", directory.FullName));
        }

        if (directory.AlternateDataStreamExists(ZoneIdentifierStreamName))
        {
            directory.DeleteAlternateDataStream(ZoneIdentifierStreamName);
        }

        if (!isRecursive)
        {
            return;
        }

        foreach (DirectoryInfo item in directory.GetDirectories())
        {
            item.Unblock(true);
        }

        foreach (FileInfo item in directory.GetFiles())
        {
            item.Unblock();
        }
    }
}

Il codice sopra è stato testato su Windows Vista e Windows Server 2008.