如何跟踪 AD 用户上次 accessed/mapped 共享文件夹的日期和时间

How to track the date and time when AD users last accessed/mapped a shared folder

我正在尝试获取 Windows 服务器中定义的所有用户的列表,以及上次登录服务器或 mapped/accessed 文件共享的日期时间。 为此,我尝试了以下脚本:

Get-ADUser -Filter * -SearchBase "dc=whatever,dc=local" -ResultPageSize 0 -Prop CN,samaccountname,LastLogonTimestamp | Select CN,samaccountname,@{N='Last‌Logon'; E={[DateTime]::FromFileTime($_.LastLogonTimestamp)}}

这为我提供了以下输出:

CN                             samaccountname                Last‌Logon                  
--                             --------------                -----------                  
Administrador                  Administrador                 08/02/2019 17:30:00          
Invitado                       Invitado                      01/01/1601 1:00:00           
krbtgt                         krbtgt                        01/01/1601 1:00:00           
Maite                          maite                         01/01/1601 1:00:00           
Mari Carmen                    mcarmen                       01/01/1601 1:00:00           
Emilio                         emilio                        01/01/1601 1:00:00           
Erica                          erica                         01/01/1601 1:00:00 

我知道除了 Administrator 之外的其他用户访问了服务器文件共享(其中一些用户每天将它们映射为驱动器),但是列表中获得的唯一有效登录日期是 Adminstrator。

这个命令似乎只在用户通过 RDP 或控制台实际登录服务器时才报告。

每次用户访问任何服务器共享时,我如何获得类似的查询来报告?

您的文件共享访问创建了一个网络登录(登录类型 3),它不影响 LastLogon 属性(和 LastLogonTimestamp 分别)。在这种情况下,您必须从记录所有登录的域控制器事件日志中获取信息。以下脚本将输出任何用户的最后登录日期,其登录类型为最近 24 小时。

#86400000 = 24h
$FilterXPath = '*[System[EventID=4624 and TimeCreated[timediff(@SystemTime) <= 86400000]]]' 
$LogonEvents = Get-WinEvent -LogName Security -FilterXPath $FilterXPath

$Logons = foreach ($LogonEvent in $LogonEvents) {
    [PSCustomObject]@{
        LogonDate = $LogonEvent.TimeCreated
        UserName = $LogonEvent.Properties[5].Value
        UserDomain = $LogonEvent.Properties[6].Value
        LogonType = $LogonEvent.Properties[8].Value
    }
}

$LogonsGroupedByUserName = $Logons | Group-Object -Property UserName

foreach ($Group in $LogonsGroupedByUserName) {     
    $Group.Group | 
        Sort-Object -Property LogonDate -Descending | 
        Select-Object -First 1
}