无法将"上次登录时间戳"解析为发送给经理的电子邮件的 X 天非活动天数



我正在创建一个脚本,搜索仍然活跃但尚未登录超过40天的用户AD,并向该用户的经理发送电子邮件。我使用lastlogontimestamp并将其从整数解析为本地时间格式。

然而,我想就此展开。在电子邮件中,我不想显示最后一次登录的日期,而是想显示从脚本运行之日起最后一次登录的X天数。

我已经弄清楚了它过去是如何工作的,不能让新版本工作,但我觉得我很接近。很抱歉,我是个新手。有人能看出我错在哪里吗?

从脚本中提取:

$users = Search-ADAccount -AccountInactive -TimeSpan (New-TimeSpan -Days 40) -Searchbase "OU=Users,OU=State,DC=Company,DC=Biz" |
         where {$_.Enabled -eq "True"} |
         Get-ADUser -Properties mail, givenname, surname, manager, lastlogontimestamp, sAMAccountName, description
#Loop through the query results
foreach ($User in $Users) {
  #Convert LastLogonDate to days since last use
  $LLTS = $User.lastLogonTimeStamp
  if ($LLTS -eq $Null) {
    $Time = [Int64]0
  } else {
    $Time = [Int64]::Parse($LLTS)
  }
  $Daysinactive = ($(Get-Date) - $([DateTime]::FromFileTime($Time)).Days)
  #Retrieve $User.Manager email address with Get-Aduser passthrough
  $Manager = Get-ADUser $User.Manager -Properties EmailAddress
  #Set dynamic variables and body of email
  $To = $Manager.EmailAddress
  $Subject = "Your employee $($User.Givenname) $($User.Surname) has been inactive for $Daysinactive ."
  #Send email
  Send-MailMessage -To $To -From $From -Subject $Subject -SmtpServer $SMTPServer -Body $Body -BodyAsHtml -Priority High
}

此外,我似乎无法过滤超过40天不活跃但从未登录过的用户。在我的公司,用户有时会在到达前几个月创建,显然我不希望他们的经理收到有关他们的电子邮件。谁能指出我在正确的方向排除他们的查询?

lastLogonTimestamp属性包含filetime格式的时间戳。您可以通过静态FromFileTime()方法将其直接转换回日期。然后计算该日期与当前日期之间的差值。天的差异可以通过所得TimeSpanDays性质得到:

$lastLogon = [DateTime]::FromFileTime($User.lastLogonTimeStamp)
$Daysinactive = ((Get-Date) - $lastLogon).Days

然而,你不需要自己转换日期,因为PowerShell AD cmlet已经为你做了。只需在属性列表中包含LastLogonDate属性,您将获得最后登录日期作为实际日期:

Get-ADUser -Properties mail, manager, LastLogonDate, description
foreach($User in $Users) {
  $Daysinactive = ((Get-Date) - $User.LastLogonDate).Days
  ...
}

属性GivenNameSurnameSamAccountNameGet-ADUser返回的默认属性集中,因此您不需要显式指定它们。

最新更新