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

Why is the ObjectSecurity property in the DirectoryEntry instance of a GroupPrincipal always null?

我正在尝试学习如何创建一个新的 Windows 组(使用 C#)并使用本地 user/group 目录服务为其分配一个 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 属性 为空。同样,Options 属性 为空。因此,我不相信我是否正确创建了 GroupPrincipal。

如果在这方面有一定经验或知识的人可以帮助我理解我需要做什么才能像我上面尝试的那样向组对象添加访问规则,那就太好了。

提前致谢!

P.S。值

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

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

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