我需要在 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/