2011-04-20 99 views
5

我的程序需要访问特定的UNC路径,但路径是跨域的,因此根据运行程序的计算机的不同,它可能有也可能没有默认凭据。通常,用户必须打开资源管理器并键入UNC或IP地址才能获得登录提示(此时他们可以为共享所在的域键入适当的凭据)。测试UNC路径的“可访问性”

是否有“干净”的方式来测试UNC的可访问性,如果默认的Windows凭据不好,然后提示他们不同的?

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

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

回答

3

检查这些文章:

  • Testing File Access Rights in .NET 2.0。一个方便的类来测试文件系统权限。
  • Vexing exceptions。 Eric Lippert谈到为什么先发制人测试毫无意义(简而言之:存在一个隐含的竞争条件,在测试和实际访问之间,其他一些进程可能会更改权限,移动或删除文件,或者网络可能会丢失......等等。这意味着你必须处理当你尝试访问资源时抛出的异常,所以你可能会构建你的代码来处理实际发生的问题。

我已经使用类似代码这样的:

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

这是应该抛出SecurityException,如果你不具备所需的访问,但在网络驱动器或UNC路径的路径中,FileIOPermission.Demand()方法似乎是没有任何操作。

+0

事实并非总是如此,先发制人的测试是毫无意义的。例如,有时提前测试可能会取得成功。也就是说,问问“嘿,你是否极有可能抛出异常?”可能会更便宜。而不是尝试它并等待异常。这在长时间的多步骤流程中尤其如此,因为整个过程可能会在最后一步失败。如果最后一步几乎肯定会失败,那么提前查找可以为您节省到达目标的工作量。但是,那是说,不管怎样,你都必须处理失败案例。 – 2011-04-21 14:51:27

+0

是的......“毫无意义”可能不是短语的最佳转向。如果您已经知道该文件不存在/无法预先访问,您可能只想保释一下,而不是做很多工作,这几乎肯定是徒劳的。 – 2011-04-21 16:59:48

+0

我想我唯一担心的是在将文件写入共享之前,我的程序(SQL查询,用户交互等)中存在很多开销,并且当我的程序写入共享时,这是一个相当密集的过程即大的zip文件)。如果用户不能正确访问UNC,这可能会导致用户部分的5-10分钟“浪费”时间。当然,我在IOExceptions的try/catch中包装了一些东西,我只是祈祷用户知道他们的意思(heh)。感谢您的有益回应。 – Jai 2011-04-22 13:35:22

0

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

我做了一个c#和“访问控制列表”的网络搜索,并得到了一些您可能感兴趣的点击。这可能会更清洁,但是您已经在做的事情可能并不容易。