如何使用C#在Active Directory中正确设置/获取departmentNumber属性

本文关键字:设置 获取 属性 departmentNumber 何使用 Active Directory | 更新日期: 2023-09-27 18:29:47

我一直在尝试使用C#读取并设置DirectoryEntry对象的departmentNumber属性,但我总是遇到这样的问题,即使用ADSI Edit时,我看不到此条目中的任何内容被更改。

到目前为止,我尝试过的方法包括:

directoryEntry.Properties["departmentNumber"].Value = new object[]{ "SomeContent" };

directoryEntry.InvokeSet("departmentNumber", new object[]{ "SomeContent" };

directoryEntry.Invoke("PutEx", new object[]{ 2, "departmentNumber", new object[]{"SomeContent"}});

directoryEntry.Invoke("Put", new object[]{ "departmentNumber", "SomeContent" });

更新以上所有内容之后是directoryEntry.CommitChanges()

无论我尝试什么,我都会(使用上面的一些示例)获得能够使用相应代码再次读取值的结果,但每当我使用ADSI编辑器并查看用户的属性时,我都看不到departmentNumber包含任何数据。

如果我使用ADSI编辑器将属性设置为某个值,我也无法通过C#查询该特定值,但我可以使用一个非常简单的VB脚本,如下所示:

Set objUser = GetObject("LDAP://CN=........")
objUser.GetInfo
objUser.PutEx 2, "departmentNumber", Array("SomeContent")

这确实改变了我可以在ADSI编辑器中看到的属性的值,但同样,使用C#我无法读取它

这里的问题是什么?为什么看起来有两个不同的"departmentNumber"属性?尽管我试图找到有同样问题的人,但我没有找到任何答案,甚至没有找到正确的方向,所以我们非常感谢任何帮助。如果您需要更多信息,也请询问。

如何使用C#在Active Directory中正确设置/获取departmentNumber属性

您刚刚忘记提交更改。这在ADSI中是必要的。以下是用户修改和修改的示例:

static void Main(string[] args)
{
  /* Connection to Active Directory
   */
  DirectoryEntry deBase = new DirectoryEntry("LDAP://192.168.225.100:389/OU=SousMonou,OU=MonOu,DC=dom,DC=fr", "jpb", "pwd");
  /* User creation
  */
  DirectoryEntry auser = deBase.Children.Add("cn=a User", "user");
  auser.CommitChanges();
  auser.Properties["samaccountname"].Value = "AUser";
  auser.Properties["givenName"].Value = "A";
  auser.Properties["sn"].Value = "User";
  auser.Properties["displayName"].Value = "AUser";
  auser.Properties["userPrincipalName"].Value = "AUser@dom.fr";
  auser.Properties["pwdLastSet"].Value = 0;
  auser.Properties["userAccountControl"].Value = 544;
  auser.CommitChanges();
  /* Retreiving the user
  */
  DirectorySearcher dsLookForDomain = new DirectorySearcher(deBase);
  dsLookForDomain.Filter = "(&(cn=a User))";
  dsLookForDomain.SearchScope = SearchScope.Subtree;
  SearchResult srUser = dsLookForDomain.FindOne();
  if (srUser != null)
  {
    DirectoryEntry deUser = srUser.GetDirectoryEntry();
    deUser.Properties["departmentNumber"].Value = "Test Department";
    deUser.CommitChanges();
  }
}