【问题标题】:C# Active Directory: Add user to group in another domainC# Active Directory:将用户添加到另一个域中的组
【发布时间】:2017-10-17 05:16:18
【问题描述】:

我创建了一个 Windows 窗体应用程序来在 domain1 中创建一个活动目录用户帐户,并旨在将其添加到 domain2 内的组中。这是我使用的代码:

PrincipalContext pc1 = new PrincipalContext(ContextType.Domain, "domain1.company.com", "DC=domain1,DC=company,DC=com", ContextOptions.Negotiate);
UserPrincipal up = new UserPrincipal(pc1, "username", "password", true);
up.Save();

PrincipalContext pc2 = new PrincipalContext(ContextType.Domain, "domain2.company.com", "DC=domain2,DC=company,DC=com", ContextOptions.Negotiate);
GroupPrincipal gp = GroupPrincipal.FindByIdentity(pc2, "groupname");
gp.Members.Add(up);
gp.Save();

当我在Visual Studio中调试时,新创建的用户可以成功添加到组中。但是,我发布并再次运行后,它返回错误"There is no such object on the server".

有人知道怎么解决吗?

谢谢。

【问题讨论】:

  • 发布你的意思是什么?
  • 我只是在 Visual Studio 2010 中单击“构建”和“发布”。

标签: c# .net active-directory


【解决方案1】:

我处理相同的需求,但不完全一样,我们需要处理新创建的用户。

所以,我尝试了两种解决方案 -

解决方案 1

让线程休眠几毫秒,例如-

PrincipalContext pc1 = new PrincipalContext(ContextType.Domain, "domain1.company.com", "DC=domain1,DC=company,DC=com", ContextOptions.Negotiate);
UserPrincipal up = new UserPrincipal(pc1, "username", "password", true);
up.Save();

Thread.Sleep (500);

PrincipalContext pc2 = new PrincipalContext(ContextType.Domain, "domain2.company.com", "DC=domain2,DC=company,DC=com", ContextOptions.Negotiate);
GroupPrincipal gp = GroupPrincipal.FindByIdentity(pc2, "groupname");
gp.Members.Add(up);
gp.Save();

这样,AD 能够同步整个域和域控制器中的用户详细信息。并在后续步骤中找到该用户。

解决方案 2

默认情况下,DirectoryEntry 对象出于性能原因在缓存中保存有关用户的信息。它不会自动反映更改。

所以,我们需要刷新相关缓存-

PrincipalContext pc1 = new PrincipalContext(ContextType.Domain, "domain1.company.com", "DC=domain1,DC=company,DC=com", ContextOptions.Negotiate);
UserPrincipal up = new UserPrincipal(pc1, "username", "password", true);
up.Save();

 // Refresh cache so that we get updated user object
 var de = (DirectoryEntry)up.GetUnderlyingObject();
 de.RefreshCache();

PrincipalContext pc2 = new PrincipalContext(ContextType.Domain, "domain2.company.com", "DC=domain2,DC=company,DC=com", ContextOptions.Negotiate);
GroupPrincipal gp = GroupPrincipal.FindByIdentity(pc2, "groupname");
gp.Members.Add(up);
gp.Save();

如果效果很好,我建议使用解决方案 2。

【讨论】:

  • 谢谢 Vikram,但这两种解决方案都对我没有帮助。
  • 我尝试通过 FindByIdentify() 方法创建另一个 UserPrincipal 对象,但它也抛出了同样的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多