2 votes

A partir de WindowsService, comment puis-je trouver l'utilisateur actuellement connecté en C# ?

J'exécute le service Windows sous un compte Administrateur et je voudrais savoir qui est l'utilisateur actuellement connecté. Il sera différent du compte sous lequel le service Windows est actuellement exécuté. Existe-t-il un moyen simple de l'obtenir à partir de C# ?

Il ne l'est pas : System.Security.Principal.WindowsIdentity.GetCurrent() ni System.Environment.UserName

merci

modifier

Je suis intéressé par les personnes qui sont actuellement connectées avec la session Console. merci jadarnel27

Je ne suis pas intéressé par d'autres sessions à distance puisque ce n'est pas mon cas.

6voto

Dmitry Points 10118

1) Cassia devrait pouvoir vous donner une liste des utilisateurs actuellement connectés, y compris RDC.

foreach (ITerminalServicesSession sess in new TerminalServicesManager().GetSessions())
{
    // sess.SessionId
    // sess.UserName
}

2) WMI (SO réponse )

Select * from Win32_LogonSession

3) PInvoke à WTSEnumerateSessions

4) Enumérer toutes les instances de "explorer.exe" et obtenir le propriétaire en utilisant PInvoke ( OpenProcessHandle ).

Process[] processes = Process.GetProcessesByName("explorer");

C'est un peu compliqué. WMI peut également être utilisé à cette fin.

Ce serait une bonne idée de définir winmgmt en tant que dépendance pour votre service si vous avez décidé d'opter pour une solution qui utilise WMI.

2voto

Damien_The_Unbeliever Points 102139

Vous pouvez consulter Cassia :

Cassia est une bibliothèque .NET permettant d'accéder à l'API native de Windows Terminal Services (désormais appelée Remote Desktop Services API). Elle peut être utilisée depuis C#, Visual Basic.NET ou tout autre langage .NET.

et :

L'énumération des sessions de terminal et le rapport des informations de session, y compris l'état de la connexion, le nom d'utilisateur, le nom du client, les détails de l'affichage du client ...

0voto

Kratz Points 2895

Essayez ça,

http://www.codeproject.com/KB/vb/Windows_Service.aspx

Idée assez simple, il suffit de parcourir les processus actifs pour trouver 'explorer.exe' et de lister l'utilisateur sous lequel il s'exécute. Vous devrez peut-être l'ajuster si vous avez plusieurs utilisateurs.

0voto

LastCoder Points 10027

Utilisation de l'autorité de sécurité locale pour énumérer les sessions d'utilisateur dans .NET http://www.codeproject.com/KB/system/LSAEnumUserSessions.aspx

Fonction WTSQuerySessionInformation http://msdn.microsoft.com/en-us/library/aa383838%28v=vs.85%29.aspx

0voto

Tim Lloyd Points 23571

Une liste des utilisateurs actuellement connectés aux sessions de la console peut être récupérée via WMI. Vous devrez ajouter une référence à System.Management.dll :

public static List<string> GetLoggedOnUsers(CacheLevel level)
{
    const int ConsoleSession = 2;

    string logonQuery = "SELECT * FROM Win32_LogonSession WHERE LogonType = " + ConsoleSession;

    ManagementObjectSearcher searcher = new ManagementObjectSearcher(logonQuery);

    List<string> userNames = new List<string>();

    foreach (ManagementBaseObject logon in searcher.Get())
    {
        string logonId = logon.Properties["LogonId"].Value.ToString();

        string userQuery = "ASSOCIATORS OF {Win32_LogonSession.LogonId=" + logonId + "} "
                           + "WHERE AssocClass=Win32_LoggedOnUser Role=Dependent";

        ManagementObjectSearcher searcher2 = new ManagementObjectSearcher(userQuery);

        foreach (ManagementBaseObject user in searcher2.Get())
        {
            string name = user.Properties["FullName"].Value.ToString();

            userNames.Add(name);
        }
    }

    return userNames.Distinct().ToList();
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X