0

我正在尝试学习如何创建一个新的 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 属性为空。同样,Options 属性为空。因此,我不相信我正确地创建了 GroupPrincipal。

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

提前致谢!

PS 价值

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

4

1 回答 1

0

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

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

于 2018-10-17T12:48:27.957 回答