-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, $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 loginslogins 列の値のみを渡します。Get-ADUser は、パイプラインから ID を受け取り、ログオン名である SamAccountName (既定のプロパティ) である限り、各ユーザーの LastLogonDate を取得します。

次の行で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 に答える