首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C#中访问/解析“msDS-异种AllowedToActOnBehalfOfOtherIdentity”AD属性

在C#中访问/解析“msDS-异种AllowedToActOnBehalfOfOtherIdentity”AD属性
EN

Stack Overflow用户
提问于 2019-07-23 20:45:55
回答 1查看 1.1K关注 0票数 2

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

代码语言:javascript
复制
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#中属性调用的返回类型。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-23 23:42:03

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

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

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

代码语言:javascript
复制
var act = (ActiveDs.IADsSecurityDescriptor)
              de.Properties["msDS-AllowedToActOnBehalfOfOtherIdentity"].Value;
Console.WriteLine(act.Owner);

Owner属性为您提供一个DOMAIN\Username

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

但我确实记得,有时DirectorySearcher会给出与DirectoryEntry不同类型的值(这是没有道理的,但这是真的)。这似乎是真的。DirectorySearcher将这个属性作为byte[]提供给您,而RawSecurityDescriptorbyte[]

所以看起来你可以这样做:

代码语言:javascript
复制
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。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57171940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档