如何列出所有计算机以及他们最后一次登录AD?

我正在尝试检索计算机名称列表以及它们上次从Active Directory登录的日期,并将它们返回到数据表中。 获取名称很容易但是当我尝试添加“lastLogon”或“lastLogonTimestamp”时,如下所示,我为lastLogonTimestamp获取的唯一值是“System._ComObject”

public DataTable GetListOfComputers(string domainName) { DirectoryEntry entry = new DirectoryEntry("LDAP://DC=" + domainName + ",DC=com"); DirectorySearcher search = new DirectorySearcher(entry); string query = "(objectclass=computer)"; search.Filter = query; search.PropertiesToLoad.Add("name"); search.PropertiesToLoad.Add("lastLogonTimestamp"); SearchResultCollection mySearchResultColl = search.FindAll(); DataTable results = new DataTable(); results.Columns.Add("name"); results.Columns.Add("lastLogonTimestamp"); foreach (SearchResult sr in mySearchResultColl) { DataRow dr = results.NewRow(); DirectoryEntry de = sr.GetDirectoryEntry(); dr["name"] = de.Properties["Name"].Value; dr["lastLogonTimestamp"] = de.Properties["lastLogonTimestamp"].Value; results.Rows.Add(dr); de.Close(); } return results; } 

如果我使用像LDP这样的工具查询AD,我可以看到该属性存在并填充了数据。 我怎样才能获得这些信息?

使用ComputerPrincipal类和System.DirectoryServices.AccountManagement中的PrincipalSearcher会更容易。

 PrincipalContext pc = new PrincipalContext(ContextType.Domain, domainName); PrincipalSearcher ps = new PrincipalSearcher(new ComputerPrincipal(pc)); PrincipalSearchResult psr = ps.FindAll(); foreach (ComputerPrincipal cp in psr) { DataRow dr = results.NewRow(); dr["name"] = cp.Name; dr["lastLogonTimestamp"] = cp.LastLogon; results.Rows.Add(dr); } 

**处理从DirectoryEntry检索到的属性“lastLogonTimestamp”的方法是将其转换为IADSLargeInteger

来自: http : //www.dotnet247.com/247reference/msgs/31/159934.aspx **

为这些类型返回的__ComObject是数值的IADsLargeInteger和SecurityDescriptors的IADsSecurityDescriptor。

您可以在COM选项卡上包含对Active DS Type Lib的引用,并获取这些接口的定义或手动定义它们。 这是一个示例:

 using System; using System.DirectoryServices; using System.Runtime.InteropServices; //This is the managed definition of this interface also found in ActiveDs.tlb [ComImport] [Guid("9068270B-0939-11D1-8BE1-00C04FD8D503")] [InterfaceType(ComInterfaceType.InterfaceIsDual)] internal interface IADsLargeInteger { [DispId(0x00000002)] int HighPart{get; set;} [DispId(0x00000003)] int LowPart{get; set;} } class Class1 { [STAThread] static void Main(string[] args) { DirectoryEntry entry = new DirectoryEntry("LDAP://cn=user,cn=users,dc=domain,dc=com"); if(entry.Properties.Contains("lastLogon")) { IADsLargeInteger li = (IADsLargeInteger)entry.Properties["lastLogon"][0]; long date = (long)li.HighPart << 32 | (uint)li.LowPart; DateTime time = DateTime.FromFileTime(date); Console.WriteLine("Last logged on at: {0}", time); } } } 

David Stucki微软开发人员支持

尝试使用IADsLargeInteger ( 来源 )

 DirectoryEntry user = DirectoryEntry("LDAP://" + strDN); if (user.Properties.Contains("lastlogontimestamp")) { // lastlogontimestamp is a IADsLargeInteger IADsLargeInteger li = (IADsLargeInteger) user.Properties["lastlogontimestamp"][0]; long lastlogonts = (long)li.HighPart << 32 | (uint)li.LowPart; user.Close(); return DateTime.FromFileTime(lastlogonts); } 

对原始问题的简单回答是访问搜索结果中的属性:

 sr.Properties["lastLogonTimestamp"][0].ToString() 

DateTime.FromFileTimeUTC(long.Parse(sr.Properties["lastLogonTimestamp"][0].ToString()))获取日期时间值

我有一个类似的问题,我可以访问SearchResultlastLogonTimestamp属性并获取索引结果中的值,但在使用SearchResult.GetDirectoryEntry()我无法访问DirectoryEntrylastLogonTimestamp属性的有效结果。

有没有其他人使用SearchResult.GetDirectoryEntry()返回的DirectoryEntry遇到此问题,因为它与访问lastLogonTimestamp属性有关?