【问题标题】:Testing a UNC Path's "Accessability"测试 UNC 路径“可访问性”
【发布时间】:2011-04-20 14:53:52
【问题描述】:

我的程序需要访问某个 UNC 路径,但该路径是跨域的,因此根据运行程序的机器,它可能有也可能没有默认凭据。通常,用户只需打开资源管理器并输入 UNC 或 IP 地址即可获得登录提示(此时他们可以为共享所在的域输入适当的凭据)。

是否有一种“干净”的方式来测试 UNC 的可访问性,如果默认的 Windows 凭据不好,那么会提示他们使用不同的凭据?

现在我正在使用一些讨厌的代码来尝试读取共享上的文本文件,捕获 IOException,然后打开一个“explorer.exe”进程对象(隐藏)以获取登录提示。这都包含在一个循环中,该循环在 10 秒后再次检查。它有点工作,但解决方案和逻辑似乎真的不可取。

我唯一的选择真的是WNetUseConnection 还是互操作式解决方案?

【问题讨论】:

    标签: c# .net networking


    【解决方案1】:

    查看这些文章:

    • Testing File Access Rights in .NET 2.0。用于测试文件系统权限的便捷类。
    • Vexing exceptions。 Eric Lippert 关于为什么先发制人的测试毫无意义(简而言之:存在隐含的竞争条件。在测试和实际访问之间,其他一些进程可能会更改权限、移动或删除文件,或者网络可能会掉线......等等。这意味着您必须处理尝试访问资源时引发的异常,因此您可以很好地构建代码以在问题实际发生时处理问题。

    我使用过这样的代码:

    new FileIOPermission(FileIOPermissionAccess.Read, path).Demand();
    

    如果您没有所需的访问权限,则应该抛出 SecurityException,但对于网络驱动器或 UNC 路径上的路径,FileIOPermission.Demand() 方法似乎是无操作的。

    【讨论】:

    • 先发制人的测试并非总是毫无意义。例如,有时提前测试可能会赢得性能。也就是说,问“嘿,您是否极有可能抛出异常?”可能会更便宜。而不是尝试它并等待异常。在长的多步骤过程中尤其如此,整个过程可能在最后一步失败。提前找出最后一步是否几乎肯定会失败可以节省您到达那里的工作。但话虽如此,是的,无论如何你都必须处理失败的情况。
    • 是的......'毫无意义'可能不是最好的说法。如果您已经知道该文件不存在/无法预先访问,您可能只想保释而不是做很多几乎肯定会徒劳的工作。
    • 我想我唯一担心的是在需要将文件写入共享之前以及当我的程序确实写入分享这是一个相当密集的过程(即大的 zip 文件)。如果用户无法正确访问 UNC,这可能会导致用户“浪费”5-10m 的时间。当然,我在 try/catch 中为 IOExceptions 包装了一些东西,我只是祈祷用户知道他们的意思(呵呵)。感谢您的帮助。
    【解决方案2】:

    我从来没有这样做过,但您可能要求做的是检查 NTFS 中的访问控制列表 (ACL)。

    我对 c# 和“访问控制列表”进行了网络搜索,并获得了一些您可能感兴趣的结果。这可能更干净,但可能并不比您已经在做的更容易。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多