3 Stimmen

Wie kann man alle Computer und das letzte Mal, als sie in AD angemeldet waren, auflisten?

Ich versuche, eine Liste von Computernamen und das Datum, an dem sie zuletzt angemeldet wurden, aus Active Directory abzurufen und in einer Datentabelle zurückzugeben. Die Namen zu erhalten ist einfach genug, aber wenn ich versuche, die "lastLogon" oder "lastLogonTimestamp" wie unten gezeigt, die einzigen Werte, die ich für die lastLogonTimestamp erhalten ist "System._ComObject" hinzuzufügen

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;
}

Wenn ich AD mit einem Tool wie LDP abfrage, kann ich sehen, dass die Eigenschaft existiert und mit Daten gefüllt ist. Wie kann ich an diese Informationen gelangen?

11voto

Jacob Proffitt Punkte 12454

Es wäre einfacher, die Klasse ComputerPrincipal und einen PrincipalSearcher aus System.DirectoryServices.AccountManagement zu verwenden.

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

6voto

Gene Black Punkte 121

**Die Eigenschaft 'lastLogonTimestamp', die von einem DirectoryEntry abgerufen wird, ist in IADSLargeInteger umzuwandeln

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

Das für diese Typen zurückgegebene __ComObject ist IADsLargeInteger für die numerische Werte und IADsSecurityDescriptor für SecurityDescriptors.

Sie können auf der Registerkarte COM einen Verweis auf Active DS Type Lib einfügen und erhalten die Definition für diese Schnittstellen abrufen oder sie manuell definieren. Hier ist ein Beispiel:

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 Microsoft Entwickler-Support

3voto

Shay Erlichmen Punkte 31367

Versuchen Sie es mit IADsLargeInteger ( Quelle )

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);
}

1voto

Gene Black Punkte 121

Eine einfache Antwort auf die ursprüngliche Frage ist der Zugriff auf die Immobilie in Ihrem Suchergebnis:

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

DateTime.FromFileTimeUTC(long.Parse(sr.Properties["lastLogonTimestamp"][0].ToString())) um einen Datumswert zu erhalten

Ich habe ein ähnliches Problem, ich kann auf die lastLogonTimestamp Eigenschaft in der SearchResult und erhalten einen Wert im indizierten Ergebnis, aber nach der Verwendung von SearchResult.GetDirectoryEntry() Ich kann nicht auf ein gültiges Ergebnis für die lastLogonTimestamp Eigenschaft auf der DirectoryEntry .

Hat noch jemand dieses Problem mit dem DirectoryEntry zurückgegeben von SearchResult.GetDirectoryEntry() in Bezug auf den Zugang zum lastLogonTimestamp Eigentum?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X