【问题标题】:FileSystemWatcher Fails to access network driveFileSystemWatcher 无法访问网络驱动器
【发布时间】:2009-06-06 19:07:41
【问题描述】:

我正在尝试使用 Windows 服务在某些服务器路径上运行文件观察程序。 我正在使用我的 Windows 登录凭据来运行该服务,并且能够从我的登录中访问此“someServerPath”。 但是当我从 FileSystemWatcher 执行此操作时,它会抛出:

目录名\someServerPath 无效”异常。

var fileWatcher = new FileSystemWatcher(GetServerPath()) 
    {
        NotifyFilter=(NotifyFilters.LastWrite|NotifyFilters.FileName),
        EnableRaisingEvents=true,
        IncludeSubdirectories=true
    };

public static string GetServerPath() 
{
    return string.Format(@"\\{0}", FileServer1);              
}

谁能帮我解决这个问题?

【问题讨论】:

    标签: c# windows-services filesystemwatcher


    【解决方案1】:

    我有使用 FileSystemWatcher 对象监控 UNC 路径的项目,没有任何问题。

    通过查看您的代码示例,我的猜测可能是您将观察程序指向服务器的根共享 (//servername/),这可能不是有效的文件系统共享?我知道它会在 Windows 资源管理器中返回打印机、计划任务等内容。

    尝试将观察者指向根目录下的共享 - 如果您在服务器上具有远程管理权限,则 //servername/c$/ 之类的内容将是一个很好的测试示例。

    【讨论】:

    • 谢谢。这似乎是这里的问题。
    • 似乎根本不适用于远程桌面上的 //tsclient/ 共享。没有错误,但是当文件更改时,监视器不会拾取任何东西。如果您尝试将 //tsclient/ 共享映射到驱动器,它可以正常映射,但如果您指定映射的驱动器号,FileSystemWatcher 会引发错误。
    【解决方案2】:

    关于更新后的问题,我同意您可能需要指定一个有效的共享,而不仅仅是远程服务器名称。

    [更新] 修复了之前关于异常的问题:

    指定名称为@"\\someServerPath"

    \ 被转义为单个 \

    当您在字符串前面加上 @ 符号时,它不会处理转义序列。

    【讨论】:

    • 这听起来不错,但我认为路径实际上是从配置文件或数据库中读取的变量。也许他应该向我们展示实际的代码......
    • 当然我也在做同样的事情。另外,我在返回此路径的变量之前使用@"\\path"。
    【解决方案3】:

    我刚刚被问到这个关于作为服务运行的 FileSystemWatcher 代码的问题,问题是权限。我搜索并找到了这个问题和答案,但不幸的是,这里的答案都没有解决问题。无论如何,我刚刚解决了它,所以我想我会在这里为下一个搜索并找到这个问题的人提供解决方案。

    驱动器被映射为登录用户,但服务运行为LocalSystem。 LocalSystem 是不同的帐户,无权访问用户映射的驱动器。

    解决方法是:

    1. 先验证(我用的是C# Class to establish a network connection with credentials
    2. 以有权访问共享的用户身份运行您的服务。

    您可以使用 LocalSystem 命令提示符测试 LocalSystem 身份验证,请参阅How to open a command prompt running as Local System?

    【讨论】:

    • 最好的解决方案是使用对驱动器/文件夹具有正确权限的 NetworkService 帐户。主题链接:Using NetworkService
    • 我认为这是正确的答案,我遇到了同样的问题,如果我在控制台应用程序运行正常的情况下执行服务,否则无法找到网络路径。
    【解决方案4】:

    即使已经回答了这个问题,我还是认为我会付出两分钱的代价,因为即使你提供了有效的路径,你也会看到同样的错误。

    当运行 watcher 的进程无权访问远程共享时,您将收到相同的错误。如果观察者在系统帐户下运行的服务中并且共享是由用户创建的,则会发生这种情况。系统无权访问该共享并且无法识别它,您需要模拟用户才能访问它。

    【讨论】:

      【解决方案5】:

      虽然您可以通过网络使用 FileWatcher,但您必须考虑其他因素,例如网络共享的断开连接。如果您与共享的连接被终止(维护、延迟、设备重置等),您将不再在文件观察器中拥有对共享的有效句柄

      【讨论】:

        【解决方案6】:

        您没有在包含您要监视的目录的物理机上运行 FileSystemWatcher 是否有任何特殊原因?

        【讨论】:

        • 它是一个运行在邮件服务器上并通过网络从不同位置读取文件的 Windows 服务。
        • 你不能让其他服务器“发送”他们的文件到主服务器吗?
        • 哦,加油!我们选择不同服务器的原因是因为我们希望将不同的职责和访问级别委派给每个服务器。为什么我要跨不同的服务器复制数据?无论如何,它完全是一个不同的对话。感谢您的关注。
        • 是的,我知道复制服务并不理想,但在这种情况下,我认为它是一个更好的选择。您可能在主服务器上有一个“主”服务,它是处理所有传入文件的权限/安全层
        【解决方案7】:

        您不能通过网络共享使用目录监视,这是操作系统的限制,而不是 .NET。

        【讨论】:

        • 你的意思是说,文件监视程序(由于操作系统限制)不能监视物理上在其他机器上的目录?
        • 我已经在同一台机器的映射路径上成功使用了 filewatcher。我的意思是,filewatcher 监视 "\\server\SharedFolder" ,而填充位于 "C:\serviceFolder\SharedFolder" 中。这种情况工作正常,这里的区别在于两者都指向同一台机器,这与上面给出的示例不同。是这个问题吗??
        • 这里试图给你一个提示 - 仅仅因为你可以通过使用映射驱动器来欺骗警告并不意味着你的手表会真正工作
        • 观察者在远程共享、映射驱动器等上工作得很好,所以要么我不明白提示,要么你很困惑。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多