我正在尝试学习如何创建一个新的 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,它与我正在编写的应用程序在检查用户所属的组是否具有具有此值的访问规则时使用的特定唯一权限映射相关。