求一个问题的解答,希望高手帮忙
怎么用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




