Powershell - ActiveDirectory 为 OU 中的所有用户查找 LastLogon 和 Manager

Powershell - ActiveDirectory Find LastLogon and Manager for all users in OU

我想为 OU 中的所有用户及其经理获取人类可读形式的 LastLogon。通常人们会登录到本地域控制器服务器 - 所以如果我可以限制只检查本地一个 DCLocal 就可以了。

所以我有这个(注意我有时间戳 - 我不想要这个,因为它太不合规了 - 我需要在 1 天内保持准确,而不是 14 天而不是 19 天,而是 1 天。

Get-ADUser -Filter {enabled -eq $true} -SearchBase "OU=STAFF,OU=MINE,DC=mine,DC=local" 
-ResultPageSize 0 -Prop CN,lastLogonTimestamp | Select CN,@{n="lastLogonTimeStamp";e=
{[datetime]::FromFileTime($_.lastLogonTimestamp)}} | Export-CSV -NoType c:\temp\lastLogin.csv

我不知道该怎么做,我看过这个 PowerShell Script to Return Employee's Manager and their Manager (x5) 我不确定如何将它与我现有的相结合。

如何执行这两个功能 [LastLogon 和 Manager] 并将域控制器限制为本地框和 OU,就像我在示例代码中那样。

遵循以下亚伯拉罕的建议 我试过了

Get-ADUser -Filter {enabled -eq $true} -Server MYLDC01 
-SearchBase "OU=STAFF,OU=MINE,DC=mine,DC=local" 
-ResultPageSize 0 -Prop CN,LastLogon, Manager | Select 
CN,@{n="LastLogon";e={[datetime]::FromFileTime($_.LastLogon)}
, Manager} | Export-CSV -NoType c:\temp\lastLogon.csv

结果是

Missing expression after ','.
At line:1 char:238
+ ... astLogon";e={[datetime]::FromFileTime($_.LastLogon)}, Manager} | Expo ...
+   

                                                    ~~~~~~~
Unexpected token 'Manager' in expression or statement.

警告: 确定实际上次登录时间的唯一方法是查询每个域控制器,但如果您在 AD 站点和服务,以便用户的登录 DC 应该 是本地的。

我有一个脚本可以查询 DC 日志并找到确切的登录时间和他们使用的机器,但它显然需要很长时间才能 运行 因此用于对单个用户进行故障排除而不是 运行 定期。

就是说 - 从 Web 复制粘贴代码时,您还必须小心,确保只抓取您需要的内容,尤其是如果它是较大脚本的片段 - 错误位置的意外换行符和括号会呈现脚本无用:

将它与您粘贴的代码进行比较,并将其放在一行中 - 就目前而言,它应该可以正常工作:

Get-ADUser -Filter {enabled -eq $true} -Server MyDC -SearchBase "OU=TheseUsers,OU=MyUsers,DC=my,DC=local" -ResultPageSize 0 -Prop CN,LastLogon, Manager | Select CN,@{n="LastLogon";e={[datetime]::FromFileTime($_.LastLogon)}}, Manager

我希望这对你有帮助,我创建它是为了帮助我完成你所要求的事情

Import-Module ActiveDirectory

$properties = ("Name", "SamAccountName", "mail", "lastLogon", "manager", "company", "createTimeStamp", "department", "logonCount", "pwdLastSet", "userPrincipalName", "physicalDeliveryOfficeName", "employeeID", "accountExpires", "division", "msDS-ResultantPSO")
$users = @{}

foreach ($hostname in (Get-ADDomainController -Filter { IsReadOnly -eq $false } ).HostName) {
    foreach ($user in (Get-ADUser -Server $hostname -Filter 'enabled -eq $true' -properties $properties | Select-Object $properties)) {
        if ( $users.Item($user.SamAccountName)) {
            If ( $user.lastLogon -gt $users.Item($user.SamAccountName).lastLogon ) { $users.Item($user.SamAccountName).lastLogon = $user.lastLogon }
            $users.Item($user.SamAccountName).logonCount += $user.logonCount
        }
        else {
            $users.Add( $user.SamAccountName, $user )
        }
    }
}

$hostname = (Get-ADDomainController -Discover -NextClosestSite).HostName
foreach ( $user in $users.Values ) {
    if ( $user.lastLogon ) { $user.lastLogon = [DateTime]::FromFileTime($user.lastLogon) }
    if ( $user.pwdLastSet ) { $user.pwdLastSet = [DateTime]::FromFileTime($user.pwdLastSet) }
    if ( $user.accountExpires -eq "9223372036854775807" -or $user.accountExpires -eq "0" ) { $user.accountExpires = "never expires" }
    else {
        $user.accountExpires = [DateTime]::FromFileTime($user.accountExpires) 
    }
    if ( $user.manager ) { $user.manager = (Get-ADUser $user.manager -Server "$hostname" -properties Name ).Name }
}

$users.Values | Export-Csv -Path C:\ins\users.csv -NoTypeInformation -Encoding UTF8