在 C# 中访问/分析 AD 属性"msDS-AllowedToActOnBehalfOfOtherIdentity"



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

static void Main(string[] args)
{
string ou = @"OU=some,OU=ou,DC=corp,DC=com";
string cn = @"someaccount";
DirectoryEntry de = new DirectoryEntry();
de.Username = @"CORPuserwithOUrights";
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 等中的二进制格式。但这似乎不是C#中属性调用的返回类型。

更新:所有这些现在都更好地记录在我的网站上的一篇文章中:处理 NT 安全描述符属性


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

您可以将项目中的 COM 引用添加到"活动 DS 类型库"并将其直接强制转换为IADsSecurityDescriptor,如下所示:

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

Owner属性为您提供DOMAINUsername

根据我找到的这个随机代码,似乎你也可以使用RawSecurityDescriptor类与之交互。有一个构造函数采用纯字符串,但您似乎也无法从DirectoryEntry的属性中获取原始字符串。

但我确实记得,有时DirectorySearcher会给你与DirectoryEntry不同类型的值(没有意义,但这是真的)。这似乎在这里是正确的。DirectorySearcher将此属性作为byte[]提供给您,并且RawSecurityDescriptor确实有一个接受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。

最新更新