我需要在C#中管理C#(我知道在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#中属性调用的返回类型。
发布于 2019-07-23 23:42:03
更新:所有这些现在都在我的网站上的一篇文章中有了更好的记录:处理NT安全描述符属性
根据这,该属性的“属性语法”是2.5.5.15。根据这的说法,这意味着它是一个“字符串(NT)”。根据这的说法,这意味着它是一个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将这个属性作为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。
https://stackoverflow.com/questions/57171940
复制相似问题