2

我需要管理Kerberos Resource Based DelegationC#我知道这更容易,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 等中的二进制格式。但这似乎不是属性调用的返回类型C#

4

1 回答 1

2

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


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

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

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

Owner物业为您提供DOMAIN\Username.

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

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

于 2019-07-23T23:42:03.710 回答