-1

我有简单的 csv 文件,其中包含“登录”列

logins
john
mark
maria
...

有 powershell 脚本来检查他们的最后登录时间:

Import-Module ActiveDirectory
function Get-ADUserLastLogon([string]$userName)
{
    $time = 0
    $user = Get-ADUser $userName | Get-ADObject -Properties lastLogon
    if($user.LastLogon -gt $time)
    {
        $time = $user.LastLogon
    }
    $dt = [DateTime]::FromFileTime($time)
    Write-Host $username $dt }

import-csv -Encoding UTF8 -path C:\scripts\loginy.csv | foreach {
    Get-ADUserLastLogon -UserName  $_.logins
}

这适用于输出

john 2018-05-10 14:11:28
mark 2018-11-29 14:26:58
maria 2018-11-02 11:14:17
...

当我尝试通过代码将结果导出到 csv 文件时

$users = import-csv -Encoding UTF8 -path C:\scripts\loginy.csv
$results = @()
foreach ($_.logins in $users) {
    $results += Get-ADUserLastLogon -UserName  $_.logins
}
$results | Export-CSV C:\scripts\Eksporty\logowania.csv -Append -encoding "utf8"

出错

At C:\scripts\OstatnieLogowanie.ps1:19 char:12
+ foreach ($_.logins in $users) {
    +            ~
    Missing 'in' after variable in foreach loop.
    At C:\scripts\OstatnieLogowanie.ps1:19 char:29
    + foreach ($_.logins in $users)

}

我不能让它工作超过 2 小时:/

4

2 回答 2

2

编辑:我混淆了 LastLogon 和 LastLogonTimestamp。LastLogonDate 基于 LastLogonTimestamp。这些属性之间的差异在此处此处进行了说明。我会回来更新我的答案。


Write-Host用于输出数据:

Write-Host $username $dt

这行不通。 Write-Host意思是“写入控制台屏幕,而不是标准输出”。如果您尝试显示数据,这将正常工作,但调用$x = Get-ADUserLastLogon -UserName $login会将结果打印到控制台屏幕,并且不会将任何内容分配给$x变量。例如:

PS C:\> $x = Write-Host 0
0
PS C:\> $x
PS C:\>

看看 Write-Host 如何仍然写入控制台并且$x没有值?

您的函数应该类似于$username, $dtorWrite-Output $username, $dtreturn $username, $dt

虽然这仍然不会像你想要的那样工作。我可能会使用这样的自定义对象(请参阅 参考资料Get-Help about_Object_Creation -ShowWindow):

Import-Module ActiveDirectory
function Get-ADUserLastLogon([string]$userName) {
    $user = Get-ADUser $userName -Properties LastLogonDate 
    [PSCustomObject]@{'Logins' = $username; 'LastLogonDate' = $user.LastLogonDate}
}

$users = import-csv -Encoding UTF8 -path C:\scripts\loginy.csv
$results = foreach ($user in $users) {
    Get-ADUserLastLogon -UserName  $user.logins
}
$results | Export-CSV C:\scripts\Eksporty\logowania.csv -Append -encoding "utf8"

然而,坦率地说,如果我在这里做你想做的事情,我的实际代码将如下所示:

Import-Csv -Encoding -Path C:\scripts\loginy.csv |
    Select-Object -ExpandProperty logins |
    Get-ADUser -Properties LastLogonDate |
    Select-Object @{n = 'Logins'; e = {$_.SamAccountName}}, LastLogonDate |
    Export-Csv -Path C:\scripts\Eksporty\logowania.csv -Encoding UTF8 -NoTypeInformation

Select-Object -ExpandProperty logins将只传递登录列的裸值。Get-ADUser 接受来自管道的身份,它为每个用户获取 LastLogonDate,只要 SamAccountName(默认属性)是登录名。

下一行,Select-Object @{n = 'Logins'; e = {$_.SamAccountName}}, LastLogonDate使用计算属性(请参阅参考资料中的示例Get-Help Select-Object -ShowWindow)重命名名为 Logins 的列中的 SamAccountName 属性。Select-Object SamAccountName, LastLogonDate如果您不关心列名,则可以使用。-NoTypeInformation参数 onExport-Csv只是防止它在第一行添加烦人的“#TYPE System.Management.Automation.PSCustomObject”废话。

于 2018-12-18T14:22:32.250 回答
0

$_ 是 pipeline 中当前值的变量。在您的第二部分代码中,由于您没有管道,因此$_是空的并且没有任何与之关联的属性/方法。

你能做的是——

$users = import-csv -Encoding UTF8 -path C:\scripts\loginy.csv
foreach ($user in $users) {
Get-ADUserLastLogon -UserName  $user.logins | Export-CSV C:\scripts\Eksporty\logowania.csv -Append -encoding "utf8"
} 

或者

$users = import-csv -Encoding UTF8 -path C:\scripts\loginy.csv
foreach ($_ in $users) {
Get-ADUserLastLogon -UserName  $_.logins | Export-CSV C:\scripts\Eksporty\logowania.csv -Append -encoding "utf8"
} 

尽管我建议不要使用后者,因为$_它是一个自动变量$PSItem,并且除此之外,您还可以为变量指定很多其他名称,这些名称不是关键字、函数等。

使用+=扩展数组需要在每次迭代中在幕后创建一个新实例。

于 2018-12-18T13:24:11.677 回答