dotNET Core 中怎样操作AD(续1)

在之前的文章《dotNET Core 中怎样操作 AD?》中主要以AD的数据同步到数据库的场景来描述了在 dotNetCore 中怎样操作AD,本文将继续介绍一些在 dotNetCore 中操作 AD 的其他常用操作。

环境

  • dotNET Core:3.0

  • Novell.Directory.Ldap.NETStandard2_0:3.1.0

  • AD:windows server 2012

基本操作

查询

在 AD 中进行用户的操作,通常需要先判断用户是否存在,这时就需要使用查询了,用下面代码可以进行 AD 中的查询:

 var entities = _connection.Search(ADClient.BaseDC,LdapConnection.SCOPE_SUB,$"sAMAccountName={loginName}",null, false);

参数说明:

  • base: 指定的总体搜索范围,通常在创建连接时会指定一个 BaseDC,表示后面的操作在此 DC 范围内,如果希望从根开始搜索,此参数可传空

  • scope:查询遍历的方式,分为 SCOPE_BASE 、SCOPE_ONE 和 SCOPE_SUB 三种

    • SCOPE_BASE:通常知道对象的 DN,并希望获取其属性时,使用此项

    • SCOPE_ONE:查询 base 的下一层级

    • SCOPE_SUB:查询 base 下的所有对象,包含 base

  • filter:用来过滤的表达式,下面列出一些常用的表达式

    (cn=oec2003):返回 cn 等于 oec2003 的用户
    (sAMAccountName=oec*):返回登录名以 oec 开头的用户
    !(cn=oec2003):返回 cn 不等于 oec2003 的用户
    (|(cn=oec2003)(telephonenumber=888*)):返回 cn 等于 oec2003 ,或者电话号码以 888 开头的用户
    (&(cn=oec2003)(telephonenumber=888*)):返回 cn 等于 oec2003 ,并且电话号码以 888 开头的用户
    

    其他更多的表达式可以参考官方文档:https://www.novell.com/documentation/developer/ldapcsharp/?page=/documentation/developer/ldapcsharp/cnet/data/bovtuda.html

  • attrs:字符串数组,可以指定返回的属性的列表,不指定返回所有的属性

例如根据登录名来查询用户的示例代码如下:

public static LdapEntry GetUser(string loginName)
{var entities = _connection.Search(ADClient.BaseDC,LdapConnection.SCOPE_SUB,$"sAMAccountName={loginName}",null, false);LdapEntry entry = null;while (entities.HasMore()){try{entry = entities.Next();}catch (LdapException e){Console.WriteLine($"GetUser Error: {e.Message}");continue;}}return entry;
}

添加用户

public static bool AddUser(string userName, string loginName, string defaultPwd, string container)
{//设置默认密码defaultPwd = $"\"{defaultPwd}\"";sbyte[] encodedBytes = SupportClass.ToSByteArray(Encoding.Unicode.GetBytes(defaultPwd));LdapAttributeSet attributeSet = new LdapAttributeSet();attributeSet.Add(new LdapAttribute("objectclass", "user"));attributeSet.Add(new LdapAttribute("sAMAccountName", userName));//设置创建用户后启用attributeSet.Add(new LdapAttribute("userAccountControl", (66080).ToString()));attributeSet.Add(new LdapAttribute("unicodePwd", encodedBytes));string dn = $"CN={loginName},{container}";LdapEntry newEntry = new LdapEntry(dn, attributeSet);_connection.Add(newEntry);return true;
}

注意点:

  • 默认密码的设置需要给密码加上引号

  • 默认情况下创建的用户是禁用的,如果要启用需要加上代码attributeSet.Add(new LdapAttribute("userAccountControl", (66080).ToString()));

修改密码

public static bool UpdatePassword(string loginName, string password)
{LdapEntry entry = GetUser(loginName);if (entry == null){throw new Exception($"名为:{loginName} 的用户在AD中不存在");}password = $"\"{password}\"";sbyte[] encodedBytes = SupportClass.ToSByteArray(Encoding.Unicode.GetBytes(password));LdapAttribute attributePassword = new LdapAttribute("unicodePwd", encodedBytes);_connection.Modify(entry.DN, new LdapModification(LdapModification.REPLACE, attributePassword));return true;
}

禁用用户

public static bool EnblaedUser(string loginName)
{LdapEntry entry = GetUser(loginName);if (entry == null){throw new Exception($"名为:{loginName} 的用户在AD中不存在");}LdapAttribute attributePassword = new LdapAttribute("userAccountControl", (66082).ToString());_connection.Modify(entry.DN, new LdapModification(LdapModification.REPLACE, attributePassword));return true;
}

启用用户

public static bool EnblaedUser(string loginName)
{LdapEntry entry = GetUser(loginName);if (entry == null){throw new Exception($"名为:{loginName} 的用户在AD中不存在");}LdapAttribute attributePassword = new LdapAttribute("userAccountControl", (66080).ToString());_connection.Modify(entry.DN, new LdapModification(LdapModification.REPLACE, attributePassword));return true;
}

移动用户到新的 OU

public static bool MoveUserToOU(string loginName, string rcn = "", string ouContainer = "")
{LdapEntry entry = GetUser(loginName);if (entry == null){throw new Exception($"名为:{loginName} 的用户在AD中不存在");}string cn = entry.AttrStringValue("cn");cn = rcn == "" ? cn : rcn;string newRCN = $"CN={cn}";if (string.IsNullOrWhiteSpace(ouContainer)){_connection.Rename(entry.DN, newRCN, true);}else{_connection.Rename(entry.DN, newRCN, ouContainer, true);}return true;
}

注意点:

  • 一个用户一旦创建,DN 是不能修改的,可以通过Rename方法来修改 CN 来达到修改 DN 的目的

  • 如果传入第三个参数ouContainer,就可以实现将用户移动到目标 OU

添加用户到组

public static bool AddUserToGroup(string loginName, string groupDN)
{LdapEntry entry = GetUser(loginName);if (entry == null){throw new Exception($"名为:{loginName} 的用户在AD中不存在");}List<string> memberOf = entry.AttrStringValueArray("memberOf");if (memberOf.Contains(groupDN)){throw new Exception($"名为:{loginName} 的用户已经加入了组: {groupDN}");}LdapModification[] modGroup = new LdapModification[1];LdapAttribute member = new LdapAttribute("member", entry.DN);modGroup[0] = new LdapModification(LdapModification.ADD, member);try{_connection.Modify(groupDN, modGroup);}catch (LdapException e){System.Console.Error.WriteLine("Failed to modify group's attributes: " + e.LdapErrorMessage);return false;}catch (Exception e){Console.Error.WriteLine("AddUserToGroup Error:" + e.Message);return false;}return true;
}

用户从组中移除

public static bool RemoveUserFromGroup(string loginName, string groupDN)
{LdapEntry entry = GetUser(loginName);if (entry == null){throw new Exception($"名为:{loginName} 的用户在AD中不存在");}List<string> memberOf = entry.AttrStringValueArray("memberOf");if (!memberOf.Contains(groupDN)){throw new Exception($"名为:{loginName} 的用户不存在于组: {groupDN} 中");}LdapModification[] modGroup = new LdapModification[1];LdapAttribute member = new LdapAttribute("member", entry.DN);modGroup[0] = new LdapModification(LdapModification.DELETE, member);try{_connection.Modify(groupDN, modGroup);}catch (LdapException e){System.Console.Error.WriteLine("Failed to delete group's attributes: " + e.LdapErrorMessage);return false;}catch (Exception e){Console.Error.WriteLine("RemoveUserFromGroup Error:" + e.Message);return false;}return true;
}

添加用户登录到

public static bool UpdateUserWorkStation(string loginName, string computerName, UserWorkStationOperType type)
{LdapEntry entry = GetUser(loginName);if (entry == null){throw new Exception($"名为:{loginName} 的用户在AD中不存在");}List<string> stations = entry.AttrStringValue("userWorkstations").Split(',').ToList();if (type == UserWorkStationOperType.Add && !stations.Contains(computerName)){stations.Add(computerName);}else if (type == UserWorkStationOperType.Remove && stations.Contains(computerName)){stations.Remove(computerName);}LdapAttribute attributePassword = new LdapAttribute("userWorkstations", string.Join(',', stations));_connection.Modify(entry.DN, new LdapModification(LdapModification.REPLACE, attributePassword));return true;
}

最后

本文的示例代码已推送到 GitHub:https://github.com/oec2003/DotNetCoreAdDemo

官网也有些示例,但不是很完善,而且有很多代码并不能正常执行(可能跟 AD 的版本有关),所以才有了本示例。本示例也会添加更多的使用场景,不断完善。

希望本文对您有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/312193.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Magicodes.IE 2.0.0-beta1版本发布】已支持数据表格、列筛选器和Sheet拆分

为了更好的完善Magicodes.IE&#xff0c;春节期间我们会进行一次大的重构。由于精力有限&#xff0c;急缺文档和翻译&#xff08;将文档翻译为英文文档&#xff09;支持&#xff0c;诚邀各位加入。同时在功能方便也做了相关规划&#xff0c;有兴趣的朋友可以参与提交PR。https:…

Mbp,一个用于学习.net core的开发框架

Mbp(https://github.com/mbpframework/Mbp)是一个.net core 3的企业级web开发框架,是我个人用于学习.net core而发起的一个开源项目.这个借鉴了国外优秀开源项目abp vnext,及国内优秀开源框架Osharp的一些思想和实现.欢迎各路开发爱好者加入这个项目,一起学习,一起玩耍,共同成长…

什么?原来C#还有这两个关键字

系列介绍简介【五分钟的dotnet】是一个利用您的碎片化时间来学习和丰富.net知识的博文系列。它所包含了.net体系中可能会涉及到的方方面面&#xff0c;比如C#的小细节&#xff0c;AspnetCore&#xff0c;微服务中的.net知识等等。场景您可以在下班坐地铁的时候&#xff0c;拿出…

蓝桥杯2015初赛-三羊献瑞-枚举

题目描述 观察下面的加法算式&#xff1a; 其中&#xff0c;相同的汉字代表相同的数字&#xff0c;不同的汉字代表不同的数字。 请你填写“三羊献瑞”所代表的4位数字&#xff08;答案唯一&#xff09;&#xff0c;不要填写任何多余内容。 输出 请你填写“三羊献瑞”所代表…

如何利用Serilog的RequestLogging来精简ASP.NET Core的日志输出

这是该系列的第一篇文章&#xff1a;在ASP.NET Core 3.0中使用Serilog.AspNetCore。第1部分-使用Serilog RequestLogging来简化ASP.NET Core的日志输出&#xff08;本篇文章&#xff09;第2部分-使用Serilog记录所选的端点名称[敬请期待]第3部分-使用Serilog.AspNetCore记录MVC…

net下的高性能轻量化半自动orm+linq的《SqlBatis》

一、项目介绍该项目内置单表linq操作&#xff0c;xml动态sql解析&#xff0c;词法分析&#xff0c;类型映射等功能。SqlMapper,用来处理sql与数据库操作&#xff0c;它设计的目标是支持mysql,sqlserver,sqllite,pgsql等.TypeMapper用于完成将数据库的字段类型映射到C#类型&…

如何快速融入团队(六)

作者&#xff1a;邹溪源&#xff0c;长沙资深互联网从业者&#xff0c;架构师社区特邀嘉宾&#xff01;一我总是在记忆深处探访那些拥有高效率团队的一切特征&#xff0c;并试图从纷繁复杂的记忆尘埃中找出一些共性&#xff0c;庆幸我已经习惯于通过阅读和思考来解读这些内容&a…

临近年关,修复ASP.NET Core因浏览器内核版本引发的单点登录故障

临近年关&#xff0c;咨询师提出360、搜狗急速浏览器无法单点登录到公司核心产品WD: 重定向过多。现象经过测试&#xff0c; 出现单点登陆故障的是搜狗、360等双核浏览器(默认使用Chrome内核)&#xff0c; 较新式的Edge、Chrome、Firefox均未出现此障碍。Developer tool监测不到…

Asp.Net Core 已支持 gRPC-Web !!

grpc-dotnet 项目在 PR #695 完成了 ASP.NET Core 服务与 .NET Core gRPC 客户端的 gRPC-Web 实现。虽然目前还是实验性项目&#xff0c;但是并不阻碍我们为之兴奋。下面我们来看看如何使用。gRPC-Web 简介gRPC-Web 允许从浏览器应用程序使用 gRPC&#xff0c;gRPC-Web 支持在新…

蓝桥杯2017初赛-打印大X-找规律

题目描述 小明希望用星号拼凑&#xff0c;打印出一个大X&#xff0c;他要求能够控制笔画的宽度和整个字的高度。 为了便于比对空格&#xff0c;所有的空白位置都以句点符来代替。 要求输入两个整数m n&#xff0c;表示笔的宽度&#xff0c;X的高度。 输入 输入存在多组数据 …

蓝桥杯2015决赛-方格填数-枚举 or dfs

题目描述 在2行5列的格子中填入1到10的数字。 要求&#xff1a;相邻的格子中的数&#xff0c;右边的大于左边的&#xff0c;下边的大于上边的。 如下图所示的2种&#xff0c;就是合格的填法。 请你计算一共有多少种可能的方案。 输出 请输出该整数&#xff0c;不要输出任何多…

【实战 Ids4】║ 在Swagger中调试认证授权中心

回家的路上照顾好自己哟~大家好&#xff0c;老张已经顺利到家啦&#xff0c;闲的无事写两篇文章冒个泡吧&#xff0c;其实写的内容都是群友提出来的问题&#xff0c;简单的我会在群里直接提供思路&#xff0c;麻烦的我就写个文章说明一下吧&#xff0c;也是自己的一个记录作用&…

linux 集群 java,Linux Tomcat 集群 利用记实1--搭建javaWeb运行情况

前段时候一向在搞linux&#xff0c;有很多多少工具只曩昔没有做过。影象不是那么深刻&#xff0c;此刻把历程记实下来&#xff0c;以备今后盘问。一&#xff1a;起首说一下我们的计划&#xff0c; 一共有六台办事器&#xff0c;此中两台安置Oracle 10g做数据库集群(这个不在这篇…

在 Blazor WebAssembly 中使用 gRPC-Web

对于单页面应用程序&#xff0c;gRPC-Web 是 JSON-over-HTTP 的一种方便、高性能的替代方案。如果你已经了解关于 gRPC 和 gRPC-Web 的一切&#xff0c;你可以跳到 添加 gRPC 服务到一个Blazor WebAssembly 应用程序 一节。如果你只是想要一些简单的 Blazor WebAssembly gRPC-…

【新书推荐】《ASP.NET Core微服务实战:在云环境中开发、测试和部署跨平台服务》 带你走近微服务开发...

《ASP.NET Core 微服务实战》译者序&#xff1a;https://blog.jijiechen.com/post/aspnetcore-microservices-preface-by-translator/“微服务”的概念在 2014 年正式提出之后&#xff0c;越来越多的团队开始用它来设计自己的业务系统&#xff0c;各种微服务框架和开发过程管理…

.NET Core验证ASP.NET密码

.NET Core验证ASP.NET密码随着 .NETCore的持续更新和完善&#xff0c;越来越多的机构已经选择或者升级为 .NETCore。但由于技术不完全相同&#xff0c;不可能所有应用/数据库都能无缝迁移&#xff0c;因此 ASP.NETCore和传统 ASP.NET之间多少会存在一些挑战&#xff0c;需要更多…

linux下I2C驱动发送IO时序,I2C驱动情景分析——怎样控制I2C时序

内核版本&#xff1a;linux-3.4.2源程序&#xff1a; linux-3.4.2\drivers\i2c\busses\I2c-s3c2410.c这次要解决的问题是&#xff1a;如何配置soc的I2C模块&#xff0c;输出想要的时序波形&#xff1f;关于Linux里I2C驱动的架构&#xff0c;在转载的文章讲得相当透彻(《linu…

蓝桥杯2017初赛-外星日历-数论

题目描述 某星系深处发现了文明遗迹。他们的计数也是用十进制。 他们的文明也有日历。日历只有天数&#xff0c;没有年、月的概念。 有趣的是&#xff0c;他们也使用了类似“星期”的概念&#xff0c;只不过他们的一个星期包含了9天&#xff0c;为了方便&#xff0c;这里分别记…

ubuntu14.04安装linux公社,Ubuntu 14.04下安装IT++

Ubuntu 14.04 下安装 IT(itpp)(官方二进制包安装版)温馨提示&#xff1a;虽然没有尝试&#xff0c;不过直接运行最后一步应该也可以成功。另外&#xff0c;既然有简单的方法&#xff0c;不到破不得以还是不要尝试麻烦的方法了。1、安装 FFTW3sudo apt-get install libfftw3-dev…

.NET CORE(C#) WPF 值得推荐的动画菜单设计

微信公众号&#xff1a;Dotnet9&#xff0c;网站&#xff1a;Dotnet9&#xff0c;问题或建议&#xff1a;请网站留言&#xff0c; 如果对您有所帮助&#xff1a;欢迎赞赏。.NET CORE(C#) WPF 值得推荐的动画菜单设计阅读导航本文背景代码实现本文参考源码1. 本文背景YouTube上老…