关于在活动目录(ACTIVE DIRECTORY)中创建组织单位和用户

   最近几天因为工作需要,研究了一下活动目录。用户主要的需求是要把现有系统的用户和组织结构导入到目前的AD中,当然用户肯定是不愿意去手动做这件事情的,所以就让我给做一个程序来完成这个事情。再此以前从来没弄过和AD相关的东西,连安装AD都是现学现卖 。既然客户有需求就硬着头皮上了,研究了一下基本的东西,拿来分享一下,希望能对要对AD进行操作的朋友有帮助。
  在对AD进行操作,我们首先要引如System.DirectoryServices这个命名空间,里面的DirectoryEntry类是我们主要用到的。他封装了 Active Directory 层次结构中的节点或对象,我们先要建立一个DirectoryEntry对象。
1 public  DirectoryEntry GetDirectoryObject( string  path, string  username, string  password)
2    {
3   DirectoryEntry de=new DirectoryEntry("LDAP://"+path, username, password, AuthenticationTypes.Secure);
4   return de;
5  }

  其中path是 DirectoryEntry的路径,username是在对客户端进行身份验证时使用的用户名,password是在对客户端进行身份验证时使用的密码,AuthenticationTypes是我们请求安全身份认证的方式。path说明一下,就是你所在的域的域名,如cnblogs.com。这样我们可以通过域名得到一个DirectoryEntry 对象。
  接下来我们需要做的工作是建立组织单位,用到Children属性,使用此属性在层次结构中查找、检索或创建目录项。此属性是一个集合,它与通常的迭代功能一起,提供 Add方法,通过该方法将节点直接添加到当前绑定到的父节点之下的集合。当向集合中添加节点时,必须指定新节点的名称以及要与该节点相关联的架构模板的名称。例如,您可能需要使用标题为“Computer”的架构在层次结构中添加新的计算机。Add.这个方法很简单,只需要注意一下参数,name是我们建立的组织单位的名称前面的OU=是必须的,后一个参数 Add 方法,通过该方法将节点直接添加到当前绑定到的父节点之下的集合。当向集合中添加节点时,必须指定新节点的名称以及要与该节点相关联的架构模板的名称。例如,您可能需要使用标题为“Computer”的架构在层次结构中添加新的计算机。Add.这个方法很简单,只需要注意一下参数,name是我们建立的组织单位的名称前面的OU=是必须的,后一个参数Add 方法,通过该方法将节点直接添加到当前绑定到的父节点之下的集合。当向集合中添加节点时,必须指定新节点的名称以及要与该节点相关联的架构模板的名称。例如,您可能需要使用标题为“Computer”的架构在层次结构中添加新的计算机。Add.这个方法很简单,只需要注意一下参数,name是我们建立的组织单位的名称前面的OU=是必须的,后一个参数organizationalUnit也是固定了,代表了要增加的DirectoryEntry的架构名称,organizationalUnit表示是增加的是组织单位。最后需要用CommitChanges方法提交一下。代码如下:

1 public  DirectoryEntry GreateOU( string  ouname)
2          {
3            DirectoryEntry entry = GetDirectoryObject(path,username,password);
4            DirectoryEntry OU = entry.Children.Add("OU="+ouname, "organizationalUnit");
5            OU.CommitChanges();
6            return OU;
7
8        }

  通过上面的方法我们已经建立了组织单位,下面是向组织单位里添加用户了,方法其实和添加组织单位一样,只是参数表示的类型不同而已。我们可以直接将用户这个DirectoryEntry加在刚才的组织单位对象下username表示名称,sAMAccountName设置的是用户的登陆名称。
1 DirectoryEntry ude = ou.Children.Add( " CN= " + username, " user " );
2             ude.Properties[ " sAMAccountName " ].Value = name;
3             ude.CommitChanges();
4             ude.Close();

  通过上面的方法我们建立了组织单位和组织单位下的用户,但是这样还没有完。当我建好用户后发现用户并没有启用,所以我们还要想办法让建好的用户处于启用状态。查了相关资料和userAccountControl这个属性有关系。我在程序里设置断点跟踪了一下得到起用的值,重新获得用户DirectoryEntry对象后对其进行更改,用户被启用。我想因该还有其他方法,这是目前我能想到的。如果有更好的方法欢迎留言给我。代码如下。
1 public   void  SetEnable( string  user)
2          {
3            DirectoryEntry ude=GetDirectoryEntry(user);
4            ude.Properties["userAccountControl"].Value=544;
5            ude.CommitChanges();
6            ude.Close();
7
8        }

  如果需要禁用该用户只需要将这个值设置为546就行了。
最后需要做的是对改用户设置密码,这一步必要好做,同样找到改用户DirectoryEntry对象对其进行设置

1 public   void  ChangePassword( string  name, string  password)
2          {
3            DirectoryEntry ude=GetDirectoryEntry(name);
4            ude.Invoke("SetPassword",new object[]{password});
5            ude.CommitChanges();
6            ude.Close();
7        }
  通过上面方法基本建立了组织单位和用户,但是我发现其中设置密码必须将程序放在主域服务器上才能生效,不然就说找不到对象,我本来是在任何一台域里的计算机上都可以运行这个程序来进行操作,不知道这点要怎样才能做到。如果有朋友知道这点怎样处理请告诉我,谢谢。文笔不好,各位见量。希望这篇短文能对您有所帮助,欢迎交流。

你可能感兴趣的:(Directory)