bugfix> powershell > 投稿

以下のスクリプトは、すべてのドメインコントローラーから実際の最新のADLastLogonを取得するために作成されました。 から最も古い日付または最新のエントリを取得する必要がありますLastLogon属性。

ただし、結果は異なり、以下のように非常に混乱します。

これは私がこれまでに思いついたスクリプトです:

function Get-ADUserLastLogon([string]$userName) {
    $dcs = Get-ADDomainController -Filter { Name -like "*" }
    $time = 0
    foreach ($dc in $dcs) {
        Write-Host "Processing $($userName) ... $($dc.HostName) [$($(Resolve-DnsName -Name $dc.hostname).IPaddress)]" -ForegroundColor Green
        $user = Get-ADUser $userName | Get-ADObject -Properties lastLogon
        if ($user.LastLogon -gt $time) {
            $time = $user.LastLogon
        }
    }
    $dt = [DateTime]::FromFileTime($time)
    Write-Host "`n" $username "last logged on at:" $dt " `n" -ForegroundColor Cyan
    return $dt
}
$filter = { Enabled -eq $True}
$properties = 'Name', 'canonicalName', 'whenCreated', 'displayName', 'lastlogondate', 'lastlogon'
$Name = 'Enterprise.Admins'
Get-ADUser $Name -Properties $properties |
    Select-Object -Property DisplayName,
                            SamAccountName,
                            UserPrincipalName,
                            WhenCreated,
                            @{ n = 'Most Recent Logon'; e = { Get-ADUserLastLogon -UserName $_.SamaccountName } },
                            @{ n = 'Real Last Logon'; e = { $sam = $_.SamaccountName; [datetime]::FromFileTime((Get-ADDomainController -Filter { Name -like "*" } | ForEach { Write-Host "Server: $($_.Name) - DisplayName: $($sam)" -ForegroundColor Yellow ; Get-ADUser $sam -Properties $properties -Server $_.Name | Select-Object LastLogon} | Measure-Object -Property LastLogon -Maximum).Maximum) } },
                            LastLogonDate | Out-GridView

上記の3つの列をどのように組み合わせることができますか本当の最後のログオン最新のログオンそしてLastLogonDate1つの適切な列に?

回答 2 件
  • はどうかと言うと ...

    "How can we combine the above three columns Real Last Logon, Most Recent Logon and LastLogonDate into one proper column?"

    私はそれを使用するのに便利なADDS環境を持っていないので、ファイルシステムとランダムなテキストのものを使用するだけです。

    3つの日付すべてに1つの計算済みプロパティを使用できます。たとえば、@ {Name = 'LogOnDates';Expression {'all your date info here'}}ですが、これはその単一の列に単一の行表現として表示されます。

    Clear-Host
    Get-ChildItem -Path 'D:\Temp\*.txt' | 
    Select-Object -First 1 | 
    Select-Object -Property FullName, 
    @{
        Name = 'DateDetails'
        Expression = {@(
                            $PSItem.CreationTime, 
                            $PSItem.LastAccessTime, 
                            $PSItem.LastWriteTime
                       )
                      }
    } | Out-Gridview
    
    

    それでも、あなたが求めているのは、それらの見出しも持つことであり、それはOGVが実行できることではありません。 OGVの独自のカスタムバージョンを定義するか、次のようなことを行う必要があります。

    Clear-Host
    Get-ChildItem -Path 'D:\Temp\*.txt' | 
    Select-Object -First 1 | 
    Select-Object -Property FullName, 
    @{
        Name = 'DateDetails'
        Expression = {@(
                            [PSCUstomObject]@{
                                CreationTime   = $PSItem.CreationTime
                                LastAccessTime = $PSItem.LastAccessTime
                                LastWriteTime  = $PSItem.LastWriteTime
                            }
                       )
                      }
    } | Out-Gridview
    
    

    または、次のようなアプローチでより創造的になります。

    $col = @(
        (New-Object –TypeName PSObject –Prop @{'id'='01';'name'='a';'items'=@('the first item','the second item', 'the third item')}),
        (New-Object –TypeName PSObject –Prop @{'id'='02';'name'='b';'items'=@('the first item','the second item', 'the third item', 'the third item', 'the third item', 'the third item', 'the third item', 'the third item', 'the third item', 'the third item', 'the third item', 'the third item', 'the third item', 'the third item', 'the third item', 'the third item', 'the third item', 'the third item', 'the third item')}),
        (New-Object –TypeName PSObject –Prop @{'id'='03';'name'='c';'items'=@('the first item','the second item', 'the third item')})
        )
    $col | Select -p id,@{E={$_.items -join "`n"};L="Items"},name | Out-GridView
    
    

  • あなたの目標は、3つの日時値を抽出し、それらを相互に比較して、最新のものを返すことであるように思われます。この場合、次のようにすべての変数をMeasure-Objectに渡すことができます。

    (($MostRecentLogon,$RealLastLogon,$LastLogonDate) | Measure-Object -Maximum).Maximum
    
    

    これにより、3つの日付すべてが比較され、最も高い値(つまり、最新の日付)が出力されます。

あなたの答え