CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  VC.NET

求一个问题的解答,希望高手帮忙

楼主jfzyue(剑风竹月)2003-05-02 10:45:42 在 .NET技术 / VC.NET 提问

怎么用VC.net编写在活动目录下添加用户     修改用户密码和权限??? 问题点数:100、回复次数:7Top

1 楼duebbin(xh)回复于 2003-05-02 22:49:17 得分 0

API  
  翻看MSDNTop

2 楼duebbin(xh)回复于 2003-05-02 22:54:19 得分 100

或者使用.net托管  
  当在应用程序中要与   Active   Directory   层次结构的内容进行交互时,请创建   DirectoryEntry   或   DirectorySearcher   组件实例。有关更多信息,请参阅   Active   Directory   对象简介。若要使用   DirectoryEntry   组件或   DirectorySearcher   组件,必须向应用程序添加对   System.DirectoryServices   命名空间的引用。有关更多信息,请参阅添加和移除引用。有关创建   DirectorySearcher   组件的更多信息,请参阅搜索   Active   Directory   层次结构。  
   
  可以用几种方法来创建   DirectoryEntry   组件的实例:    
   
  可以将   DirectoryEntry   组件的实例从“工具箱”的“组件”选项卡拖到设计器中。    
  可以用代码创建   DirectoryEntry   组件的实例。    
  注意   与“工具箱”的“组件”选项卡上的许多其他组件不同,DirectoryEntry   组件在服务器资源管理器中不显示,所以无法从哪里创建该组件的实例。  
  在设计器中创建   DirectoryEntry   组件的实例    
   
  将   DirectoryEntry   对象从“工具箱”的“组件”选项卡拖到窗体或组件的设计图面中。    
  在“属性”窗口中,使用以下语法将组件的   Path   属性设置为   Active   Directory   层次结构中要将该组件绑定到的资源的位置:    
  Provider://providerpath  
  其中   是    
  Provider   要访问的目录的服务提供程序的指示符。该提供程序标识符区分大小写,并且必须按下面所示键入。必须是以下某个值:    
  LDAP://    
  WinNT://    
  NDS://    
  NWCOMPAT://    
     
  ProviderPath   根据所选服务提供程序类型的不同,提供程序路径中的参数也会不同。有关更多信息,请参阅   ADSI   系统提供程序。      
   
  例如,下面是各种提供程序类型的有效路径:    
   
  LDAP://MyDomain.microsoft.com/CN=TopH,DC=DEV,DC=MSFT,DC=COM,O=Internet  
  LDAP://CN=TopHat,DC=DEV,DC=MSFT,DC=COM,O=Internet  
  WinNT://MyDomain/Group  
  WinNT://MyDomain/MyComputer/aPrinter/  
  NDS://ndsServer/O=Internet/DC=COM/DC=MSFT/DC=DEV/CN=TopHat  
  NWCOMPAT://binderyServer/TopHat  
  编程创建   DirectoryEntry   组件的实例    
   
  用代码创建   DirectoryEntry   类的实例,将要绑定到的对象的路径作为参数传递。    
  以下示例显示如何将提供程序路径传递到   DirectoryEntry   对象:    
   
  '   Visual   Basic  
  Dim   myDir   as   New   System.DirectoryServices.DirectoryEntry("provider://path")  
   
  //   C#  
  DirectoryEntry   myDir   =   new   System.DirectoryServices.DirectoryEntry("provider://path");  
  下面示例显示如何用代码创建   DirectoryEntry   组件实例,将它初始化为   LDAP   路径,以及检索其名称和   GUID   以便在窗体元素中显示:    
   
  '   Visual   Basic  
  Dim   strpath   As   String   =   "LDAP://DC=redmond,DC=corp,DC=microsoft,DC=com"  
  Dim   myDE   As   New   System.DirectoryServices.DirectoryEntry(strpath)  
  Label1.Text   =   myDE.Name   &   myDE.GUID.ToString  
   
  //   C#  
  String   strpath   =   "LDAP://DC=redmond,DC=corp,DC=microsoft,DC=com";  
  System.Directory.Services.DirectoryEntry   myDir   =   new    
        System.DirectoryServices.DirectoryEntry(strpath);  
  Label1.Text   =   myDE.Name   +   myDE.GUID;  
  Top

3 楼duebbin(xh)回复于 2003-05-02 22:55:22 得分 0

本主题中的步骤演示使用   DirectoryEntry   组件列出本地计算机上的用户、组和服务的过程。DirectoryEntry   组件使用   Active   Directory   技术完成这些操作。该组件创建的每项都包含一组它的属性。  
   
  创建用户界面    
   
  在“文件”菜单上指向“新建”,然后单击“项目”。    
  在“新建项目”对话框中,选择左窗格中的   Visual   Basic   或   Visual   C#,然后选择“Windows   应用程序”模板。将项目命名为   ActiveDirectory。    
  在工具箱的“Windows   窗体”选项卡中,将   TreeView   控件拖到   Form1   上。    
  将   TreeView   控件的   Name   属性设置为   viewPC。    
  此演练将在稍后的过程中修改   TreeView   控件以包含三个顶级节点,各个节点分别用于用户、组和服务。每个二级节点都将代表一个在您的计算机上注册的用户、组或服务。每个用户、组和服务都具有两个子节点,一个用于其   Active   Directory   路径,另一个用于其属性。    
   
  配置   DirectoryEntry   组件    
   
  在解决方案资源管理器中,右击项目并从快捷菜单中选择“添加引用”。    
  将引用添加到   System.DirectoryServices.dll。    
  在工具箱的“组件”选项卡中,将   DirectoryEntry   组件实例拖到设计器中。    
  将   DirectoryEntry   组件的   Name   属性设置为   entryPC。    
  将   DirectoryEntry   组件的   Path   属性设置为   WinNT://Domain/YourComputerName。使用您的域和计算机名指示   DirectoryEntry   组件使用用于   Active   Directory   的   WinNT   服务提供程序来检查本地计算机。    
  注意   如果您不知道域或计算机名,请与系统管理员联系。  
  向   TreeView   控件添加顶级节点    
   
  在设计器中,双击“Form1”以在代码编辑器中创建   Form_Load   事件处理程序。    
  在文件顶部,添加此语句将   System.DirectoryServices   命名空间包括到代码中。    
  '   Visual   Basic  
  Imports   System.DirectoryServices  
   
  //   C#  
  using   System.DirectoryServices;  
  将代码添加到   Load   事件处理程序以创建用于用户、组和服务的三个顶级节点。代码如下所示:    
  '   Visual   Basic  
  Private   Sub   Form1_Load(ByVal   sender   As   System.Object,   _  
  ByVal   e   As   System.EventArgs)   Handles   MyBase.Load  
        Dim   users   As   New   TreeNode("Users")  
        Dim   groups   As   New   TreeNode("Groups")  
        Dim   services   As   New   TreeNode("Services")  
        viewPC.Nodes.AddRange(New   TreeNode()   {users,   groups,   services})  
  End   Sub  
   
  //   C#  
  private   void   Form1_Load(object   sender,   System.EventArgs   e)  
  {  
        TreeNode   users   =   new   TreeNode("Users");  
        TreeNode   groups   =   new   TreeNode("Groups");  
        TreeNode   services   =   new   TreeNode("Services");  
        viewPC.Nodes.AddRange(new   TreeNode[]   {   users,   groups,   services   });  
  }  
  当应用程序运行时,名为   entryPC   的组件的   Children   属性包含在   Path(您的计算机)中找到的所有项。每个子级也都是一个   DirectoryEntry   对象。因为您正在计算机路径上使用   WinNT   提供程序,子   DirectoryEntry   对象的   SchemaClassName   属性将是“User”、“Group”或“Service”之一。select   或   switch   语句可用于确定项类型并向正确的组添加节点。  
   
  向   TreeView   控件添加项节点    
   
  将此代码添加到   Form1_Load   中变量声明之后以枚举包含在   entryPC   实例中的   DirectoryEntry   对象。    
  '   Visual   Basic  
  Dim   child   As   DirectoryEntry  
  For   Each   child   In   entryPC.Children  
        '   Code   added   here   in   next   steps.  
  Next  
   
  //   C#  
  foreach(DirectoryEntry   child   in   entryPC.Children)    
  {  
        //   Code   added   here   in   next   steps.  
  }  
  在步骤   1   的代码中,添加   select   或   switch   语句以创建子级目录项的新节点并将其添加到适当的顶级节点。    
  '   Visual   Basic  
  Dim   newNode   As   New   TreeNode(child.Name)  
  Select   Case   child.SchemaClassName  
        Case   "User"  
              users.Nodes.Add(newNode)  
        Case   "Group"  
              groups.Nodes.Add(newNode)  
        Case   "Service"  
              services.Nodes.Add(newNode)  
  End   Select  
   
  //   C#  
  TreeNode   newNode   =   new   TreeNode(child.Name);  
  switch   (child.SchemaClassName)    
  {  
        case   "User"   :  
              users.Nodes.Add(newNode);        
              break;  
        case   "Group"   :  
              groups.Nodes.Add(newNode);        
              break;  
        case   "Service"   :  
              services.Nodes.Add(newNode);        
              break;  
        }  
  在   select   或   switch   语句之后添加以下语句,为该项的路径和属性添加节点。您将编写的   AddPathAndProperties   方法为该项添加路径和属性节点。    
  '   Visual   Basic  
  AddPathAndProperties(newNode,   child)  
   
  //   C#  
  AddPathAndProperties(newNode,   child);  
  注意   您将在下一节中添加   AddPathAndProperties   方法。  
  完成的   Form_Load   方法如下所示:    
   
  '   Visual   Basic  
  Private   Sub   Form1_Load(ByVal   sender   As   System.Object,   _  
  ByVal   e   As   System.EventArgs)   Handles   MyBase.Load  
        Dim   users   As   New   TreeNode("Users")  
        Dim   groups   As   New   TreeNode("Groups")  
        Dim   services   As   New   TreeNode("Services")  
        viewPC.Nodes.AddRange(New   TreeNode()   {users,   groups,   services})  
   
        Dim   child   As   DirectoryEntry  
        For   Each   child   In   entryPC.Children  
              Dim   newNode   As   New   TreeNode(child.Name)  
              Select   Case   child.SchemaClassName  
                    Case   "User"  
                          users.Nodes.Add(newNode)  
                    Case   "Group"  
                          groups.Nodes.Add(newNode)  
                    Case   "Service"  
                          services.Nodes.Add(newNode)  
              End   Select  
              AddPathAndProperties(newNode,   child)  
        Next  
  End   Sub  
  Top

4 楼duebbin(xh)回复于 2003-05-02 22:55:33 得分 0

 
  //   C#  
  private   void   Form1_Load(object   sender,   System.EventArgs   e)  
  {  
        TreeNode   users   =   new   TreeNode("Users");  
        TreeNode   groups   =   new   TreeNode("Groups");  
        TreeNode   services   =   new   TreeNode("Services");  
        viewPC.Nodes.AddRange(new   TreeNode[]   {   users,   groups,   services   });  
   
        foreach(DirectoryEntry   child   in   entryPC.Children)    
        {  
              TreeNode   newNode   =   new   TreeNode(child.Name);  
              switch   (child.SchemaClassName)    
              {  
                    case   "User"   :  
                          users.Nodes.Add(newNode);        
                          break;  
                    case   "Group"   :  
                          groups.Nodes.Add(newNode);        
                          break;  
                    case   "Service"   :  
                          services.Nodes.Add(newNode);        
                          break;  
              }  
              AddPathAndProperties(newNode,   child);  
        }  
  }  
  DirectoryEntry   组件具有   Properties   属性,该属性包含一个字符串索引的属性集合。该集合的内容取决于   DirectoryEntry   组件的架构。Properties   集合具有   PropertyNames   属性,该属性是一个所有属性名称的集合。通过逐一通过该集合,您可以检索每个属性。每个属性都具有一组关联的值。在本演练中,您只检索每个属性的第一个值。    
   
  列出项的路径和属性    
   
  将以下代码添加到   Form1   类,创建   AddPathAndProperties   方法。entry   参数表示目录中的一项,即一个用户、一个组或一个服务。node   参数表示与该项关联的   TreeNode   对象。    
  '   Visual   Basic  
  Private   Sub   AddPathAndProperties(ByVal   node   As   TreeNode,   _  
  ByVal   entry   As   DirectoryEntry)  
   
  End   Sub  
   
  //   C#  
  private   void   AddPathAndProperties(TreeNode   node,   DirectoryEntry   entry)  
  {  
  }  
  添加此代码以创建显示该项路径的新节点。    
  '   Visual   Basic  
  node.Nodes.Add(New   TreeNode("Path:   "   &   entry.Path))  
   
  //   C#  
  node.Nodes.Add(new   TreeNode("Path:   "   +   entry.Path));  
  添加此代码以创建该属性的父节点。    
  '   Visual   Basic  
  Dim   propertyNode   As   New   TreeNode("Properties")  
  node.Nodes.Add(propertyNode)  
   
  //   C#  
  TreeNode   propertyNode   =   new   TreeNode("Properties");  
  node.Nodes.Add(propertyNode);  
  添加此代码为该项的每个属性都创建一个新节点。为每个属性显示属性名称和值。    
  '   Visual   Basic  
  Dim   propertyName   As   String  
  Dim   oneNode   As   String  
  For   Each   propertyName   In   entry.Properties.PropertyNames  
        Try  
              oneNode   =   propertyName   &   ":   "   &   _  
              CType(entry.Properties(propertyName)(0),   String)  
        Catch  
              oneNode   =   propertyName   &   ":   "   &   _  
              "No   text   representation."  
        End   Try  
        propertyNode.Nodes.Add(New   TreeNode(oneNode))  
  Next  
   
  //   C#  
  foreach   (string   propertyName   in   entry.Properties.PropertyNames)    
  {  
        string   oneNode   =   propertyName   +   ":   "   +    
              entry.Properties[propertyName][0].ToString();  
        propertyNode.Nodes.Add(new   TreeNode(oneNode));  
  }  
  完整的方法如下所示:    
   
  '   Visual   Basic  
  Private   Sub   AddPathAndProperties(ByVal   node   As   TreeNode,   _  
  ByVal   entry   As   DirectoryEntry)  
        node.Nodes.Add(New   TreeNode("Path:   "   &   entry.Path))  
        Dim   propertyNode   As   New   TreeNode("Properties")  
        node.Nodes.Add(propertyNode)  
   
        Dim   propertyName   As   String  
        Dim   oneNode   As   String  
        For   Each   propertyName   In   entry.Properties.PropertyNames  
              Try  
                    oneNode   =   propertyName   &   ":   "   &   _  
                          CType(entry.Properties(propertyName)(0),   String)  
              Catch  
                    oneNode   =   propertyName   &   ":   "   &   _  
                          "No   text   representation."  
              End   Try  
              propertyNode.Nodes.Add(New   TreeNode(oneNode))  
        Next  
  End   Sub  
   
  //   C#  
  private   void   AddPathAndProperties(TreeNode   node,   DirectoryEntry   entry)  
  {  
        node.Nodes.Add(new   TreeNode("Path:   "   +   entry.Path));  
        TreeNode   propertyNode   =   new   TreeNode("Properties");  
        node.Nodes.Add(propertyNode);  
        foreach   (string   propertyName   in   entry.Properties.PropertyNames)    
        {  
              string   oneNode   =   propertyName   +   ":   "   +    
                    entry.Properties[propertyName][0].ToString();  
              propertyNode.Nodes.Add(new   TreeNode(oneNode));  
        }  
  }  
  运行程序    
   
  按   F5   键以运行该程序。    
  打开节点以检查路径和属性。因为所有用户共享相同的架构,所以它们共享相同的属性集。对于组和服务节点,情况也是这样。Top

5 楼duebbin(xh)回复于 2003-05-02 22:58:35 得分 0

api  
  Platform   SDK:   Directory   Services    
  Example   Code   for   Adding   a   Member   to   a   Group  
   
  [C++]  
  The   following   code   fragment   contains   a   function   that   adds   a   member   to   a   group:  
   
   
  ////////////////////////////////////////////////////////////////////////////////////////////////////  
  /*     AddMemberToGroup()       -               Adds   the   passed   directory   object   as   a   member   of   passed   group  
     
          Parameters  
     
                  IADsGroup   *   pGroup               -   Group   to   hold   the   new   IDirectoryObject  
                  IADs*   pIADsNewMember           -   Object   which   will   become   a   member   of   the   group.  
                                                                        Object   can   be   a   user,   contact,   or   group.  
  */  
  HRESULT   AddMemberToGroup(IADsGroup   *   pGroup,   IADs*   pIADsNewMember)  
  {  
          HRESULT   hr   =   E_INVALIDARG;  
          if   ((!pGroup)||(!pIADsNewMember))  
                  return   hr;  
     
          //   Use   the   IADs::get_ADsPath()   member   to   get   the   ADsPath  
          //   Once   the   ADsPath   string   is   returned,   all   that   is   needed    
          //   to   add   the   new   member   to   the   group,   is   to   call   the    
          //   IADsGroup::Add()   member,   passing   in   the   ADsPath   string.  
          //   Ask   the   new   member   for   it's   AdsPath  
          //   This   is   a   fully   qualified   LDAP   path   to   the   object   to   add.  
          BSTR   bsNewMemberPath;  
          hr   =   pIADsNewMember->get_ADsPath(&bsNewMemberPath);    
          if   (SUCCEEDED(hr))  
          {  
     
                  //   Use   the   IADsGroup   interface   to   add   the   new   member.  
                  //   Pass   the   LDAP   path   to   the    
                  //   new   member   to   the   IADsGroup::Add()   member  
                  hr   =   pGroup->Add(bsNewMemberPath);  
     
                  //   Free   the   string   returned   from   IADs::get_ADsPath()  
                  SysFreeString(bsNewMemberPath);  
          }  
          return   hr;  
  }  
  Top

6 楼jfzyue(剑风竹月)回复于 2003-05-07 07:48:23 得分 0

谢!  
  这是一个控制太应用程序  
  #include   <windows.h>  
  #include   <activeds.h>  
  #include   <comutil.h>  
  #include   <stdio.h>  
  #include   <oaidl.h>  
   
  int   main(int   argc,   char*   argv[])  
  {  
      HRESULT   hr   =   CoInitialize(   NULL   );  
   
      if(   SUCCEEDED(   hr   )   )  
      {  
          IADs*   piIADs   =   NULL;  
          hr   =   ADsGetObject(   L"LDAP://rootDSE",   IID_IADs,  
                                                (   void**   )&piIADs   );  
          if(   SUCCEEDED(   hr   )   )  
          {  
              _variant_t   varDefaultNamingContext;  
   
              hr   =   piIADs->Get(   L"defaultNamingContext",  
                                                  &varDefaultNamingContext   );  
              if(   SUCCEEDED(   hr   )   )  
              {  
                  _bstr_t   strPath   =   _bstr_t(   "LDAP://CN=Users,"   )   +  
                                                      _bstr_t(   varDefaultNamingContext   );  
                  IADsContainer*   piContainer   =   NULL;  
                  hr   =   ADsGetObject(   strPath,   IID_IADsContainer,  
                                                    (   void**   )&piContainer   );  
                  if(   SUCCEEDED(   hr   )   )  
                  {  
                      IDispatch*   piDispatch   =   NULL;  
   
                      hr   =   piContainer->Create(   L"user",   L"CN=New   User",  
                                                                          &piDispatch   );  
                      if(   SUCCEEDED(   hr   )   )  
                      {  
                          IADs*   piIADs   =   NULL;  
                          hr   =   piDispatch->QueryInterface(   IID_IADs,  
                                                                                            (   void**   )&piIADs   );  
   
                          if(   SUCCEEDED(   hr   )   )  
                          {  
                              hr   =   piIADs->Put(   L"cn",  
                                          _variant_t(   _bstr_t(   "New   User"   )   )   );  
      hr   =   piIADs->Put(   L"sAMAccountName",  
          _variant_t(   _bstr_t(   "NEWUSER1"   )   )   );  
                              hr   =   piIADs->Put(   L"userAccountControl",  
                                          _variant_t(   (   long   )ADS_UF_NORMAL_ACCOUNT   )   );  
   
                              hr   =   piIADs->SetInfo();  
                              if(   !   SUCCEEDED(   hr   )   )  
                              {  
                                  printf(   "Error   %x   adding   user\n",   hr   );  
                              }  
   
                              piIADs->Release();  
                          }  
   
                          piDispatch->Release();  
                      }  
   
                      piContainer->Release();  
                  }  
              }  
          }  
   
          (   void   )CoUninitialize();  
      }  
   
      return   0;  
  }  
  可是我把他转成MFC   应用程序总是出错。请问怎么转?Top

7 楼jfzyue(剑风竹月)回复于 2003-05-07 07:58:06 得分 0

是转成MFC应用程序下个一个函数像int   AddUser(CString   Username);Top

相关问题

  • 谁来解答
  • 急需解答
  • 解答纠错!
  • 请masterz解答
  • 寻求解答
  • 急盼解答
  • 极盼解答~~~~
  • 请解答
  • 急求解答!!!!!!!
  • 如何解答???

关键词

  • .net
  • c#
  • 组件
  • 属性
  • 节点
  • 代码
  • hr
  • dc
  • directoryentry
  • treenode

得分解答快速导航

  • 帖主:jfzyue
  • duebbin

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo