我在一个经常遇到访问networking共享的“问题”的粗客户端应用程序上工作。 在使用服务器执行任何IO之前,我的应用程序testing共享(通常是\\ server \ share $forms)是否存在。 这对于检测客户端已经失去与服务器的连接的场景来说工作正常,但仍然存在隐藏份额存在的奇怪场景,但是用户没有从共享内部读取的权限。 有人可以共享(不是双关语意思)所需的C#代码来testing当前用户是否可以读取共享文件? 我应该查询共享的ACL还是共享内的文件? 如果份额是空的呢? 如果用户是混合环境中的本地非pipe理员(Novellnetworking上没有域的XP Pro工作站,Windows 2003服务器),该怎么办?
最简单的方法就是做(例如尝试读取文件)。 正如贾里德所说,没有办法确保您将来能够阅读(网络故障,权限更改等)。
就代码而言,您可以使用DirectoryInfo类尝试一些答案:
string remotePath = @"\\server\share$"; bool haveAccess = false; DirectoryInfo di = new DirectoryInfo(remotePath); if (di.Exists) { try { // you could also call GetDirectories or GetFiles // to test them individually // this will throw an exception if you don't have // rights to the directory, though var acl = di.GetAccessControl(); haveAccess = true; } catch (UnauthorizedAccessException uae) { if (uae.Message.Contains("read-only")) { // seems like it is just read-only haveAccess = true; } // no access, sorry // do something else... } }
上面的代码有很多缺点(比如硬编码的“只读”测试),但这只是一个例子,用来说明你可以做什么。 DirectoryInfo还有一些其他帮助程序方法,可以用来列出文件夹中的文件。 如果您没有访问权限,这些方法将抛出一个UnauthorizedAccessException
异常,您可以使用该异常来测试访问失败的原因。 查看GetAccessControl上的信息,了解有关异常的详细信息。
确定您是否拥有从共享中读取权限的最可靠的方法是
不幸的是,虽然根据你的描述你试图确定你是否有阅读权限的份额。 没有办法可靠地确定这一点。
无论有多少ACL,目录等等,只要看完目标,就可以通过许多机制失去对共享的访问权限。 最明显的一个是网络共享关闭。 所有你可以确定的是,你曾经有权限的份额。