C# 如何获取Windows用户';什么时候登录?

C# 如何获取Windows用户';什么时候登录?,c#,.net,asp.net-mvc,visual-studio,asp.net-web-api,C#,.net,Asp.net Mvc,Visual Studio,Asp.net Web Api,在C#中是否有方法获取当前用户登录的时间 命令提示符中名为quser的命令将列出有关当前用户的一些基本信息,包括登录时间 是否有一个系统属性或一些我可以在c#中访问的东西,我可以从中获取用户的登录时间 我正在通过Environment.username属性获取用户名。需要登录时间 我试过这个: using System.DirectoryServices; using System.DirectoryServices.AccountManagement; Console.WriteLine("

在C#中是否有方法获取当前用户登录的时间

命令提示符中名为quser的命令将列出有关当前用户的一些基本信息,包括登录时间

是否有一个系统属性或一些我可以在c#中访问的东西,我可以从中获取用户的登录时间

我正在通过Environment.username属性获取用户名。需要登录时间

我试过这个:

using System.DirectoryServices;
using System.DirectoryServices.AccountManagement;

Console.WriteLine("Login Time: {0}",GetLastLoginToMachine(Environment .MachineName , Environment.UserName));
public static DateTime? GetLastLoginToMachine(string machineName, string userName)
{
    PrincipalContext c = new PrincipalContext(ContextType.Machine, machineName);
    UserPrincipal uc = UserPrincipal.FindByIdentity(c, userName);
    return uc.LastLogon;
}
出现以下错误:


您可以从以下命名空间获取LastUserLogon时间

using System.DirectoryServices.AccountManagement;
试一试

您还可以获得帐户信息:

string userName = WindowsIdentity.GetCurrent().Name.Split('\\')[1];
string machineName = WindowsIdentity.GetCurrent().Name.Split('\\')[0];

确保包含对
系统.DirectoryServices.AccountManagement
的引用:

然后,您可以执行此操作以获取上次登录时间:

using System.DirectoryServices.AccountManagement;

public static DateTime? GetLastLoginToMachine(string machineName, string userName)
{
    PrincipalContext c = new PrincipalContext(ContextType.Machine, machineName);
    UserPrincipal uc = UserPrincipal.FindByIdentity(c, userName);
    return uc.LastLogon;
}
您可以查询WMI:

//使用系统管理;
私有静态字典getMachineLogonName(字符串机器)
{
var loggedOnUsers=new Dictionary();
ManagementScope=新的ManagementScope(String.Format(@“\\{0}\root\cimv2”,machine));
SelectQuery会话查询=新建SelectQuery(“Win32_LogonSession”);
使用(ManagementObjectSearcher会话搜索器=新的ManagementObjectSearcher(范围,会话查询))
使用(ManagementObjectCollection sessionMOs=sessionSearcher.Get())
{
foreach(sessionMOs中的var sessionMO)
{
//互动会议
if((UInt32)sessionMO.Properties[“LogonType”].Value==2)
{
var logonId=(字符串)sessionMO.Properties[“logonId”].Value;
var startTimeString=(string)sessionMO.Properties[“StartTime”].Value;
var startTime=DateTime.ParseExact(startTimeString.Substring(0,21),“yyyyMMddHHmmss.ffffffff”,System.Globalization.CultureInfo.InvariantCulture);
WqlObjectQuery userQuery=新的WqlObjectQuery(@“关联{Win32_LogonSession.LogonId='“+LogonId+@”}其中AssocClass=Win32_LoggedOnUser”);
使用(var userSearcher=newmanagementobjectsearcher(范围,用户查询))
使用(var userMOs=userSearcher.Get())
{
var username=userMOs.OfType();
如果(!loggedOnUsers.ContainsKey(用户名))
{
添加(用户名,开始时间);
}
else if(loggedOnUsers[username]>startTime)
{
loggedOnUsers[用户名]=开始时间;
}
}
}
}
}
返回loggedon用户;
}
然后只需使用目标计算机名调用该方法:

var logins=getMachineLogonName(“.”);

@Nicholas使用System.DirectoryServices;命名空间“System”中不存在类型或命名空间名称“DirectoryServices”(是否缺少程序集引用?)再次提出此问题,因为该版本太旧。是否已将对System.DirectoryServices的引用添加到项目中?@DanielHollinrake我已添加DirectoryServices,但出现错误,即命名空间“System”中不存在DirectoryServices。您在项目属性中选择了哪个.Net版本?如果您使用的是“客户端”版本的库,您可能会遇到一些问题-在这种情况下,请尝试将您的项目切换到“完整”框架。谢谢。在解决方案资源管理器System.DirectoryServices中添加了一个引用。@Quetzalcatl对他放松点,伙计。这对他来说可能是显而易见的。当然,这是一个刻苦的教训@丹尼尔·霍林瑞克:你说得对。。过了一段时间,我现在重读它,可能太苛刻了,根本没有必要。谢谢@DanielHollinrake学习任何新东西都不会让人尴尬。我很高兴你们抽出时间来解决我的问题。有可能获得windows密码吗?“我想那将是一个安全问题。”库哈兰布霍米克,那将是一个严重的安全问题。有一些方法可以更改密码,但不能检索密码。
using System.DirectoryServices.AccountManagement;

public static DateTime? GetLastLoginToMachine(string machineName, string userName)
{
    PrincipalContext c = new PrincipalContext(ContextType.Machine, machineName);
    UserPrincipal uc = UserPrincipal.FindByIdentity(c, userName);
    return uc.LastLogon;
}