// agrega una referencia a System.Management.dll al proyecto.
usar sistema;
usar System.Collections;
usar System.Management;
usar System.Text.RegularExpressions;
usar System.Collections.Generic;
namespace CSharp.CodeSnippet.WMI
{
clase pública Win32_LogonSession
{
secuencia pública AuthenticationPackage;
secuencia pública LogonID;
LogonEventType público LogonType;
nombre público de la secuencia;
StartTime DateTime público;
enum público LogonEventType
{
Sistema = 0,
Interactivo,
Red,
Hornada,
Servicio,
Poder,
Abrir,
NetworkClearText,
NewCredentials,
RemoteInteractive,
CachedInteractive,
CachedRemoteInteractive,
CachedUnlock
}
lista estática pública GetList ()
{
la pregunta de la secuencia = “selecciona * de Win32_LogonSession”;
Investigador de ManagementObjectSearcher = nuevo ManagementObjectSearcher (pregunta);
ManagementObjectCollection resulta = investigador. Conseguir ();
Enumerar la lista = nueva lista (resultados. Cuenta);
Diccionario userTable = GetLoggedOnUsersTable ();
foreach (ManagementObject logonCurrent en resultados)
{
Entrada de Win32_LogonSession = nuevo Win32_LogonSession ();
entry.AuthenticationPackage = (secuencia) logonCurrent [“AuthenticationPackage”];
entry.LogonID = (secuencia) logonCurrent [“LogonID”];
entry.LogonType = (LogonEventType) Convert.ToInt32 (logonCurrent [“LogonType”]);
entry.StartTime = ConvertFileTime ((secuencia) logonCurrent [“StartTime”]);
si (userTable.ContainsKey (entry.LogonID))
{
entrada. Nombre = (secuencia) userTable [entry.LogonID];
}
lista. Agregar (entrada);
}
devolver la lista;
}
diccionario estático privado GetLoggedOnUsersTable ()
{
la pregunta de la secuencia = “selecciona * de Win32_LoggedOnUser”;
Investigador de ManagementObjectSearcher = nuevo ManagementObjectSearcher (pregunta);
ManagementObjectCollection resulta = investigador. Conseguir ();
Tabla del diccionario = nuevo diccionario (resultados. Cuenta);
foreach (currentObject de ManagementObject en resultados)
{
encadenar la cuenta = GetUser (currentObject (de la secuencia) [“antecedente”]);
encadenar la sesión = GetLogonID (currentObject (de la secuencia) [“dependiente”]);
tabla. Agregar (sesión, cuenta);
}
volver la tabla;
}
secuencia estática privada GetLogonID (propertyText de la secuencia)
{
¿encadenar el patrón = “LogonId= \” (? ) \ "" \ \ d+;
matchID del fósforo = Regex.Match (propertyText, patrón);
si (matchID.Success)
{
matchID.Groups de vuelta [“identificación”]. Valor;
}
{
"" de vuelta;
}
}
secuencia estática privada GetUser (propertyText de la secuencia)
{
¿encadenar el patrón = “Domain= \” (? [\ \ D_- de A-Za-z] +) \ “|¿Name= \” (? [\ \ S_- \ \ d de A-Za-z] +) \ "";
dominio = "" de la secuencia;
nombre = "" de la secuencia;
foreach (fósforo matchCurrent en Regex.Matches (propertyText, patrón))
{
texto completo de la secuencia = matchCurrent.Groups [0]. Valor;
si (fullText.StartsWith (“dominio”))
{
dominio = matchCurrent.Groups [“dominio”]. Valor;
}
{
nombre = matchCurrent.Groups [“nombre”]. Valor;
}
}
si (dominio. == 0 de la longitud)
{
nombre de vuelta;
}
{
dominio de vuelta + “\ \” + nombre;
}
}
ConvertFileTime DateTime estático privado (tiempo de la secuencia)
{
¡si (tiempo! = falta de información)
{
secuencia del const FILE_TIME_MASK = “yyyyMMddHHmmss”;
tiempo = tiempo. Subsecuencia (0, time.IndexOf (“."));
DateTime.ParseExact de vuelta (tiempo, FILE_TIME_MASK, falta de información);
}
DateTime.MinValue de vuelta;
}
}
}
|