使用C#System.DirectoryServices在远程Windows服务器上进行用户管理

时间:2010-07-08 13:12:25

标签: c# .net windows account-management

我编写了一个程序,它打开与远程Windows服务器的连接,以便管理本地帐户(不是Active目录)。该程序执行以下步骤:

  • 用户创建
  • 将用户添加到群组

两种方法都使用System.DirectoryServices.AccountManagement, 这里有两个功能:

public void CreateUser()
    {
        PrincipalContext pc = new PrincipalContext(ContextType.Machine,
            "host_ip",
            "adminaccount",
            "adminpassword");
        UserPrincipal up = new UserPrincipal(pc);

        up.Name = "user";
        up.DisplayName = "user";
        up.SetPassword("user");
        up.Description = "user";
        up.UserCannotChangePassword = true;
        up.PasswordNeverExpires = true;
        try
        {
            up.Save();
        }
        catch (Exception ex)
        {
        }
        try
        {
            AddToGroup(pc, up);
        }
        catch (Exception ex)
        {
        }
    }

    private void AddToGroup(PrincipalContext pc, UserPrincipal u)
    {
        string group = "Remote Desktop Users";

        GroupPrincipal groupPrincipal = GroupPrincipal.FindByIdentity(pc, group);
        if (groupPrincipal.Members.Contains(pc, IdentityType.SamAccountName, u.SamAccountName)) //error occurs here
        {
            return;
        }
        groupPrincipal.Members.Add(u);
        try
        {
            groupPrincipal.Save();
        }
        catch (Exception e)
        {
        }
    }

从今天早上开始,用户创建总是成功,但我收到了这个错误:

  • if(groupPrincipal.Members.Contains(pc,IdentityType.SamAccountName,u.SamAccountName))
  

发生错误(1332)   枚举组成员资格。该   会员的SID无法解决。

谢谢你的回答

1 个答案:

答案 0 :(得分:3)

不确定这是否有帮助,但根据Microsoft Connect的报告,这可能是相关的:

  

System.DirectoryServices.AccountManagement组枚举的当前版本要求可以访问组中的所有对象或抛出异常。您看到的是ActiveDirectory中不再存在的本地组中列出的对象。由于系统不会自动删除这些链接,因此只要枚举该组,它就会失败。要防止此故障,请删除ActiveDirectory中不再存在的对象的链接。我们正在调查在将来的版本中对API进行更改,以使这样的场景更容易处理。