2015-07-10 155 views
0

我正在使用我的c#应用程序中的一个文件,我需要检查每次访问它时的合法性。有没有什么方法可以找到这个文件是来自另一台计算机还是已经在同一台机器上进行了创建? 我觉得有一种标志或其他指示文件从另一台电脑来了,像下面的截图:

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

enter image description here

+1

该文件是如何创建的?另一种方法是对文件进行加密签名,以便验证其来源。 – muddymess

+1

“其他机器”如何创建文件?我认为,操作系统只在自己的机器上创建时才跟踪它。也许你可以跟踪创建的用户或所有者,但不是机器CMIIW。尽管操作系统不支持它,但也可以创建自己的自定义应用程序来解决您的问题。也许filewatcher是一个很好的解决方案来匹配你的问题。您可以跟踪和匹配该文件的上次访问和上次修改时间。 –

+0

我认为文件系统中有一些东西显示了这一点。请看[这个截图](http://i60.tinypic.com/30xdav7.jpg) –

回答

3

此信息存储在NTFS Zone.IdentifierAlternate Data Stream。您可以访问备用数据流非常像普通的文件数据(这本身也是一个流 - 一个无名数据流):

  • 在命令提示符窗口,你必须追加流的名称,由前缀:文件路径:

    more < some_file.exe:Zone.Identifier

  • 在PowerShell中它是这样的:

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

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

[ZoneTransfer] 
ZoneId=3 

可能的有效值和它们的含义是(from blog entry about ADS):

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

不幸的是,没有CLR类为ADS提供支持(至少没有我知道的)。您可以考虑使用these classes或命令行工具Streams提供给我的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);     
      } 
     } 
    } 
相关问题