其实很早就有了解决的办法,活动目录的技术可以实现。
微软的passport就想解决这样的问题,可惜,大部分的事情都是由商业决定的。
这次设计的系统就希望能把权限这部分交给Ldap来管理。
按照下面的方法在Windows Server 2003创建了Active Directory.
创建 Active Directory 在独立服务器上安装了 Windows Server 2003 之后,运行“Active Directory 向导”以创建新的 Active Directory 目录林或域,然后将 Windows Server 2003 计算机转换为目录林中的第一个域控制器。若要将 Windows Server 2003 计算机转换为目录林中的第一个域控制器,请按照下列步骤操作:
|
创建用户界面
- 在“文件”菜单上指向“新建”,然后单击“项目”。
- 在“新建项目”对话框中,选择左窗格中的 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 服务提供程序来检查本地计算机。
注意 如果您不知道域名或计算机名,请与系统管理员联系。
提示 如果域名或计算机名不正确,应用程序将在运行时引发异常。可以输入路径 WinNT://YourComputerName,服务提供程序将尝试定位该计算机。
向 TreeView 控件添加顶级节点
- 在设计器中,双击“Form1”以在代码编辑器中创建 Form_Load 事件处理程序。
- 通过添加代码来修改 Form_Load 方法,从而为用户、组和服务创建三个顶级节点。当应用程序运行时,名为 entryPC 的组件的 Children 属性包含在 Path(您的计算机)中找到的所有项。每个子级也都是一个 DirectoryEntry 对象。因为您正在计算机路径上使用 WinNT 提供程序,子 DirectoryEntry 对象的 SchemaClassName 属性将是“User”、“Group”或“Service”之一。select 或 switch 语句可用于确定项类型并向正确的组添加节点。
下一步中将编写 AddPathAndProperties 方法。
' 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 System.DirectoryServices.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 // 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(System.DirectoryServices.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); } }
- 将以下代码添加到 Form1 类,以创建
AddPathAndProperties
方法。node
参数表示与该项关联的 TreeNode 对象。entry
参数表示目录中的一个项,即一个用户、一个组或一个服务。DirectoryEntry 组件具有 Properties 属性,该属性包含一个字符串索引的属性集合。该集合的内容取决于 DirectoryEntry 组件的架构。Properties 集合具有 PropertyNames 属性,该属性是一个所有属性名称的集合。通过逐一通过该集合,您可以检索每个属性。每个属性都具有一组关联的值。在本方法中,只检索每个属性的第一个值。
' Visual Basic Private Sub AddPathAndProperties(ByVal node As TreeNode, _ ByVal entry As System.DirectoryServices.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, System.DirectoryServices.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 键运行该程序。
- 打开节点以检查路径和属性。因为所有用户共享相同的架构,所以它们共享相同的属性集。对于组和服务节点,情况也是这样。