Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell将筛选用户最新的上次登录和大于X天数的上次登录_Powershell_Active Directory - Fatal编程技术网

Powershell将筛选用户最新的上次登录和大于X天数的上次登录

Powershell将筛选用户最新的上次登录和大于X天数的上次登录,powershell,active-directory,Powershell,Active Directory,我试图让广告用户的最后登录时间超过X天,并检索他们的经理电子邮件 我已经搜索了很多,但没有得到我需要的,现在下面是我所拥有的。它不会筛选具有最新登录时间戳的用户或在超过X天内未登录的用户 一旦我能够过滤这两个属性,我就可以为每个用户添加电子邮件语法,以便向他们的经理发送电子邮件 $dcs = Get-ADDomainController -Filter * | Select-Object -Property Name foreach ($dc in $dcs) { $lastlogon = Ge

我试图让广告用户的最后登录时间超过X天,并检索他们的经理电子邮件

我已经搜索了很多,但没有得到我需要的,现在下面是我所拥有的。它不会筛选具有最新登录时间戳的用户或在超过X天内未登录的用户

一旦我能够过滤这两个属性,我就可以为每个用户添加电子邮件语法,以便向他们的经理发送电子邮件

$dcs = Get-ADDomainController -Filter * | Select-Object -Property Name
foreach ($dc in $dcs)
{
$lastlogon = Get-ADUser -Filter * -SearchBase  "OU=Sandbox_Users,DC=twi-test,DC=com" -Properties * | Select-Object -Property displayname,lastlogon,samaccountname,EmailAddress,@{Name = "Manager" ; Expression = {(Get-ADUser $_.Manager).Name}},@{Name = "ManagerEmail" ;`
 Expression = {(Get-ADUser $_.manager -Properties emailaddress).EmailAddress}
 }}
您(理论上)应该能够通过在lastlogondate字段上进行过滤来实现这一点,该字段是
get aduser
命令的一部分(使用所需X天的
$days
变量,或者直接定义一个整数):

完整代码:

$days = 7
$dcs = Get-ADDomainController -Filter * | Select-Object -Property Name
foreach ($dc in $dcs) {
     $lastlogon = Get-ADUser -Filter { lastlogondate -lt ((get-date).adddays($days)) } -SearchBase  "OU=Sandbox_Users,DC=twi-test,DC=com" -Properties * |
        Select-Object -Property displayname,lastlogon,samaccountname,EmailAddress,`
            @{Name = "Manager";Expression = {(Get-ADUser $_.Manager).Name}},`
            @{Name = "ManagerEmail"; Expression = {(Get-ADUser $_.manager -Properties emailaddress).EmailAddress}}
}
根据您关于如何获取具有最新lastlogon结果的唯一结果的评论,我建议切换到
ForEach对象
循环,因为您可以通过管道将结果进一步过滤:

$days = 7
$dcs | foreach-object {
     Get-ADUser -Server $_ -SearchBase  "OU=Sandbox_Users,DC=twi-test,DC=com" -Properties * |
        Where-Object { $_.LastLogonDate -le (Get-Date).AddDays(-$days) } |
        Select-Object -Property displayname,lastlogon,samaccountname,EmailAddress,`
            @{Name = "Manager";Expression = {(Get-ADUser $_.Manager).Name}},`
            @{Name = "ManagerEmail"; Expression = {(Get-ADUser $_.manager -Properties emailaddress).EmailAddress}}
} | sort lastlogon -desc | select -first 1
我还注意到,在您的原始代码中,您实际上没有使用
$dcs
集合。在这个版本中,我添加了一个
-server
开关,打开第一个
获取aduser
,以利用它。

您(理论上)应该能够通过在
获取aduser
命令中过滤lastlogondate字段来实现这一点(使用所需X天的
$days
变量,或者直接定义一个整数):

完整代码:

$days = 7
$dcs = Get-ADDomainController -Filter * | Select-Object -Property Name
foreach ($dc in $dcs) {
     $lastlogon = Get-ADUser -Filter { lastlogondate -lt ((get-date).adddays($days)) } -SearchBase  "OU=Sandbox_Users,DC=twi-test,DC=com" -Properties * |
        Select-Object -Property displayname,lastlogon,samaccountname,EmailAddress,`
            @{Name = "Manager";Expression = {(Get-ADUser $_.Manager).Name}},`
            @{Name = "ManagerEmail"; Expression = {(Get-ADUser $_.manager -Properties emailaddress).EmailAddress}}
}
根据您关于如何获取具有最新lastlogon结果的唯一结果的评论,我建议切换到
ForEach对象
循环,因为您可以通过管道将结果进一步过滤:

$days = 7
$dcs | foreach-object {
     Get-ADUser -Server $_ -SearchBase  "OU=Sandbox_Users,DC=twi-test,DC=com" -Properties * |
        Where-Object { $_.LastLogonDate -le (Get-Date).AddDays(-$days) } |
        Select-Object -Property displayname,lastlogon,samaccountname,EmailAddress,`
            @{Name = "Manager";Expression = {(Get-ADUser $_.Manager).Name}},`
            @{Name = "ManagerEmail"; Expression = {(Get-ADUser $_.manager -Properties emailaddress).EmailAddress}}
} | sort lastlogon -desc | select -first 1

我刚才还注意到,在您的原始代码中,您实际上没有使用
$dcs
集合。在本次修订中,我在第一个
get aduser
上添加了一个
-server
开关来使用它。

感谢您的回复。由于我对所有DC进行了查询,这将提供多个logondate,我该怎么做过滤它只会检索最新的一个。因为logondate不经常与DC同步(我相信是14天)我只想要lastlogondate,它是最近的一个。也可以使用lastlogon,因为它是定期复制的,可以过滤最近的登录,然后过滤在过去7天内没有登录的用户。我仍然没有执行您的查询,但将在周一尝试。感谢您的时间。您可以添加此
|排序lastlogondate|选择-first 1
根据我的经验,它在所有DC中都是相同的,但我可能错了。对于我来说,最初尝试使用lastlogon时,sort不能很好地工作,但我将添加这些并测试查询,让您知道它是如何工作的。此外,我将手动验证一些条目,以查看数据是否正确返回。谢谢再一次。我用一些额外的代码编辑了我的答案,这些代码是关于如何获取最近的登录日期的。我还注意到,在您的原始代码中,您没有真正使用
$dcs
集合。感谢您的回复。由于我查询的是所有DC,因此这将提供多个logondate,我如何过滤它将只是重新设置trive最新版本。由于logondate不经常与DC同步(我相信是14天)我只想要lastlogondate,它是最近的一个。也可以使用lastlogon,因为它是定期复制的,可以过滤最近的登录,然后过滤在过去7天内没有登录的用户。我仍然没有执行您的查询,但将在周一尝试。感谢您的时间。您可以添加此
|排序lastlogondate|选择-first 1
根据我的经验,它在所有DC中都是相同的,但我可能错了。对于我来说,最初尝试使用lastlogon时,sort不能很好地工作,但我将添加这些并测试查询,让您知道它是如何工作的。此外,我将手动验证一些条目,以查看数据是否正确返回。谢谢再一次。我用一些关于如何获取最近一次登录日期的附加代码编辑了我的答案。我还注意到,在您的原始代码中,您没有真正使用
$dcs
集合。