我有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
}
答案 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
又快又脏。