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

标签 c# active-directory kerberos-delegation

我需要在 C# 中管理 Kerberos 基于资源的委派(我知道在 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# 中属性调用的返回类型。

最佳答案

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


根据this该属性的“属性语法”是2.5.5.15。根据this ,这意味着它是一个“String(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。

关于c# - 在 C# 中访问/解析 "msDS-AllowedToActOnBehalfOfOtherIdentity"AD 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57171940/

相关文章:

c# - 以编程方式更改页面标题的 MasterPage 部分

coldfusion - 如何使用 ColdFusion 显示 Active Directory jpegPhoto?

c# - 存储连接字符串

c# - 如何计算从今天算起的8个工作日?

c# - 如何在 C# 中使用 XAML 和 WPF 在 MVVM 环境中将 View 绑定(bind)到 Viewmodel

C# 事件目录库

c# - 在 C# .NET 中连接到 Active Directory 服务器时出现问题

tomcat - 领域和域语法

c# - Windows 身份验证模拟 - 第二个请求获得错误的用户身份

java - 使用 jdbc 和 Kerberos 委派连接到 SAP HANA 数据库