Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Active Directory: letzten LogIn feststellen
turndevil
myCSharp.de - Member



Dabei seit:
Beiträge: 41

Themenstarter:

Active Directory: letzten LogIn feststellen

beantworten | zitieren | melden

Hallo Leute.

Mein Anliegen kurz gefasst: Kann man aus einem Computerkonto im AD auslesen, wann sich das letzte Mal jemand eingeloggt hat? Oder wann dieser PC das letzte Mal online war?

Ich würde gerne das AD in der Firma, wo ich arbeite, ausmisten und Computer rausschmeissen, die nicht mehr vorhanden sind aber nicht ausgetragen wurden. Dazu würde ich gern auslesen, wann dieser PC das letzte Maonline war bzw wann sich das letzte Mal jemand an diesem PC eingeloggt hat.

Eine andere Möglichkeit wäre doch zB auch per Startscript eine Datei lokal im %TEMP% zu erzeugen, in der einfach das aktuelle Datum + Uhrzeit eingetragen wird. Die kann man ja dann auch auslesen. Oder beim Start ne Datei auf nem Server beschreiben? Naja jetz steh ich halt vor der Wahl.

Was meint ihr ist das beste? Und wäre das auch per AD möglich? Wenn ja, wie?
Schon mal Danke für die Tipps im Voraus.

mfg
tom
private Nachricht | Beiträge des Benutzers
turndevil
myCSharp.de - Member



Dabei seit:
Beiträge: 41

Themenstarter:

beantworten | zitieren | melden

hallo leute ich bins nochmal.

lange hats gedauert, aber nun hab ich rausgefunden wie ich das oben genannte per AD realisieren könnte.
nimmt man ein beliebiges DirectoryEntry objekt, so kann man doch dessen PropertiesCollection abrufen. wenn ich jetz aus dieser collection die collection PropertyNames abrufe, bekomme ich unter anderem einen feldnamen "lastLogon" bzw "lastLogonTimestamp".
jetzt habe ich folgendes problem. wenn ich mir nun per Value den inhalt dieses feldes anzeigen lassen will, gibt er mir an der konosle nur "System._COMObject" aus anstatt irgenne zeit oder ein datum.
könnt ihr mir da weiterhelfen? muss ich diesen "Value" noch irgendwie konvertieren oder ein anderes objekt draus machen?

vielleicht hat ja jetz jemand zeit oder lust mir da ein wenig unter die arme zu greifen. vielen dank im voraus.

mfg
tom
private Nachricht | Beiträge des Benutzers
CyberSAP
myCSharp.de - Member

Avatar #avatar-1630.jpg


Dabei seit:
Beiträge: 40

beantworten | zitieren | melden

Hallo!

Ist System._COMObject das Ergebnis, wenn du von Value[0] die ToString()-Methode aufrufst?

DirectoryEntry root = new DirectoryEntry("LDAP://localhost:389/");
string filter = "(objectClass=user)";
DirectorySearcher searcher = new DirectorySearcher(root, filter, null, SearchScope.Subtree);
SearchResult result = searcher.FindOne();
Console.WriteLine(result.Properties["lastLogonTimestamp"][0].ToString());

Weil laut Dokumentation müsste es eine Zahl mit 64 bit sein, die die Zeit in 100 ms seit 1.1.1601 angibt.
Hast du schon mal versucht das Object einfach mit Convert.ToInt() zu konvertieren? Evtl. solltest du vorher value[0] nach Object casten.

Wenn ich das richtig sehe müsst man zu dieser Zeit dann 1600 Jahre in 100ms-Schritten dazu addieren und kann diese dann gut in DateTime benutzen, da DateTime in 100ms seit 1.1.0001 rechnet.

Ansonsten könnte dir dieser Artikel evtl. weiterhelfen. In dem Artikel ist auch beschrieben wie man mit NativeObjects der LDAP COM Schnittstelle umzugehen hat.

Leider habe ich hier nur ADAM unter WinXP laufen, sodass ich hier keine vernünftige Test machen kann was User betrifft.

Gruß,
CyberSAP
private Nachricht | Beiträge des Benutzers
turndevil
myCSharp.de - Member



Dabei seit:
Beiträge: 41

Themenstarter:

beantworten | zitieren | melden

hallo.

danke für den tip mit Convert.ToInt(). ich glaube das ist die lösung. ich kann zwar jetz nicht probieren obs geht, da ich nicht in der arbeit bin, aber es hört sich schlüssig an. vor allem, weil du anscheinend die doku genauer gelesen hast als ich. =)

danke für deine mühen.

mfg
tom
private Nachricht | Beiträge des Benutzers
elron
myCSharp.de - Member



Dabei seit:
Beiträge: 171
Herkunft: Berlin

beantworten | zitieren | melden


public static IADsUser GetUserProfile(string UserName)
            {
                string ldapPath = ConfigurationManager.AppSettings["LDAP_RootPath"];
                DirectoryEntry de = new DirectoryEntry(ldapPath);

                de.Username = ConfigurationManager.AppSettings["UserName"];
                de.Password = ConfigurationManager.AppSettings["UserPassword"];

                DirectoryEntry resultEntry;
                DirectorySearcher searcher;
                SearchResultCollection searchResults;

                searcher = new DirectorySearcher(de, "(&(objectClass=user)(SAMAccountName=" + UserName + "))");
                searcher.SearchScope = SearchScope.Subtree;
                searchResults = searcher.FindAll();

                IADsUser AD_User = null;

                if (searchResults.Count != 0)
                {
                    resultEntry = searchResults[0].GetDirectoryEntry();
                    AD_User = (IADsUser)resultEntry.NativeObject;
                }
                return AD_User;
            }


schau dir mal das Com object an "IADsUser" hat alle infos die du haben willst!

de.Username = ConfigurationManager.AppSettings["UserName"];
de.Password = ConfigurationManager.AppSettings["UserPassword"];

äquivalent zu

de.Username = "Username";
de.Password = "Password";


Gruß
Elron
private Nachricht | Beiträge des Benutzers