获取整个网络的文件权限

时间:2012-07-13 02:30:20

标签: c# network-programming file-access

我有一种情况需要确认我能够对网络上的特定文件夹进行写访问。首先,我检查的是用户或其中一个组(域组)访问规则中的一个标识。如果不是这种情况,那么我需要检查远程计算机上的所有本地组,以查看我的用户或其中一个用户组是否是计算机上本地组的成员。例如,在这台特定的机器上,我是BUILTIN \ Administrators的成员,这意味着我对给定的文件夹具有写入权限。但是我不清楚如何从远程计算机获取该本地组以检查我是否具有写访问权。

在下面的代码中,当我尝试使用GroupPrincipal.FindByIdentity时,它会给出一个异常“绑定句柄无效”。我不清楚什么是无效的。如果我只是尝试验证我的用户名和密码(域用户名),使用ctx.ValidateCredentials(UserName,Password),它会给出完全相同的错误。

如果我将机器名称仅仅命名为“pvr-pc”,则表示它无法在网络上找到该名称,但“\\ pvr-pc”确实可以解决该问题。

相同的代码正确地发现我所属的组之一是我本地计算机上的BUILTIN \ Administrators中的一个组,所以这是关于网络访问的问题。

有没有人有任何想法我做错了什么?

代码如下所示:

using (WindowsIdentity identity = GetUserIdentity())
{
    if (identity != null)
    {
        try
        {

            FileInfo fi = new FileInfo(@"\\pvr-pc\c\installers\");
            AuthorizationRuleCollection acl = fi.GetAccessControl().GetAccessRules
                (true, true, typeof (SecurityIdentifier));

            var rules = acl.Cast<FileSystemAccessRule>();

            List<string> sids = new List<string>();

            sids.Add(identity.User.Value);

            sids.AddRange(identity.Groups.Select(identityReference => identityReference.Value));

            // check for a direct user match
            var matches = from r in rules where sids.Contains(r.IdentityReference.Value) select r;
            foreach (FileSystemAccessRule accessRule in matches)
            {
                // apply rules
            }

            foreach (FileSystemAccessRule rule in rules)
            {

                // if it is built in, try and get the group
                var groupDetail = rule.IdentityReference.Translate(typeof (NTAccount));
                if (!groupDetail.Value.StartsWith("BUILTIN\\")) continue;
                PrincipalContext ctx = new PrincipalContext(ContextType.Machine, @"\\pvr-pc", null,
                                                            ContextOptions.Negotiate, UserName, Password);

                GroupPrincipal grp = GroupPrincipal.FindByIdentity(ctx, IdentityType.Sid,
                                                                    rule.IdentityReference.Value);
                if (grp != null)
                {
                    //// find out if we are a member of the group
                    var isInGroup = (from g in grp.GetMembers(true)
                                        where sids.Contains(g.Sid.ToString())
                                        select g).Any();
                    if (isInGroup)
                    {
                        // apply rules
                    }
                }
            }
        }
        catch (Exception ex)
        {

        }

谢谢, 斯蒂芬

1 个答案:

答案 0 :(得分:1)

简单地读取或写入文件夹然后捕获异常会不容易;然后通知用户他/她没有访问权限。