【问题标题】:Nested IF statement in ForEach-object loopForEach-object 循环中的嵌套 IF 语句
【发布时间】:2014-11-26 12:33:47
【问题描述】:

我目前正试图找出特定组的哪些成员在过去 30 天内未登录 AD。我已设法返回该组的所有用户,但在将其传递到 Foreach-object 循环时遇到问题。

import-module activedirectory

$DaysInactive = 30
$time = (Get-Date).Adddays(-($DaysInactive))

get-adgroupmember -identity "Remote Users" | foreach-object {
    if ($_.LastLogonDate -lt $time) {
        write-host $_.SamAccountName
    }
}

我认为问题在于我在调用 LastLogonDate 时使用了 AD 用户属性,因此我收到一条错误消息,指出无法识别它。 我想象在循环中我需要一个get-aduser cmdlet,但我不确定要发送什么作为-filter 的值。

当 PowerShell 从 get-adgroupmember 检索所有成员时,它是否将结果集放入数组中?如果是这样,我如何检索上次登录日期的值?

【问题讨论】:

  • 应该是:if ($_.LastLogonDate -lt $time)
  • 此外,默认情况下不检索 .LastLogonDate 属性。您需要获取从 Get-ADGroupMember 返回的每个项目,并使用 Get-ADUser 显式获取 .LastLogonDate 属性。
  • @EBGreen 你是对的。由于应用了 arco444 的建议,它现在返回所有成员而不似乎评估条件语句。当我需要指定过滤器时,我应该使用 Get-ADUser 指定什么?
  • 请用您当前的代码编辑您的问题。

标签: powershell active-directory


【解决方案1】:

这样的?

Get-ADGroupMember -recursive -identity "Remote Desktop" |
    Where { $_.objectClass -eq "user" } |
    Get-ADUser -properties SamAccountName, LastLogonDate |
    Where { $_.LastLogonDate -lt $time } |
    select SamAccountName
  • 过滤掉组
  • 我猜你想要所有嵌套成员?
  • 加载 LastLogonDate

【讨论】:

  • 既然你已经有了一个管道,我会使用 ... | ? { $_.LastLogonDate -lt $time } | select -Expand SamAccountName 而不是带有嵌套 if 语句的 ForEach-Object 循环。
【解决方案2】:

好吧,我没有时间对此进行全面测试,所以它是即兴的,但这应该会让你朝着正确的方向前进:

import-module activedirectory

$DaysInactive = 30
$time = (Get-Date).Adddays(-($DaysInactive))

$users = get-adgroupmember -identity "Remote Users"
foreach($user in $users){
    $lastLogin = (Get-ADUser $user -Property LastLogonDate).LastLogonDate
    if($lastLogin -lt $time){
        Write-Host $user.SamAccountName
    }
}

【讨论】:

  • 像这样将复杂的管道命令转换为更结构化的 foreach 循环是继续此操作的方法。这样一来,您正在使用的对象就非常清楚了。
猜你喜欢
  • 2017-01-13
  • 1970-01-01
  • 2015-10-01
  • 2017-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多