Csharp/C#教程:如何以编程方式找出上次登录机器的时间?分享


如何以编程方式找出上次登录机器的时间?

我想a)以编程方式和b)远程查找用户成功登录Windows机器的最后日期/时间(通过远程桌面或控制台)。 我愿意采用任何典型的Windows语言(C,C#,VB,批处理文件,JScript等),但任何解决方案都会很好。

试试这个:

public static DateTime? GetLastLogin(string domainName,string userName) { PrincipalContext c = new PrincipalContext(ContextType.Domain,domainName); UserPrincipal uc = UserPrincipal.FindByIdentity(c, userName); return uc.LastLogon; } 

您将需要添加使用System.DirectoryServices和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; } 

您可以使用DirectoryServices在C#中执行此操作:

 using System.DirectoryServices; DirectoryEntry dirs = new DirectoryEntry("WinNT://" + Environment.MachineName); foreach (DirectoryEntry de in dirs.Children) { if (de.SchemaClassName == "User") { Console.WriteLine(de.Name); if (de.Properties["lastlogin"].Value != null) { Console.WriteLine(de.Properties["lastlogin"].Value.ToString()); } if (de.Properties["lastlogoff"].Value != null) { Console.WriteLine(de.Properties["lastlogoff"].Value.ToString()); } } } 

你也可以使用CMD

 C:WindowsSystem32>query user /server: 

或(更短)

 C:WindowsSystem32>quser /server: 

输出将是这样的:

 USERNAME SESSIONNAME ID STATE LOGONTIME userXYZ console 1 Active 19.01.2017 08:59 

经过大量的研究,我设法将一个很好的PowerShell脚本放在一起,该脚本接收一个计算机名称并列出帐户和特定计算机上的ACTUAL上次登录。 …从未明确编写此function的MICROSOFT,它试图从活动目录中获取登录信息并在本地存储,因此您已经使用登录到其他机器并且它将更新您机器上的登录日期,但它们永远不会记录进入您的机器….完成失败!

 $REMOTEMACHINE = "LoCaLhOsT" $NetLogs = Get-WmiObject Win32_NetworkLoginProfile -ComputerName $REMOTEMACHINE foreach ($NetLog in $NetLogs) { if($NetLog.LastLogon) { $LastLogon = [Management.ManagementDateTimeConverter]::ToDateTime($NetLog.LastLogon) if($LastLogon -ne [DateTime]::MinValue) { Write-Host $NetLog.Name ' - ' $LastLogon } } } 

注意:根据我的收集,Win32_NetworkLoginProfile使用“Win32API |网络管理结构| USER_INFO_3”结构。 因此,如果您想避免使用WMI,那么C#等价物将是pInvoke [NetUserEnum],其级别指定缓冲区中返回的结构。

有趣的事实:DateTime作为Int32通过USER_INFO_3结构返回,所以当它是2038年时,一旦发生整数溢出,日期将不再正确…. #UnixMillenniumBug

我最终在C#中使用pInvoke for“RegQueryInfoKey”来检索位于“HKLM SOFTWARE Microsoft Windows NT CurrentVersion ProfileList”下的每个配置文件的注册表项上的LastWriteTime

https://stackoverflow.com/a/45176943/7354452

上述就是C#学习教程:如何以编程方式找出上次登录机器的时间?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1007957.html

(0)
上一篇 2021年12月29日
下一篇 2021年12月29日

精彩推荐