Экспорт данных на основе логина foreach [Powershell] - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть простой CSV-файл со столбцом 'logins'

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 часов: /

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Редактировать: я перепутал 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, $dt или Write-Output $username, $dt или return $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) для переименования свойства SamAccountName в столбце с именем Logins.Вы можете использовать Select-Object SamAccountName, LastLogonDate, если вам не важно имя столбца.А параметр -NoTypeInformation в Export-Csv просто не позволяет добавить эту раздражающую бессмыслицу "#TYPE System.Management.Automation.PSCustomObject" в первой строке.

0 голосов
/ 18 декабря 2018

$ _ - это переменная для текущего значения в конвейере .Во второй части кода, поскольку у вас нет конвейера, следовательно, $_ пусто и с ним не связано ни одно свойство / метод.

Что вы можете сделать, это -

$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, и помимо этого у вас может быть множество других имен дляпеременная, которая не является ключевыми словами, функциями и т. д.

Использование += для расширения массива требует создания нового экземпляра за кулисами в каждой итерации.

...