为什么GroupPrincipal的DirectoryEntry实例中的ObjectSecurity属性始终为null?

时间:2018-07-27 14:04:09

标签: c# directoryentry groupprincipal

我正在尝试学习如何创建一个新的Windows组(使用C#)并通过使用本地用户/组目录服务为其分配AccessRule。

我编写了以下代码,试图首先创建该组,为其获取DirectoryEntry,然后创建并分配一个新的自定义AccessRule:

using System;
using System.DirectoryServices;
using System.DirectoryServices.AccountManagement;
using System.Security.AccessControl;

...
...

var principalContext = new PrincipalContext(ContextType.Machine);
var group = GroupPrincipal.FindByIdentity(principalContext, "groupName");
if (group == null)
{
    group = new GroupPrincipal(principalContext)
    {
        Name = "groupName",
        GroupScope = GroupScope.Local,
        Description = "groupName description",
        SamAccountName = "groupName",
    };

    group.Save();
}

var path = $"WinNT://{Environment.MachineName}/groupName,group";
var directoryEntry = new DirectoryEntry(path);

var accessRule = new ActiveDirectoryAccessRule(
    group.Sid,
    ActiveDirectoryRights.WriteProperty,
    AccessControlType.Allow,
    PermissionsDataSource.CanOverrideExpiredKeysPermissionId,
    ActiveDirectorySecurityInheritance.None);

directoryEntry.ObjectSecurity.AddAccessRule(accessRule);
directoryEntry.Options.SecurityMasks = SecurityMasks.Dacl;

directoryEntry.CommitChanges();

当前导致我出现问题的行是尝试将新创建的访问规则添加到安全对象的以下行:

directoryEntry.ObjectSecurity.AddAccessRule(accessRule);

ObjectSecurity属性为null。同样,Options属性为null。因此,我不确信自己正确地创建了GroupPrincipal。

如果在该领域有一定经验或知识的人能够像我上面所做的那样,能够帮助我理解为组对象添加访问规则所需要做的事情,那将是令人惊讶的事情。

谢谢!

P.S。值

PermissionsDataSource.CanOverrideExpiredKeysPermissionId
只是一个任意Guid,它与我正在编写的应用程序在检查用户所属的组是否具有此值的访问规则时所使用的特定唯一权限映射有关。 >

1 个答案:

答案 0 :(得分:0)

您正在与本地小组合作。本地Windows组没有权限。

您可以通过打开计算机管理(compmgmt.msc)->本地用户和组->组来查看。右键单击一个组,然后单击“属性”。您会看到没有“安全性”选项卡。