Abmeldung interaktive Benutzer in Windows, die von einem Dienst

Ich versuche, herauszufinden, einen Weg, um Benutzer Abmelden im lokalen Windows-Sitzung von einem Windows-Dienst in C# geschrieben.

Hier ist der hintergrund für das problem:
Ich brauche zum verwalten der computer-Nutzung die Zeit von einem Benutzer; wenn Ihre Redezeit abläuft, möchte ich Sie Abmelden zu können. Dies ist im Rahmen einer W2K8-Domäne. Leider sind die login-Zeit-Steuerelemente in Windows einfach trennen Sie die Benutzer von server-Ressourcen; es gibt keine Weise zu zwingen, Ihre Sitzungen zu beenden, über diese Methode.

Mein Ansatz ist der Aufbau eines Windows-Dienst, den ich für die Bereitstellung in der gesamten Domäne; der Dienst wird auf jedem Clientcomputer ausgeführt. In regelmäßigen Abständen wird der Dienst auflisten angemeldeten Benutzer auf dem computer rufen Sie eine Datenbank hinzufügen, die protokolliert-in der Zeit seit dem letzten Aufruf der insgesamt für den Tag, und wenn Sie erreicht haben Ihre maximale, melden Sie sich (mit einer fünf-Minuten-Warnung). Hinweis - diese sind NICHT terminal services-Sitzungen, Sie sind regelmäßig interaktive Anmeldungen. Beachten Sie auch, dass es möglicherweise mehrere Anmeldungen auf einer Maschine durch die "switch user" Funktion in Win7 & Vista. Alle meine client-PCs läuft Win7. Der Windows-Dienst wird als Lokales System ausgeführt wird, also Rechte sollten kein problem sein.

Kann ich erfolgreich konstruieren Sie eine Liste der angemeldeten Benutzer auf dem Computer durch Benutzernamen mit WMI. Hier ist ein Ausschnitt des Codes:


        List<string> loggedInUsers = new List<string>();
        ManagementClass mc = new ManagementClass("Win32_Process");
        ManagementObjectCollection moc = mc.GetInstances();

        foreach (ManagementObject mo in moc)
        {
            ROOT.CIMV2.Process process = new ROOT.CIMV2.Process(mo);
            string domain, user;
            uint pid;
            process.GetOwner(out domain, out user);
            pid = process.ProcessId;
            if (process.Name.Trim().ToLower() == "explorer.exe")
                loggedInUsers.Add(user);
        }
        return loggedInUsers;

Aber ich bin kämpfen, um zu finden, eine Methode, die es mir ermöglichen, Abmeldung von einem ausgewählten Benutzer die Sitzung. Ich weiß, ich kann Herunterfahren der Maschine, aber ich will nicht, dass - das tötet alle Benutzer-sessions.

Irgendwelche Ideen, jedermann? Vielen Dank für das Lesen dieser langatmigen post!

Klingt wie Sie möglicherweise benötigen, und töten, jede Benutzer-Fenster-Bahnhof: msdn.microsoft.com/en-us/library/ms681928(v=VS.85).aspx -- und haben Sie vielleicht zu tun, dass über die Win32-Aufrufe. Was Sie tun können .NETZ, aber es ist ein Aufwand.
Mit WMI können Sie zum Abmelden der aktiven Konsolensitzung (über Win32Shutdown), aber ich glaube nicht, dass es funktioniert mit mehreren Benutzern.
vielen Dank für die Anregung, ich habe gelernt über Fenster-Stationen aus den folgenden auf. Von was ich sehen kann, obwohl (und ich könnte falsch sein) es sieht aus wie es nur funktionieren wird, wenn ausgeführt, in der Sitzung des Benutzers. Ich glaube nicht, dass ich töten kann Ihre Arbeitsstation von einer anderen Sitzung.
vielen Dank für Ihren Vorschlag. Wenn alle Stricke reißen kann ich zurückgreifen, um diesen Ansatz, und lediglich mit den getrennten Sitzungen, wenn/falls Sie wieder aktiv werden.

InformationsquelleAutor multiSingularity | 2011-03-05

Schreibe einen Kommentar