我的C#app如何测试用户是否具有对网络共享的“读取”访问权限?

时间:2009-04-15 18:44:14

标签: c# windows acl novell

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

2 个答案:

答案 0 :(得分:10)

最简单的方法就是这样做(例如,尝试读取文件)。正如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上的信息,了解有关其例外情况的更多详细信息。

答案 1 :(得分:3)

确定您曾经允许从共享中读取权限的第一个最可靠的方法是

  1. 尝试阅读共享
  2. 处理阅读时可能发生的错误并考虑尝试失败
  3. 很遗憾,但根据您的说明,您正在尝试确定是否具有对该共享的读取权限。没有办法可靠地确定这一点。

    无论有多少ACL,目录等......你看着你看完它们的那一刻,你就可能通过任意数量的机制失去对共享的访问权限。最明显的一个是网络份额下降。您可以确定的是曾经拥有共享权限。