如何在 LDAP AD 中更新 "usercert" 属性 的值

How to update value of a "usercert" property in LDAP AD

我有一个要求,我需要更新保存在活动目录中计算机的 属性 ("usercert") 中的值。

// 从 AD

中检索属性值
DirectoryEntry entry = new DirectoryEntry(LDAPPath, LDAPUser, DecryptPwd(LDAPPwd, LDAPKey)); 
DirectorySearcher searcher = new DirectorySearcher(entry); 
searcher.Filter = string.Format("(&(objectCategory=computer)(Name=" + MachineName + "))"); 
result = searcher.FindOne(); 
byte[] text= (byte[])result.GetDirectoryEntry().Properties["usercert"].Value;

// 将新值更新为 AD 字符串 updatedText= "New Text";

if (result.GetDirectoryEntry().Properties["usercert"] != null && 
              result.GetDirectoryEntry().Properties["usercert"].Value != null) 
{
     byte[] updatedTextByte = Encoding.ASCII.GetBytes(updatedText);
     result.GetDirectoryEntry().InvokeSet("usercert", updatedPassByte);
     //(result.GetDirectoryEntry().Properties["usercert"]).Value = Encoding.ASCII.GetBytes(updatedText);
     //result.GetDirectoryEntry().Properties["usercert"].Add(Encoding.ASCII.GetBytes(updatedText));
     //result.GetDirectoryEntry().Properties["usercert"][0] = Encoding.ASCII.GetBytes(updatedText);
     result.GetDirectoryEntry().CommitChanges();  
}

我尝试了上面所有的注释代码,但对我没有任何作用。你能帮我解决这个问题吗?

呼叫 GetDirectoryEntry() creates a new DirectoryEntry object each time you call it, which you can see in the source code here.

所以当你这样做时:

result.GetDirectoryEntry().CommitChanges();

它正在创建一个全新的 DirectoryEntry 对象并对其调用 CommitChanges()。所以什么都没有改变。

您只需调用 GetDirectoryEntry() 一次并对该对象进行更改。例如:

var resultDe = result.GetDirectoryEntry();
resultDe.Properties["usercert"]).Value = whatever;
resuleDe.CommitChanges();