惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
Stack Overflow Blog
Stack Overflow Blog
人人都是产品经理
人人都是产品经理
The GitHub Blog
The GitHub Blog
Engineering at Meta
Engineering at Meta
Vercel News
Vercel News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Y
Y Combinator Blog
The Cloudflare Blog
Last Week in AI
Last Week in AI
B
Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog
V
Visual Studio Blog
博客园 - 三生石上(FineUI控件)
小众软件
小众软件
Google DeepMind News
Google DeepMind News
D
DataBreaches.Net
博客园 - 司徒正美
B
Blog RSS Feed
Microsoft Azure Blog
Microsoft Azure Blog
罗磊的独立博客
Hugging Face - Blog
Hugging Face - Blog
L
LangChain Blog

博客园 - DarkAngel

好久未登陆 签到 Silverlight 3正式版新鲜出炉 Silverlight3的7个新功能[转] 读取DWG文件中的文本信息(CAD2004) 一个端口扫描的小程序 WEBPART结合实际的应用(.Net2005) 带验证功能的的TextBox 一个很老的故事: 水和鱼的故事 Browser.Net浏览器c#开发(开源) 吉祥三宝(设计篇) - DarkAngel - 博客园 将指定网页添加到收藏夹的方法(c#) Microsoft.Press.Microsoft.Visual.C.Sharp.2005.Step.by.Step.Oct.2005 取客户端MAC地址的方法 Exchange 2k的安装与删除。 无 Cookie 的 ASP.NET 一个任意获得页面控件的方法 跨页面的多选功能实现 买不起笔记本,只好自己动手做一个啦-!(转)
关于在活动目录(ACTIVE DIRECTORY)中创建组织单位和用户
DarkAngel · 2006-04-13 · via 博客园 - DarkAngel

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

1public 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方法提交一下。代码如下:

1public 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设置的是用户的登陆名称。

1DirectoryEntry ude=ou.Children.Add("CN="+username,"user");
2            ude.Properties["sAMAccountName"].Value=name;
3            ude.CommitChanges();
4            ude.Close();


  通过上面的方法我们建立了组织单位和组织单位下的用户,但是这样还没有完。当我建好用户后发现用户并没有启用,所以我们还要想办法让建好的用户处于启用状态。查了相关资料和userAccountControl这个属性有关系。我在程序里设置断点跟踪了一下得到起用的值,重新获得用户DirectoryEntry对象后对其进行更改,用户被启用。我想因该还有其他方法,这是目前我能想到的。如果有更好的方法欢迎留言给我。代码如下。

1public 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对象对其进行设置

1public 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        }

  通过上面方法基本建立了组织单位和用户,但是我发现其中设置密码必须将程序放在主域服务器上才能生效,不然就说找不到对象,我本来是在任何一台域里的计算机上都可以运行这个程序来进行操作,不知道这点要怎样才能做到。如果有朋友知道这点怎样处理请告诉我,谢谢。文笔不好,各位见量。希望这篇短文能对您有所帮助,欢迎交流。