比较来自多个DC的用户的LastLoginDate

时间:2018-07-10 13:37:58

标签: powershell active-directory domaincontroller

我有2个DC,并且需要获取X天未登录的所有用户的列表。我得到了一个PS脚本,该脚本查看用户在域上的最后登录日期,然后过滤并导出X天未登录的用户。

PowerShell脚本:

$AmountDays = 30
Get-ADUser -Filter * -Properties Enabled, LastLogonDate |
    ? {
        $_.LastLogonDate -ne $null -and
        $_.LastLogonDate -lt (Get-Date).AddDays(-$AmountDays)
    } |
    sort LastLogonDate |
    Select Name,LastLogonDate |
    Export-Csv C:\temp\LastLogonUser.csv -NoTypeInformation

问题是我的DC的同一用户具有不同的LastLogonDate。 因此,例如,如果我在DC1上运行脚本,他会认为用户20天内未登录,但是当我在DC2上运行该脚本时,他昨天已登录。

是否可以从两个DC上检查同一用户的LastLogonDate并获取最新的,所以如果用户未登录X天,我可以检查比较结果吗?


我已经编辑了代码,因此它使用了一个foreach循环来遍历我的DC并找到我的用户。但是我认为在他经历了第一个之后就停止了。因为如果我运行一个简单的代码来检查他是否可以找到两个DC,那么他会同时查看它们。但是,当我运行代码并导出结果时,它仅显示每个成员,而并非所有LastLogonDates都是正确的。

新脚本:

Import-Module ActiveDirectory

  $dcs = Get-ADDomainController -Filter {Name -like "*"}
  $AmountDays = 0

  foreach($dc in $dcs)
  {
     Get-ADUser -Filter * -Properties Enabled, LastLogonDate | ? { `
($_.LastLogonDate -NE $NULL -AND $_.LastLogonDate -LT (Get-
Date).AddDays(-$AmountDays)) } |
sort LastLogonDate | Select Name,LastLogonDate |
Export-Csv C:\temp\LastLogonUser.csv -NoTypeInformation 
  }

4 个答案:

答案 0 :(得分:0)

LastLogonDate是一个DateTime对象,请尝试首先使用ToLocalTime() 方法将其转换为本地时间

所以尝试:

Get-ADUser [...] -Properties LastLogonDate | 
? { $_.LastLogonDate -and $_.LastLogonDate.ToLocalTime() -lt [datetime]::Now.AddDays(-30)} 

此外,请确保同步DC的时钟,要使用Net Time \\YouDcName命令对其进行验证

答案 1 :(得分:0)

我实际上也可以对所提出的问题有所帮助,因为我需要修改一份报告,以与16个DC帐户和1200个计算机帐户进行比较,以找到最后的登录名和密码lastset。

这是我用于较小数据集的逻辑,但是我认为使用大约20,000行数据来查找准确的信息不会有效。会很慢。

JSONObject jsonBody = new JSONObject();
                jsonBody.put("scope", "openid email phone profile offline_access roles");
                jsonBody.put("resource", "window.location.origin");
                jsonBody.put("grant_type", "password");
                jsonBody.put("username", "support@care.com");
                jsonBody.put("password", "tempP@ss");
                final String requestBody = jsonBody.toString();

答案 2 :(得分:0)

这就是发明LastLogonTimestamp的原因,因为1或2周前的值足以满足您的需求。如果不是,则必须查询所有域控制器并选择最新值。

Get-ADDomainController | ForEach-Object {
    Get-ADUser -Filter * -Server $_ -Properties Enabled, LastLogonDate | Where-Object {
        # ...
    } | Select-Object Name, LastLogonDate
} | Group-Object Name | Select-Object Name, @{n='LastLogon';e={
    $_.Group |
        Sort-Object LastLogonDate |
        Select-Object -Last 1 -Expand LastLogonDate
}

答案 3 :(得分:0)

我感到你很痛苦。

lastLogonTimeStamp属性被复制到所有DC,但是仅在登录时更新(如果现有值已存在14天或更多天)。

lastLogon属性在每次登录时都会更新,但不会被复制。您需要查询所有DC以获得每个用户的准确lastLogon值。

我(好或坏)倾向于这样做...

$stuff = $(net user $env:username /domain | select-string 'Last logon*').ToString()
$label, $login_date = [regex]::split($stuff, '\s{5,}')
$login_date

又快又脏。