【问题标题】:Accessing/parsing "msDS-AllowedToActOnBehalfOfOtherIdentity" AD property in C#在 C# 中访问/解析“msDS-AllowedToActOnBehalfOfOtherIdentity”AD 属性
【发布时间】:2019-12-01 23:01:42
【问题描述】:

我需要在C# 中管理Kerberos Resource Based Delegation(我知道在Powershell 中更容易,但这不是必需的)。 user/computer/service 帐户上的属性是 msDS-AllowedToActOnBehalfOfOtherIdentity,但这似乎是一些 COM 对象,我似乎无法在 C# 中处理:

static void Main(string[] args)
{
    string ou = @"OU=some,OU=ou,DC=corp,DC=com";
    string cn = @"someaccount";

    DirectoryEntry de = new DirectoryEntry();

    de.Username = @"CORP\userwithOUrights";
    de.Password = @"password";
    de.AuthenticationType = AuthenticationTypes.Secure;
    de.Path = $"LDAP://CN={cn},{ou}";
    Object a = de.Properties["msDS-AllowedToActOnBehalfOfOtherIdentity"];
}

在此之后,a 与其他属性不同,我似乎无能为力。这是一些COM 对象,我需要获取其中的帐户。 Powershell 报告此属性返回一个 System.DirectoryServices.ActiveDirectorySecurity 对象,我在此类中看到有用的方法来解码存储在 AD 等中的二进制格式。但这似乎不是 @987654333 中属性调用的返回类型@。

【问题讨论】:

    标签: c# active-directory kerberos-delegation


    【解决方案1】:

    更新:所有这些现在都在我网站上的一篇文章中得到了更好的记录:Handling NT Security Descriptor attributes


    根据this,该属性的“属性语法”是2.5.5.15。根据this,这意味着它是一个“字符串(NT-Sec-Desc)”。根据this,这意味着它是一个IADsSecurityDescriptor COM 对象。

    您可以在项目中将 COM 引用添加到“Active DS 类型库”并将其直接转换为 IADsSecurityDescriptor,如下所示:

    var act = (ActiveDs.IADsSecurityDescriptor)
                  de.Properties["msDS-AllowedToActOnBehalfOfOtherIdentity"].Value;
    Console.WriteLine(act.Owner);
    

    Owner 属性为您提供DOMAIN\Username

    根据this random code我发现,看来你也可以使用RawSecurityDescriptor类与之交互。有a constructor that takes a plain string,但您似乎也无法从DirectoryEntry 的属性中获取原始字符串。

    但我确实记得,有时DirectorySearcher 会为您提供与DirectoryEntry 不同类型的值(没有意义,但确实如此)。这似乎是真的。 DirectorySearcher 将此属性作为byte[] 提供给您,而RawSecurityDescriptor 确实具有a constructor that takes a byte[]

    看来你可以这样做:

    string ou = @"OU=some,OU=ou,DC=corp,DC=com";
    string cn = @"someaccount";
    
    var search = new DirectorySearcher(new DirectoryEntry($"LDAP://{ou}"), $"(cn={cn})");
    search.PropertiesToLoad.Add("msDS-AllowedToActOnBehalfOfOtherIdentity");
    
    var result = search.FindOne();
    
    var act = new RawSecurityDescriptor(
        (byte[]) result.Properties["msDS-AllowedToActOnBehalfOfOtherIdentity"][0], 0);
    
    Console.WriteLine(act.Owner);
    
    //make changes to act.DiscretionaryAcl
    
    byte[] descriptor_buffer = new byte[act.BinaryLength];
    act.GetBinaryForm(descriptor_buffer, 0);
    
    var de = result.GetDirectoryEntry();
    de.Properties["msDS-AllowedToActOnBehalfOfOtherIdentity"].Value = descriptor_buffer;
    de.CommitChanges();
    

    在此,act.Owner 是一个帐户 SID。

    【讨论】:

    • 非常有帮助,谢谢 - 使用 DirectorySearcher,我能够复制 powershell 结果,所以现在应该可以了。
    • 没问题。这是一个有趣的问题。我之前没有处理过这个属性。
    • 我今天早上又试了一下,如果你在项目中包含对activeds.dll的引用,你实际上可以将它转换为IADsSecurityDescriptor对象。
    • 嗯,我也可以这样做,但不清楚生成的对象有多大用处。不过,我也需要能够写入此属性,因此我可能不得不再次查看,因为搜索结果自然不可写回 AD。
    • 我刚刚完全按照您的方式完成了此操作,并且效果很好。非常感谢 - 这是我认为目前在 C# 中在线管理基于资源的 Kerberos 委托属性的唯一示例!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 2018-02-25
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 2011-10-11
    相关资源
    最近更新 更多