none
最終ログオン日時 LastLogonの値について RRS feed

  • 質問

  • Function GetLastLogon($user) {
     
        $last_max = 0
        $DCs = Get-ADDomainController -Filter *
    
        foreach ($dc in $DCs ) {
            $aduser = Get-ADUser $user -Properties LastLogon -Server $dc.Name
            $last = $aduser.LastLogon
    
            if ($last_max -lt $last) {
                $last_max = $last
            }
    
        }
     
        $date = [DateTime]::FromFileTime($last_max)
        $date.ToString("yyyy/MM/dd HH:mm:ss")
     
    }
     
    GetLastLogon adtestuser
    

    参考

    上記の結果は 2017/09/30 15:16:01 が返ります。

    しかしながら、画面で確認する属性値のほうが最新の日付になっています。

    10/02 9:14:42 が最新かどうかは不明ですが、少なくともスクリプトの結果はこの日付になるはずだと思うのですが、スクリプトの内容に問題はありますでしょうか。

    2017年10月3日 2:41

回答

  • チャブーンです。

    スクリプトですが、見た感じは問題ないように見えるのですが、確認ポイントは2点あるように思います。

    1. すべてのドメインコントローラーから情報がとれているか。$DCsのリストが想定通りが確認した方がいいと思います。
    2. 時刻の評価($last_max -lt $last)部分が適切に動作しているかどうか。切り分けのために評価前にDATE型に変換してから評価すれば、間違えは起こらないように思います。

    うえを普通にPowerShell ISEでデバッグいただければ、糸口がつかめるのではないでしょうか。


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。


    2017年10月3日 2:58
  • ServerBでコマンドを実行した結果、ServerAの10/02 9:14:42が最新として正しく値を返しました。

    ServerAが最新の情報を保持している場合、ServerAでコマンドを実行すると、その値が取れないという状況です。

    自分のPCから実行すれば正しく取得できるため、「ドメインコントローラー上では実行すべきでない」という結論です。

    • 回答としてマーク TwSoft 2017年10月3日 4:38
    2017年10月3日 4:38

すべての返信

  • チャブーンです。

    スクリプトですが、見た感じは問題ないように見えるのですが、確認ポイントは2点あるように思います。

    1. すべてのドメインコントローラーから情報がとれているか。$DCsのリストが想定通りが確認した方がいいと思います。
    2. 時刻の評価($last_max -lt $last)部分が適切に動作しているかどうか。切り分けのために評価前にDATE型に変換してから評価すれば、間違えは起こらないように思います。

    うえを普通にPowerShell ISEでデバッグいただければ、糸口がつかめるのではないでしょうか。


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。


    2017年10月3日 2:58
  • チャブーンさん

    いつもありがとうございます。

    1.すべてのドメインコントローラーから情報がとれているか?

      > とれていないサーバーがありました。

    サーバーは5台ありますが、上図の属性エディターを確認していたサーバーが値を返しません。

    上図のサーバーがServerAだとすると

    Get-ADUser adtestuser -Properties LastLogon -Server ServerA

    としても、LastLogonが取れませんでした。

    ServerAにログオンして属性エディターを確認すると上図のとおり確認でき、コマンドでは値が返らない状況です。

    ここのあたりが問題かもしれません。現在調査中です。

    2017年10月3日 4:23
  • 確認しました。

    コマンドを実行しているサーバー自身は値を返さないようです。

    ServerBにログオンして -Server パラメータにServerAを指定したら値が返りました。

    パラメータを ServerB(自身)にすると値が返りませんでした。

    2017年10月3日 4:26
  • ServerBでコマンドを実行した結果、ServerAの10/02 9:14:42が最新として正しく値を返しました。

    ServerAが最新の情報を保持している場合、ServerAでコマンドを実行すると、その値が取れないという状況です。

    自分のPCから実行すれば正しく取得できるため、「ドメインコントローラー上では実行すべきでない」という結論です。

    • 回答としてマーク TwSoft 2017年10月3日 4:38
    2017年10月3日 4:38
  • チャブーンです。

    Get-ADUserに関して気になったので、確認してみたのですが、-Serverオプションを自分に指定すると値がとれない、という動作はWindows Server 2012 R2でもWindows Server 2016でもなかったです。正常に値はとれましたよ。

    なので、何か環境依存(意図的にオブジェクトにアクセス許可をかけているとか)か、個別の不具合の問題なのかと思います。どのOSバージョンを使っているのでしょうか?

    あと、lastLogon属性ですが、ムリにLDAP値でなくて(変更が面倒くさいので)LastLogonDateプロパティをとれば、時刻変換後の値を直接取得できるので便利です。時刻同士ならもちろん比較も可能です。

    追記:LastLogonDateプロパティはlastLogonTimestamp属性の時刻化のようですね。すみません。


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。



    2017年10月3日 12:54
  • チャブーンさん

    ご調査、ありがとうございます。

    サーバーはWindows Server 2012 R2が2台、2008が3台ありますが、いずれのサーバーでも、自身の値は返しませんでした。

    すべてサーバーにリモートデスクトップ接続しています。

    2017年10月5日 4:08