Tag: active directory

如何找到ADUser的密码到期日期或密码到期之前的剩余天数?

我有一个ADUsers列表,我想检查是否有任何用户的密码即将到期,但我找不到任何要检查的属性。

UserPrincipal.GetAuthorizationGroups()方法出错

我在Web应用程序中使用UserPrincipal类的GetAuthorizationGroups方法时遇到问题。 使用以下代码,我收到“尝试检索授权组时,发生错误(5)” PrincipalContext context = new PrincipalContext(ContextType.Domain, null, “DC=MyCompany,DC=COM”, “username”, “password”); UserPrincipal p = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, “joe.blogs”); var groups = p.GetAuthorizationGroups(); 我相信这段代码在某种程度上有效。 当我查看上下文对象时,我可以看到服务器和用户名/密码已在对象中正确解析 当我查看p对象时,我可以看到已经填充了AD详细信息,如电话号码等。 这是错误的堆栈跟踪。 [PrincipalOperationException: While trying to retrieve the authorization groups, an error (5) occurred.] System.DirectoryServices.AccountManagement.AuthZSet..ctor(Byte[] userSid, NetCred credentials, ContextOptions contextOptions, String flatUserAuthority, StoreCtx userStoreCtx, Object userCtxBase) +317279 System.DirectoryServices.AccountManagement.ADStoreCtx.GetGroupsMemberOfAZ(Principal p) +441 System.DirectoryServices.AccountManagement.UserPrincipal.GetAuthorizationGroupsHelper() +78 […]

从WindowsIdentity和Thread.CurrentPrincipal检索WindowsPrincipal有什么区别?

我试图弄清楚为什么基于属性的安全性不能像我在WCF中所期望的那样工作,我怀疑它可能与以下内容有关: AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal); var identity = new WindowsIdentity(“ksarfo”); var principal = new WindowsPrincipal(identity); Console.WriteLine(“\nChecking whether current user [” + identity.Name + “] is member of [” + groupName + “]”); Console.WriteLine(principal.IsInRole(groupName)); // returns true principal = (WindowsPrincipal)Thread.CurrentPrincipal; identity = (WindowsIdentity) principal.Identity; Console.WriteLine(“\nChecking whether current user [” + identity.Name + “] is member of [” + groupName […]

以递归方式获取Active Directory组的成员,即包括子组

在Active Directory中给出这样的组: MainGroup GroupA User1 User2 GroupB User3 User4 我可以轻松确定User3是否是MainGroup或其任何子组的成员,代码如下: using System; using System.DirectoryServices; static class Program { static void Main() { DirectoryEntry user = new DirectoryEntry(“LDAP://CN=User3,DC=X,DC=y”); string filter = “(memberOf:1.2.840.113556.1.4.1941:=CN=MainGroup,DC=X,DC=y”); DirectorySearcher searcher = new DirectorySearcher(user, filter); searcher.SearchScope = SearchScope.Subtree; var r = searcher.FindOne(); bool isMember = (r != null); } } 我想知道是否有类似的方法来获取作为组或其任何子组成员的所有用户,即在MainGroup的示例中获取User1,User2,User3和User4。 获取所有用户的显而易见的方法是递归查询每个子组,但我想知道是否有更简单的方法。 使用与memberOf:1.2.840.113556.1.4.1941: […]

Active Directory搜索的有效分页

在.NET中对Active Directory搜索进行分页的有效方法是什么? 在AD中搜索的方法有很多,但到目前为止我找不到如何有效地进行搜索。 我希望能够指示Skip和Take参数,并能够在结果中检索与我的搜索条件匹配的记录总数。 我尝试过使用PrincipalSearcher类进行搜索: using (var ctx = new PrincipalContext(ContextType.Domain, “FABRIKAM”, “DC=fabrikam,DC=com”)) using (var criteria = new UserPrincipal(ctx)) { criteria.SamAccountName = “*foo*”; using (var searcher = new PrincipalSearcher(criteria)) { ((DirectorySearcher)searcher.GetUnderlyingSearcher()).SizeLimit = 3; var results = searcher.FindAll(); foreach (var found in results) { Console.WriteLine(found.Name); } } } 在这里,我能够将搜索结果限制为3但是我无法获得与我的搜索条件相对应的记录总数( SamAccountName包含foo )我既没有能够向搜索者指示跳过前50条记录例。 我也尝试使用System.DirectoryServices.DirectoryEntry和System.DirectoryServices.Protocols.SearchRequest但我唯一能做的就是指定页面大小。 那么获取客户端上的所有结果并在那里进行跳过和计数的唯一方法是什么? 我真的希望有更有效的方法直接在域控制器上实现这一点。

在开发/测试环境中模拟Active Directory登录

目前正在构建一个WPF应用程序,该应用程序将在用户登录到域(DC)上的Windows PC的环境中运行。 该应用程序将要求用户在启动时再次输入其登录名和密码,并且将针对Active Directoryvalidation登录名/密码(如果我的术语在此处不正确,请原谅我)。 登录是全有或全无的; 如果他们的密码是正确的,那么就没有(当前)关注检索组,权利或任何性质的东西。 开发环境不是基于AD的,并且不在域中。 是否有任何模拟此类登录的选项,而无需完成设置域控制器并向其添加开发和测试环境机器的过程? 在项目过程中将有机会进行部署测试(IOW创建测试登录应用程序,将其部署到用户并确保在最终部署之前登录工作)。 同时,我需要使用一些在test / dev环境中工作的排序实现。 有什么想法吗? 你会建议不要模拟这个而不是设置DC吗?

使用PrincipalContext.ValidateCredentials对本地计算机进行身份validation时出错?

我有一个WCF服务,其中包含一个Login方法,该方法根据本地计算机凭据validation用户名和密码,并且在看似随机的一段时间后,它将停止为某些用户工作。 实际的登录命令如下所示: public UserModel Login(string username, string password, string ipAddress) { // Verify valid parameters if (username == null || password == null) return null; try { using (var pContext = new PrincipalContext(ContextType.Machine)) { // Authenticate against local machine if (pContext.ValidateCredentials(username, password)) { // Authenticate user against database using (var context = new MyEntities(Connections.GetConnectionString())) { […]

c#针对LDAP上的Active Directory

我正在编写一些针对Active Directory的c#,并且无休止地尝试使其工作无济于事。 以下代码有效,其后面的代码不起作用: 下面的代码使用“WinNT://”+ Environment.MachineName +“,Computer”来建立连接并正常工作。 DirectoryEntry localMachine = new DirectoryEntry (“WinNT://” + Environment.MachineName + “,Computer”); DirectoryEntry admGroup = localMachine.Children.Find (“Administrators”, “group”); object members = admGroup.Invoke(“members”, null); foreach (object groupMember in (IEnumerable)members) { DirectoryEntry member = new DirectoryEntry(groupMember); output.RenderBeginTag(“p”); output.Write(member.Name.ToString()); output.RenderBeginTag(“p”); } base.Render(output); 我现在正试图改变这条线: “WinNT://” + Environment.MachineName + “,Computer” 至 “LDAP://MyDomainControllerName” 但似乎无论我尝试什么价值代替价值’MyDomainControllerName’它都不会工作。 要获取’MyDomainControllerName’值,我右键单击MyComputer并按照其他地方的建议复制计算机名称值,但这不起作用。 当我尝试使用上面的LDAP:// RootDSE选项时,会导致以下错误: […]

使用C#快速获取Active Directory中的组成员列表

在Web应用程序中,我们希望显示某个组成员的用户的sam帐户列表。 在很多情况下,组可以有500个或更多成员,我们需要页面响应。 拥有约500名成员的团队需要7-8秒才能获得该组所有成员的sam帐户列表。 有更快的方法吗? 我知道Active Directory管理控制台会在一秒钟内完成它。 我尝试过几种方法: 1) PrincipalContext pcRoot = new PrincipalContext(ContextType.Domain) GroupPrincipal grp = GroupPrincipal.FindByIdentity(pcRoot, “MyGroup”); List lst = grp.Members.Select(g => g.SamAccountName).ToList(); 2) PrincipalContext pcRoot = new PrincipalContext(ContextType.Domain) GroupPrincipal grp = GroupPrincipal.FindByIdentity(pcRoot, “MyGroup”); PrincipalSearchResult lstMembers = grp.GetMembers(true); List lst = new List(); foreach (Principal member in lstMembers ) { if (member.StructuralObjectClass.Equals(“user”)) { lst.Add(member […]

Active Directory中的用户/组权限

我在哪里可以找到执行以下操作的示例? 从Active Directory中提取用户。 获取用户所属的组。 获取分配给每个组的权限列表。 这似乎是一个简单的任务,但我找不到解决方案。 总体目标是分配自定义权限并使用它们来控制应用程序中的权限。