4

我正在处理的现有(基于 Web 的)项目使用客户端数据并使用客户端名称作为文件名保存报告。不幸的是,它从未过滤过这个客户名称,因此有人输入​​了包含冒号的客户名称(例如“workshop:alex”)用于测试目的。这导致文件名workshop:alex.pdf 在NTFS 系统上恰好是有效的。(因为它创建了一个名为“workshop”的文件,其中包含一个名为“alex.pdf”的备用数据流。由于应用程序还存储了文件名,因此再次读取它们没有问题,因为它只是引用了同一个 ADS。因此,没有人注意到这个问题...
然而,我最近开始从事这个项目,它必须迁移到带有 IIS 7 的 Windows 7 64 位。突然间,该站点不再使用这些 ADS 文件了!我很快就找到了原因,并意识到为什么它在过去从未失败过。(而且我还诅咒了以前从未检查过这个的开发人员!)但现在我想知道为什么它在 Windows 7 上失败了......那么,有人知道吗?


我有一个修复,顺便说一句!现在过滤了文件名,从而解决了问题。我只是好奇为什么。在较新的 Windows 版本上可能导致这些问题的原因是什么?


关于应用程序:它是本地 IIS 安装与 WIN32 客户端应用程序的混合体。基本上,报告解决方案被开发为 Web 应用程序,并创建了以前使用 Word 进行报告的桌面应用程序。一些经理认为,如果桌面应用程序使用 Web 应用程序的逻辑来生成报告,这可能是一个好主意。我承认:这不是一个非常聪明的主意......
结果是每个用户都将在他们的系统上运行 IIS,其中包含 Web 应用程序,同时他们在同一台机器上也有桌面应用程序。为了使它们进行通信,使用 C# 创建了一个单独的 Web 服务,而 Web 应用程序是用经典的 ASP 构建的,而桌面应用程序是用 Delphi 构建的。桌面应用程序将通过本地 Web 服务将数据发送到数据库,然后登录到本地 Web 应用程序,告诉它生成报告,然后下载...
在这个编码地狱中哪里出了问题还不是很清楚。但由于文件名基于桌面应用程序的数据,有时包含冒号,因此有时会创建 ADS 而不是常规文件名。在 Windows 7 之前的 Windows 版本上,这似乎工作正常。这些文件已写入,IIS 还将它们作为 PDF 文件提供给桌面应用程序。(从那里您可以使用普通文件名“另存为”。
此应用程序在 Windows 7(64 位)上只是中断,因为它可以将文件写入 ADS 流,当向数据添加冒号时,但它无法再次检索它们。虽然我们现在从生成的文件名中过滤掉冒号,但我只是想知道这个问题的可能原因。所以这是一个出于好奇的问题......

4

4 回答 4

2

很难说没有错误信息。您可能已经检查过了,但是:

  • 您是否有机会将文件保存到 FAT 卷?
  • 也许是杀毒软件介入并将 ADS 视为攻击?

不过,我现在对这个问题很好奇。如果您对此有所了解,请分享:)


编辑:你可能没有时间,但这是我会做的:

  1. 尝试以管理员身份运行 IIS,看看是否还有问题
  2. 如果是,那么这可能是 IIS7 问题,或 Win 7 上的 Scripting.FileSystem 问题
  3. 如果不是,那么您现在可以确定这与安全相关。将 IIS 还原为非管理员
  4. 将输出文件夹的完全控制权交给 IIS 用户(您在其中创建/读取 ADS)
  5. 这应该正常工作。不过测试一下
  6. 逐一删除文件夹的权限,看看何时可以再次重现您的问题。

我的猜测可能是权限“READ ATTRIBUTES”或“READ EXTENDED ATTRIBUTES”

如果仍然没有答案,为什么不启动 Sysinternal Process Monitor 来检查实际情况。他们的工具“Streams”也可能有所帮助。

于 2011-02-16T16:31:54.187 回答
1

通常网络共享不支持备用数据流,因为规范不支持它们,因此如果通过“迁移”站点并复制生成的文件,那么所有 ADS 流都将丢失。

我建议下载 technet sysinternals 工具以验证文件确实在新服务器上具有 ADS 流。 http://technet.microsoft.com/en-us/sysinternals/bb545046

于 2011-02-16T16:47:34.917 回答
0

你碰巧读的是名字workshop.pdf:alex.pdf而不是workshop:alex.pdf?我不知道您的程序是如何工作的,但它是否会尝试自动添加扩展名,因此找不到文件(因为它不存在)?

于 2011-02-18T09:24:38.233 回答
0

我不确定这是否也适用于编程(我假设如此),但 Windows 7 在尝试通过命令行访问 ADS 时会过滤掉文件名中的冒号,就像你说的那样;如果您在尝试访问 ADS 时在文件名周围加上引号,则不会遇到此问题。在文件名周围使用引号也应该适用于旧操作系统,因此您不必担心跨客户端的兼容性问题。

CMD 示例:c:> start "Textfile.txt:cmd.exe"

我想造成这种情况的原因不仅是因为您提供的原因,还因为类似于正则表达式/通配符问题,这导致我在使用 Linux 命令行(* 或 .*)时非常困难。命令行中可能添加了一些在文件名或语法中使用冒号的内容,因此要求用户通过用引号转义序列来区分 ADS 和添加的命令功能。

于 2011-05-16T03:50:29.007 回答