6

我在一个胖客户端应用程序上工作,该应用程序经常在访问网络共享时遇到“问题”。在对服务器进行任何 IO 之前,我的应用程序会测试共享(通常形式为 \\server\share$)是否存在。这适用于检测客户端与服务器失去连接的情况,但仍然存在隐藏共享存在但用户无权从共享内读取的那些奇怪情况。有人可以分享(不是双关语)测试当前用户是否可以读取共享文件所需的 C# 代码吗?我应该查询共享的 ACL 还是共享中的文件?如果共享为空怎么办?如果用户是混合环境中的本地非管理员(XP Pro 工作站、Novell 网络上没有域的 Windows 2003 服务器)怎么办?

4

2 回答 2

12

最简单的方法就是这样做(例如,尝试读取文件)。正如 Jared 所提到的,没有办法确保您将来能够阅读(网络故障、权限更改等)。

就代码而言,您可以使用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上的信息,了解有关它抛出的异常的更多详细信息。

于 2009-04-15T19:20:57.333 回答
3

确定您是否曾经有权从共享中读取的#1 最可靠的方法

  1. 尝试从共享中读取
  2. 处理读取时可能发生的错误,并认为尝试失败

不幸的是,尽管根据您的描述,您正在尝试确定您是否拥有对该共享的读取权限。没有办法可靠地确定这一点。

无论有多少 ACL、目录等……当您完成查看它们的那一刻,您可能会通过任何数量的机制失去对共享的访问权限。最明显的一个是网络份额下降。您所能确定的只是您曾经拥有该共享的权限。

于 2009-04-15T18:51:40.087 回答