使用C#和AccountManagment命名空间从远程计算机上的管理员组中删除用户帐户

时间:2011-10-01 20:59:50

标签: c# active-directory account-management

我有代码:

 public bool RemoveUserFromAdministratorsGroup(UserPrincipal oUserPrincipal, string computer)
 {
        try
        {
            PrincipalContext oPrincipalContext = new PrincipalContext(ContextType.Machine, computer, null, ContextOptions.Negotiate, _sServiceUser, _sServicePassword);
            GroupPrincipal oGroupPrincipal = GroupPrincipal.FindByIdentity(oPrincipalContext, "Administrators");

            oGroupPrincipal.Members.Remove(oUserPrincipal);
            oGroupPrincipal.Save();

            return true;
        }
        catch
        {
            return false;
        }

 }

它没有任何例外。但是,当我再次运行我的应用程序时,我在列表视图中看到了这个用户。因此,用户未被删除。

3 个答案:

答案 0 :(得分:2)

我在没有AccountManagment命名空间的情况下解决了这个问题。

 public bool RemoveUserFromAdminGroup(string computerName, string user)
 {
        try
        {
            var de = new DirectoryEntry("WinNT://" + computerName);
            var objGroup = de.Children.Find(Settings.AdministratorsGroup, "group");

            foreach (object member in (IEnumerable)objGroup.Invoke("Members"))
            {
                using (var memberEntry = new DirectoryEntry(member))
                    if (memberEntry.Name == user)
                        objGroup.Invoke("Remove", new[] {memberEntry.Path});
            }

            objGroup.CommitChanges();
            objGroup.Dispose();

            return true;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
            return false;
        }
 }

答案 1 :(得分:0)

以下解决方案是在Directory Service ...

的帮助下删除用户
   using System.DirectoryServices

  private DeleteUserFromActiveDirectory(DataRow in_Gebruiker)
  {
          DirectoryEntry AD = new DirectoryEntry(strPathActiveDirectory ,
              strUsername, strPassword)

          DirectoryEntry NewUser = 
              AD.Children.Find("CN=TheUserName", "User");

         AD.Children.Remove(NewUser);
         AD.CommitChanges();
         AD.Close();
  }

答案 2 :(得分:0)

我不知道你的问题到底是什么,但是这样编码:

try
{
  PrincipalContext context = new PrincipalContext(ContextType.Domain, "WM2008R2ENT:389", "dc=dom,dc=fr", "jpb", "passwd");

  /* Retreive a user principal
   */
  UserPrincipal user = UserPrincipal.FindByIdentity(context, "user1");

  /* Retreive a group principal
   */
  GroupPrincipal adminGroup = GroupPrincipal.FindByIdentity(context, @"dom\Administrateurs");

  foreach (Principal p in adminGroup.Members)
  {
    Console.WriteLine(p.Name);
  }

  adminGroup.Members.Remove(user);
  adminGroup.Save();
}
catch (Exception e)
{
  Console.WriteLine(e.Message);
}

给我以下例外:

Information about the domain could not be retrieved (1355)

挖掘一下,告诉我我在不在目标域上的计算机上运行我的代码。当我从服务器本身运行相同的代码时,它可以工作。似乎运行此代码的计算机必须至少联系目标域的DNS。