如何查找文件是否已在同一台机器上创建?

How to find if a file has been created on the same machine or not?

我正在使用我的 c# 应用程序中的一个文件,我需要在每次访问它时检查它的合法性。有什么办法可以查明文件是来自另一台计算机还是在同一台计算机上创建的? 我认为有一种标志或 else 表明文件来自另一台 PC,如下面的屏幕截图:

此信息存储在 Zone.Identifier NTFS Alternate Data Stream 中。您可以像普通文件数据一样访问备用数据流(它本身也是一个流 - 未命名的数据流):

  • 在命令提示符中,您必须将流的名称附加到文件路径,前缀为 :

    more < some_file.exe:Zone.Identifier

  • 在 Powershell 中它是这样的:

    Get-Content -Path some_file.exe -Stream Zone.Identifier

在这两种情况下,如果文件被标记为从外部位置下载,它会输出:

[ZoneTransfer]
ZoneId=3

ZoneId 的可能有效值及其含义是 (from blog entry about ADS):

0 My Computer
1 Local Intranet Zone 
2 Trusted sites Zone 
3 Internet Zone 
4 Restricted Sites Zone 

不幸的是,没有 CLR class 为 ADS 提供支持(据我所知至少 none)。您可以考虑使用 these classes or command line tool Streams provided my Microsoft 来访问它们。

编辑: 当然,您可以轻松地从 C# 调用 Powershell 命令,但这将迫使您的应用程序的用户至少拥有 Powershell 2.0,可能还有 .NET 4.0 或更高版本(不确定后者):

    public static void Main(string[] args)
    {
        using (PowerShell powerShellInstance = PowerShell.Create())
        {
            powerShellInstance.AddCommand("Get-Content");
            powerShellInstance.AddParameter("-Path", @"C:\Path\To\File.exe");
            powerShellInstance.AddParameter("-Stream", "Zone.Identifier");

            Collection<PSObject> output = powerShellInstance.Invoke();

            foreach (PSObject obj in output)
            {
                if (obj != null && obj.ToString().StartsWith("ZoneId"))                        
                    Console.WriteLine(obj);                 
            }
        }
    }