如何通过DirectoryServices获取AD组成员的TimeToLive属性?
获取AD临时组成员的TimeToLive属性
要获取AD组中临时成员的TTL(剩余停留时间),不能通过DirectoryEntry.Invoke("members")方法实现——该方法仅返回成员对象,不会携带TTL信息。正确的方式是通过LDAP查询的member;showttl属性获取带TTL的成员列表,具体实现如下:
代码实现
DirectoryEntry dc = new DirectoryEntry(); DirectorySearcher searcher = new DirectorySearcher(dc); // 过滤目标AD组 searcher.Filter = "(&(objectCategory=group)(cn=UG_TS_CISCO))"; // 指定加载带TTL信息的成员属性 searcher.PropertiesToLoad.Add("member;showttl"); foreach (SearchResult src in searcher.FindAll()) { if (!src.Properties.Contains("member;showttl")) continue; foreach (var memberWithTtlObj in src.Properties["member;showttl"]) { string memberWithTtl = memberWithTtlObj.ToString(); // 解析TTL秒数 int ttlTagStart = memberWithTtl.IndexOf("<TTL=") + 5; int ttlTagEnd = memberWithTtl.IndexOf(">"); if (ttlTagStart < 5 || ttlTagEnd <= ttlTagStart) continue; if (long.TryParse(memberWithTtl.Substring(ttlTagStart, ttlTagEnd - ttlTagStart), out long ttlSeconds)) { // 计算成员离开时间(当前时间+TTL秒数) DateTime leaveTime = DateTime.Now.AddSeconds(ttlSeconds); // 解析成员的LDAP路径并获取用户信息 string memberDn = memberWithTtl.Substring(ttlTagEnd + 1); using (DirectoryEntry memberEntry = new DirectoryEntry($"LDAP://{memberDn}")) { string userName = memberEntry.Properties["name"].Value?.ToString() ?? "未知"; string samAccount = memberEntry.Properties["sAMAccountName"].Value?.ToString() ?? "未知"; // 添加到DataGridView dataGridView.Rows.Add(userName, samAccount, leaveTime.ToString("yyyy-MM-dd HH:mm:ss")); } } } }
关键说明
member;showttl是AD专属的特殊属性修饰符,仅在Windows Server 2012及以上版本的AD环境中可用,用于返回带TTL的临时成员列表。- TTL值以秒为单位,需转换为具体的离开时间展示;若需保证时间准确性,可改用AD服务器时间而非本地时间。
- 代码中增加了格式校验和异常判断,避免因字符串格式异常导致程序崩溃。
- 使用
using包裹DirectoryEntry,确保AD连接资源及时释放。
内容的提问来源于stack exchange,提问作者madv1k
相关产品推荐
相关产品推荐

