1

我有一种情况,我需要确认我能够获得对网络上特定文件夹的写访问权。因此,首先我检查用户或它所属的组之一(域组)访问规则中的身份之一。如果不是这种情况,那么我需要检查远程计算机上的所有本地组,以查看我的用户或用户组之一是否是计算机上本地组的成员。例如,在这台特定的机器上,我是 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)
        {

        }

谢谢,斯特凡

4

1 回答 1

1

简单地读取或写入文件夹然后捕获异常不是更容易吗?然后通知用户他/她无权访问。

于 2012-07-13T02:36:01.533 回答