C# AD(Active Directory)域信息同步,组织单位、用户等信息查询

C# AD(Active Directory)域信息同步,组织单位、用户等信息查询 接上篇 Windows Server 2008 R2 配置AD(Active Directory)域控制器 对AD

C# AD(Active Directory)域信息同步,组织单位、用户等信息查询 接上篇 Windows Server 2008 R2 配置AD(Active Directory)域控制器 对AD 域结合常见需求用

C#进行一些读取信息的操作^_^!

∙ 示例准备 知识了解 读取AD 域信息示例 DirectorySearcher.Filter 属性扩充说明 用户属性扩充说明(含图文属性对照)

常规 地址

帐户 电话 组织 示例下载

,

新建层次关系如下:

,

下面我们开始连接域,并读取出示例准备中键好的组织单位和用户 首先编写代码用

LDAP 尝试对域进行访问

形式:LDAP://Domain

#region## 是否连接到域

///

/// 功能:是否连接到域

/// 作者:Wilson

/// 时间:2012-12-15

///

///

/// 域名或IP

/// 用户名

/// 密码

///

///

private bool IsConnected(string domainName, string userName, string userPwd, out DirectoryEntry domain)

{

domain = new DirectoryEntry();

try

{

domain.Path = string.Format("LDAP://{0}", domainName);

domain.Username = userName;

domain.Password = userPwd;

domain.AuthenticationType = AuthenticationTypes.Secure;

domain.RefreshCache();

return true;

}

catch(Exception ex)

,

{

LogRecord.WriteLog("[IsConnected方法]错误信息:" ex.Message);

return false;

}

} #endregion

传用参数,调IsConnected 方法,结果如下

连接上AD 域后,接着我们找到根OU

#region## 域中是否存在组织单位

///

/// 功能:域中是否存在组织单位

/// 作者:Wilson

/// 时间:2012-12-15

///

///

///

///

private bool IsExistOU(DirectoryEntry entry, out DirectoryEntry ou)

{

ou = new DirectoryEntry();

try

{

ou = entry.Children.Find("OU=" txtRootOU.Text.Trim());

return (ou != null);

,

}

catch(Exception ex)

{

LogRecord.WriteLog("[IsExistOU方法]错误信息:" ex.Message);

return false;

}

} #endregion

传入以数,调用IsExistOU 方法,结果如下

下面来开始读取组织单位及用户的信息。

示例为了看出层次关系及导出信息是类型区分,给OU 和User 新建了一个实体类和一个类型的枚举

#region## 类型

///

/// 类型

///

public enum TypeEnum : int

{

///

/// 组织单位

///

OU = 1,

///

/// 用户

,

///

USER = 2 }

#endregion

#region## Ad域信息实体

///

/// Ad域信息实体

///

public class AdModel

{

public AdModel(string id, string name, int typeId, string parentId) {

Id = id;

Name = name;

TypeId = typeId;

ParentId = parentId;

}

public string Id { get; set; }

public string Name { get; set; }

public int TypeId { get; set; }

public string ParentId { get; set; }

}

#endregion

下面读取信息

private List list = new List();

#region## 同步

///

/// 功能:同步

/// 创建人:Wilson

/// 创建时间:2012-12-15

///

///

public void SyncAll(DirectoryEntry entryOU)

{

DirectorySearcher mySearcher = new DirectorySearcher(entryOU, "(objectclass=organizationalUnit)"); //查询组织单位

,

DirectoryEntry root = mySearcher.SearchRoot; //查找根OU

SyncRootOU(root);

StringBuilder sb = new StringBuilder();

sb.Append("rnIDt帐号t类型t父IDrn");

foreach (var item in list)

{

sb.AppendFormat("{0}t{1}t{2}t{3}rn", item.Id, item.Name, item.TypeId, item.ParentId);

}

LogRecord.WriteLog(sb.ToString());

MessageBox.Show("同步成功", this.Text, MessageBoxButtons.OK,

MessageBoxIcon.Information);

Application.Exit();

}

#endregion

#region## 同步根组织单位

///

/// 功能: 同步根组织单位

/// 创建人:Wilson

/// 创建时间:2012-12-15

///

///

private void SyncRootOU(DirectoryEntry entry)

{

if (entry.Properties.Contains("ou") &&

entry.Properties.Contains("objectGUID"))

{

string rootOuName = entry.Properties["ou"][0].ToString();

byte[] bGUID = entry.Properties["objectGUID"][0] as byte[];

string id = BitConverter.ToString(bGUID);

list.Add(new AdModel(id, rootOuName, (int)TypeEnum.OU, "0"));

,

SyncSubOU(entry, id);

}

}

#endregion

#region## 同步下属组织单位及下属用户

///

/// 功能: 同步下属组织单位及下属用户

/// 创建人:Wilson

/// 创建时间:2012-12-15

///

///

///

private void SyncSubOU(DirectoryEntry entry, string parentId)

{

foreach (DirectoryEntry subEntry in entry.Children)

{

string entrySchemaClsName = subEntry.SchemaClassName;

string[] arr = subEntry.Name.Split('=');

string categoryStr = arr[0];

string nameStr = arr[1];

string id = string.Empty;

if (subEntry.Properties.Contains("objectGUID")) //SID

{

byte[] bGUID = subEntry.Properties["objectGUID"][0] as byte[];

id = BitConverter.ToString(bGUID);

}

bool isExist = list.Exists(d => d.Id == id);

switch (entrySchemaClsName)

{

case "organizationalUnit":

if (!isExist)

{

list.Add(new AdModel(id, nameStr, (int)TypeEnum.OU, parentId)); }

SyncSubOU(subEntry, id);

break;

,

case "user":

string accountName = string.Empty;

if (subEntry.Properties.Contains("samaccountName"))

{

accountName =

subEntry.Properties["samaccountName"][0].ToString();

}

if (!isExist)

{

list.Add(new AdModel(id, accountName, (int)TypeEnum.USER,

parentId));

}

break;

}

}

}

#endregion

调用SyncAll 方法循环输出list, 结果如下, 很清楚的可以看出层次关系

//ID 帐号 类型 父ID

//58-D6-C4-32-6A-A1-99-48-A4-8B-C8-5D-BC-C9-3E-17 acompany 1 0 //FB-44-91-AE-AC-73-2B-4D-9F-01-B1-E2-16-D3-CB-1B department01 1 58-D6-C4-32-6A-A1-99-48-A4-8B-C8-5D-BC-C9-3E-17

//47-9D-5B-91-60-22-D1-46-B0-CD-C7-B2-C7-D3-00-31 department03 1 FB-44-91-AE-AC-73-2B-4D-9F-01-B1-E2-16-D3-CB-1B

//E3-AD-47-45-38-64-02-4D-B9-83-2C-50-67-50-4F-92 zw 2 47-9D-5B-91-60-22-D1-46-B0-CD-C7-B2-C7-D3-00-31

//8A-D4-23-18-F3-6F-E1-47-93-7A-CC-07-76-4B-E7-86 zhongw 2 FB-44-91-AE-AC-73-2B-4D-9F-01-B1-E2-16-D3-CB-1B

//BC-D0-34-85-67-2F-05-4D-B5-77-E3-F4-AD-51-45-02 department02 1 58-D6-C4-32-6A-A1-99-48-A4-8B-C8-5D-BC-C9-3E-17

//1C-13-FA-66-E4-51-65-49-8B-DC-22-60-32-34-8F-22 wilson 2 BC-D0-34-85-67-2F-05-4D-B5-77-E3-F4-AD-51-45-02

//84-E8-E5-9A-6B-56-E2-45-9A-87-54-D1-78-6B-D3-56 porschev 2 58-D6-C4-32-6A-A1-99-48-A4-8B-C8-5D-BC-C9-3E-17

,

常项选项卡

标签: