C# AD(Active Directory)域信息同步,组织单位、用户等信息查询
转自:http://blog.csdn.net/lingpaoershiyishiji/article/details/9139527
目录 |
- 示例准备
- 知识了解
- 读取AD域信息示例
- DirectorySearcher.Filter属性扩充说明
- 用户属性扩充说明(含图文属性对照)
- 常规
- 地址
- 帐户
- 电话
- 组织
- 示例下载
示例准备 |
- 打开上一篇文章配置好的AD域控制器
- 开始菜单-->管理工具-->Active Directory 用户和计算机
- 新建组织单位和用户
- 新建层次关系如下:
知识了解 |
我们要用C#访问Active Directory非常容易,主要用到
轻量目录访问协议 (LDAP)
System.DirectoryServices命名空间下的两个组件类
DirectoryEntry和DirectorySeacher
读取AD域信息示例 |
示例在Framework 3.5下用Winform程序编写
主要结合常见需求读取组织单位(OU)及用户(User)信息,以及同步组织单位和用户的层次关系;
比较着重的还是用户的信息,特别是帐号、邮箱、SID等信息;
- 下面我们开始连接域,并读取出示例准备中键好的组织单位和用户
首先编写代码用LDAP尝试对域进行访问
形式:LDAP://Domain
#region## 是否连接到域/// <summary>/// 功能:是否连接到域/// 作者:Wilson/// 时间:2012-12-15/// http://msdn.microsoft.com/zh-cn/library/system.directoryservices.directoryentry.path(v=vs.90).aspx/// </summary>/// <param name="domainName">域名或IP</param>/// <param name="userName">用户名</param>/// <param name="userPwd">密码</param>/// <param name="entry">域</param>/// <returns></returns>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## 域中是否存在组织单位/// <summary>/// 功能:域中是否存在组织单位/// 作者:Wilson/// 时间:2012-12-15/// </summary>/// <param name="entry"></param>/// <param name="ou"></param>/// <returns></returns>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## 类型/// <summary>/// 类型/// </summary>public enum TypeEnum : int{/// <summary>/// 组织单位/// </summary>OU = 1,/// <summary>/// 用户/// </summary>USER = 2}#endregion#region## Ad域信息实体/// <summary>/// Ad域信息实体/// </summary>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<AdModel> list = new List<AdModel>(); #region## 同步/// <summary>/// 功能:同步/// 创建人:Wilson/// 创建时间:2012-12-15/// </summary>/// <param name="entryOU"></param>public void SyncAll(DirectoryEntry entryOU){ DirectorySearcher mySearcher = new DirectorySearcher(entryOU, "(objectclass=organizationalUnit)"); //查询组织单位 DirectoryEntry root = mySearcher.SearchRoot; //查找根OUSyncRootOU(root);StringBuilder sb = new StringBuilder();sb.Append("\r\nID\t帐号\t类型\t父ID\r\n");foreach (var item in list){sb.AppendFormat("{0}\t{1}\t{2}\t{3}\r\n", item.Id, item.Name, item.TypeId, item.ParentId);}LogRecord.WriteLog(sb.ToString());MessageBox.Show("同步成功", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);Application.Exit();}#endregion#region## 同步根组织单位/// <summary>/// 功能: 同步根组织单位/// 创建人:Wilson/// 创建时间:2012-12-15/// </summary>/// <param name="entry"></param>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## 同步下属组织单位及下属用户/// <summary>/// 功能: 同步下属组织单位及下属用户/// 创建人:Wilson/// 创建时间:2012-12-15/// </summary>/// <param name="entry"></param>/// <param name="parentId"></param>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
DirectorySearcher.Filter属性扩充说明 |
DirectorySearcher mySearcher = new DirectorySearcher(entryOU, "(objectclass=organizationalUnit)"); //查询组织单位
第二个参数是一个filter,也可以根据需求输入其它筛选条件,下面列出几个常用的
筛选条件 值 用户 (&(objectCategory=person)(objectClass=user)) 计算机 (objectCategory=computer) 组 (objectCategory=group) 联系人 (objectCategory=contact) 共享文件夹 (objectCategory=volume) 打印机 (objectCategory=printQueue) 更多高级筛选请查看:http://msdn.microsoft.com/zh-cn/library/system.directoryservices.directorysearcher.filter(v=vs.80).aspx
用户属性扩充说明(含图文属性对照) |
示例中只对用户进行了读取了几个属性,用过AD域的应该都知道,用户的属性较多也比较常用。
下面通过AD域的用户详细信来对照一下相应的属性名
- 常项选项卡
对应编号 选项卡对应项名 属性名 ① 姓(L) sn ② 名(F) givenName ③ 显示名称(S) displayName ④ 描述(D) description ⑤ 办公室(C) physicalDeliveryOfficeName ⑥ 英文缩写(I) initials ⑦ 电话号码(T) telephoneNumber ⑧ 电子邮件(M) ⑨ 网页(W) wWWHomePage ⑩ 电话号码-其它(O)... otherTelephone ⑪ 网页-其它(R)... url
- 地址选项卡
对应编号 选项卡对应项名 属性名 ① 国家/地区(O) co ② 省/自治区(V) st ③ 市/县(C) l ④ 街道(S) streetAddress ⑤ 邮政信箱(B) postOfficeBox ⑥ 邮政编码(Z) postalCode
- 帐户选项卡
对应编号 选项卡对应项名 属性名 ① 用户登录名(U) userPrincipalName ② 用户登录名(Windows 2000 以前版本)(W) sAMAccountName
- 电话选项卡
对应编号 选项卡对应项名 属性名 ① 家庭电话(M) homePhone ② 寻呼机(P) pager ③ 移动电话(B) mobile ④ 传真(F) facsimileTelephoneNumber ⑤ IP电话(I) ipPhone ⑥ 注释 info ⑦ 家庭电话-其它(O) otherHomePhone ⑧ 寻呼机-其它(T) otherPager ⑨ 移动电话-其它(B) otherMobile ⑩ 传真-其它(E) otherFacsimileTelephoneNumber ⑪ IP电话-其它(R) otherIpPhone
- 组织选项卡
对应编号 选项卡对应项名 属性名 ① 公司(C) company ② 部门(D) department ③ 职务(J) title ④ 经理-姓名(N) manager ⑥ 直接下属(E) directReports
还有一些属性没有列出来,可以循环输出DirectoryEntry.Properties.PropertyNames来找
比如用objectsid这也是个用户比较重要的属性,在设置Windows共享时会用到!
示例下载 |
示例下载:http://files.cnblogs.com/zhongweiv/SynchronousAD.zip
示例代码,写得比较简陋,有需要就下载了将就着看一下吧^_^!
作 者: Porschev[钟慰]
出 处: http://www.cnblogs.com/zhongweiv/
微 博: http://weibo.com/porschev
欢迎任何形式的转载,但请务必注明原文详细链接
目录 |
- 示例准备
- 知识了解
- 读取AD域信息示例
- DirectorySearcher.Filter属性扩充说明
- 用户属性扩充说明(含图文属性对照)
- 常规
- 地址
- 帐户
- 电话
- 组织
- 示例下载
示例准备 |
- 打开上一篇文章配置好的AD域控制器
- 开始菜单-->管理工具-->Active Directory 用户和计算机
- 新建组织单位和用户
- 新建层次关系如下:
知识了解 |
我们要用C#访问Active Directory非常容易,主要用到
轻量目录访问协议 (LDAP)
System.DirectoryServices命名空间下的两个组件类
DirectoryEntry和DirectorySeacher
读取AD域信息示例 |
示例在Framework 3.5下用Winform程序编写
主要结合常见需求读取组织单位(OU)及用户(User)信息,以及同步组织单位和用户的层次关系;
比较着重的还是用户的信息,特别是帐号、邮箱、SID等信息;
- 下面我们开始连接域,并读取出示例准备中键好的组织单位和用户
首先编写代码用LDAP尝试对域进行访问
形式:LDAP://Domain
#region## 是否连接到域/// <summary>/// 功能:是否连接到域/// 作者:Wilson/// 时间:2012-12-15/// http://msdn.microsoft.com/zh-cn/library/system.directoryservices.directoryentry.path(v=vs.90).aspx/// </summary>/// <param name="domainName">域名或IP</param>/// <param name="userName">用户名</param>/// <param name="userPwd">密码</param>/// <param name="entry">域</param>/// <returns></returns>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## 域中是否存在组织单位/// <summary>/// 功能:域中是否存在组织单位/// 作者:Wilson/// 时间:2012-12-15/// </summary>/// <param name="entry"></param>/// <param name="ou"></param>/// <returns></returns>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## 类型/// <summary>/// 类型/// </summary>public enum TypeEnum : int{/// <summary>/// 组织单位/// </summary>OU = 1,/// <summary>/// 用户/// </summary>USER = 2}#endregion#region## Ad域信息实体/// <summary>/// Ad域信息实体/// </summary>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<AdModel> list = new List<AdModel>(); #region## 同步/// <summary>/// 功能:同步/// 创建人:Wilson/// 创建时间:2012-12-15/// </summary>/// <param name="entryOU"></param>public void SyncAll(DirectoryEntry entryOU){ DirectorySearcher mySearcher = new DirectorySearcher(entryOU, "(objectclass=organizationalUnit)"); //查询组织单位 DirectoryEntry root = mySearcher.SearchRoot; //查找根OUSyncRootOU(root);StringBuilder sb = new StringBuilder();sb.Append("\r\nID\t帐号\t类型\t父ID\r\n");foreach (var item in list){sb.AppendFormat("{0}\t{1}\t{2}\t{3}\r\n", item.Id, item.Name, item.TypeId, item.ParentId);}LogRecord.WriteLog(sb.ToString());MessageBox.Show("同步成功", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);Application.Exit();}#endregion#region## 同步根组织单位/// <summary>/// 功能: 同步根组织单位/// 创建人:Wilson/// 创建时间:2012-12-15/// </summary>/// <param name="entry"></param>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## 同步下属组织单位及下属用户/// <summary>/// 功能: 同步下属组织单位及下属用户/// 创建人:Wilson/// 创建时间:2012-12-15/// </summary>/// <param name="entry"></param>/// <param name="parentId"></param>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
DirectorySearcher.Filter属性扩充说明 |
DirectorySearcher mySearcher = new DirectorySearcher(entryOU, "(objectclass=organizationalUnit)"); //查询组织单位
第二个参数是一个filter,也可以根据需求输入其它筛选条件,下面列出几个常用的
筛选条件 值 用户 (&(objectCategory=person)(objectClass=user)) 计算机 (objectCategory=computer) 组 (objectCategory=group) 联系人 (objectCategory=contact) 共享文件夹 (objectCategory=volume) 打印机 (objectCategory=printQueue) 更多高级筛选请查看:http://msdn.microsoft.com/zh-cn/library/system.directoryservices.directorysearcher.filter(v=vs.80).aspx
用户属性扩充说明(含图文属性对照) |
示例中只对用户进行了读取了几个属性,用过AD域的应该都知道,用户的属性较多也比较常用。
下面通过AD域的用户详细信来对照一下相应的属性名
- 常项选项卡
对应编号 选项卡对应项名 属性名 ① 姓(L) sn ② 名(F) givenName ③ 显示名称(S) displayName ④ 描述(D) description ⑤ 办公室(C) physicalDeliveryOfficeName ⑥ 英文缩写(I) initials ⑦ 电话号码(T) telephoneNumber ⑧ 电子邮件(M) ⑨ 网页(W) wWWHomePage ⑩ 电话号码-其它(O)... otherTelephone ⑪ 网页-其它(R)... url
- 地址选项卡
对应编号 选项卡对应项名 属性名 ① 国家/地区(O) co ② 省/自治区(V) st ③ 市/县(C) l ④ 街道(S) streetAddress ⑤ 邮政信箱(B) postOfficeBox ⑥ 邮政编码(Z) postalCode
- 帐户选项卡
对应编号 选项卡对应项名 属性名 ① 用户登录名(U) userPrincipalName ② 用户登录名(Windows 2000 以前版本)(W) sAMAccountName
- 电话选项卡
对应编号 选项卡对应项名 属性名 ① 家庭电话(M) homePhone ② 寻呼机(P) pager ③ 移动电话(B) mobile ④ 传真(F) facsimileTelephoneNumber ⑤ IP电话(I) ipPhone ⑥ 注释 info ⑦ 家庭电话-其它(O) otherHomePhone ⑧ 寻呼机-其它(T) otherPager ⑨ 移动电话-其它(B) otherMobile ⑩ 传真-其它(E) otherFacsimileTelephoneNumber ⑪ IP电话-其它(R) otherIpPhone
- 组织选项卡
对应编号 选项卡对应项名 属性名 ① 公司(C) company ② 部门(D) department ③ 职务(J) title ④ 经理-姓名(N) manager ⑥ 直接下属(E) directReports
还有一些属性没有列出来,可以循环输出DirectoryEntry.Properties.PropertyNames来找
比如用objectsid这也是个用户比较重要的属性,在设置Windows共享时会用到!
示例下载 |
示例下载:http://files.cnblogs.com/zhongweiv/SynchronousAD.zip
示例代码,写得比较简陋,有需要就下载了将就着看一下吧^_^!
作 者: Porschev[钟慰]
出 处: http://www.cnblogs.com/zhongweiv/
微 博: http://weibo.com/porschev
欢迎任何形式的转载,但请务必注明原文详细链接
C# AD(Active Directory)域信息同步,组织单位、用户等信息查询相关推荐
- Windows Server 2008 R2 配置AD(Active Directory)域控制器(图文教程)
配置环境 Windows版本:Windows Server 2008 R2 Enterprise Service Pack 1 系统类型: 64 位操作系统 配置DNS服务器 这一步不是必须的,在安装 ...
- Active Directory 域服务(AD DS)
本文内容 概述 工作组架构与域架构 名称空间(Namespace) 对象(Object).容器(Container)与组织单位(Organization Units,OU) 域树(Domain Tre ...
- 无法与域“xxxx.com”的Active Directory域控制器(AD DC)连接 之DNS故障
域控机DC: win7加入域控报错,发现无法加入域环境,报错内容,"无法与域"xxxx.com"的Active Directory域控制器(AD DC)连接": ...
- active directory域服务
active directory域服务 一.Windows 网络环境* 工作组workgroup 域 二.windows域: 1.集中管理 2.分域控制器和成员服务器 3.账户保存在域当中,文件名为( ...
- 微软域服务器,Active Directory 域服务概述
Active Directory 域服务概述 05/31/2017 本文内容 适用范围:Windows Server 2022.Windows Server 2019.Windows Server 2 ...
- 删除域控中的一个服务器,删除 Active Directory 域服务
在域控制器上运行 Dcpromo.exe 时,Active Directory 域服务安装向导检测到已在服务器上安装了 Active Directory 域服务 (AD DS).然后,该向导将启动并提 ...
- Active Directory 域滲透 (如何访问数据库?)
数据库数据交互,域控制器提供了几个选项来转换为它们支持的各种协议/服务: LDAP 端口: LDAP 定义了一种查询语法,允许您过滤需要在数据库中检索/编辑的对象.您可以按对象的属性过滤对象.例如,要 ...
- 创建 Active Directory 域
1.创建域的必要条件 Windows Server 2019初始默认安装是没有安装活动目录的,而只有安装了活动目录, 用户才能搭建域环境.在安装活动目录服务之前,应当明确一些必备的安装 ...
- Active Directory域 介绍和搭建及一些个别操作
Active Directory ActiveDirectoryDomainService,ADDS 活动目录域服务 Active Directory 域服务 Active Directory Adm ...
最新文章
- [react native] navigator过渡卡顿问题
- 《正则表达式经典实例(第2版)》——2.19 在替代文本中添加字面文本
- 逻辑网络拓扑与物理网络拓扑—Vecloud微云
- Windows 7 硬盘安装
- 【Python基础避坑】函数内存底层分析,全局变量/局部变量,参数传递,浅拷贝/深拷贝
- OCA第6部分中的Java难题
- diskgeniusv4.4.0_入门TensorFlow2.0
- R语言学习笔记(三)多元数据的数据特征、相关分析与图形表示
- 剖析Disruptor:为什么会这么快?(一)Ringbuffer的特别之处
- decodeURI decodeURIComponent
- C#连接控制西门子PLC
- idb 怎么回复mysql_mysql中的.idb文件 怎么正常显示
- linux tig不支持中文,颠覆 Git 命令使用体验的神器 -- tig
- JQuery UI combogrid
- VScode主题字体(正体,斜体修改)
- 狼追击兔matlab,狼兔追击问题-数学建模
- 三国演义java_三国演义全集高清_java进阶(34)–File类、目录复制
- 更改路由表,让windows同时启用双网卡,令需要访问的IP随心所欲
- 8寸Single机台喷淋去胶加工服务
- 好文分享 | 记一次Oracle12c数据库SQL短暂缓慢问题分析