ようこそ!
答えてねっと for Businessは、
マイクロソフトが運営する
ビジネスで使うパソコンや
ITに関するQ&Aサイトです。

質問

lastLogonTimestamp属性を取得する

製品名:デスクトップ OS、サーバー OS/Windows Server 2003

現象:できない/その他

懸賞ポイントが設定されています。 100

この質問は解決で締め切られています

以下のVBSを実行すると、エラー(最下部)が発生します。
AvtiveDirectoryに登録されているユーザアカウント全部の
lastLogonTimestamp属性を取得したいのですが、
どこが間違えているのでしょうか。

尚、BuitinのUsersOUは使っておらず、clubnoahという
OUの下にユーザOUやコンピュータOUを作成しています。
何卒宜しくお願いします。

VBS
Set objUser = GetObject("LDAP://OU=Users,OU=clubnoah,DC=abc,DC=com"")
Set objLastLogon = objUser.Get("lastLogonTimestamp")

intLastLogonTime = objLastLogon.HighPart * (2^32) + objLastLogon.LowPart
intLastLogonTime = intLastLogonTime / (60 * 10000000)
intLastLogonTime = intLastLogonTime / 1440

Wscript.Echo "Last logon time: " & intLastLogonTime + #1/1/1601#
以上

エラー内容
スクリプト: C:\timestamp.vbs
行:     2
文字:    1
エラー:   ディレクトリのプロパティがキャッシュに見つかりません。

コード:   8000500D
ソース:   ActiveDirectory

質問者からのコメント

  • 投稿日時:2008/09/17 11:37

ありがとうございました!

回答1 (この回答は質問に対する回答です)

  • 投稿ID:A2008052917
  • 投稿日時:2008/09/11 10:29

チャブーンです。

そのエラーは (ここでは) "属性がみつかりません" といった類かと思います。

lastLogonTimestamp 属性は、ドメイン機能レベルが Windows Server 2003 になっていないと有効になりません。確認してみてはいかがでしょう?

http://technet2.microsoft.com/WindowsServer/ja/library/b3674c9b-fab9-4c1e-a8f6-7871264712711041.mspxマイクロソフト以外のサイトへ移動する

  •  

回答3 (この回答は回答1に対する回答です)

  • 投稿ID:A2008052922
  • 投稿日時:2008/09/11 10:47

ありがとうございます。
ドメイン機能レベルはWindows2000混在なのですが、2003ネイティブでないと
ダメということでしょうか・・・?

  •  

回答6 (この回答は回答3に対する回答です)

  • 投稿ID:A2008052937
  • 投稿日時:2008/09/11 12:25

チャブーンです。

#あぁ...ソースを見てなかった...

まず、lastLogonTimestamp 属性は Windows Server 2003 ドメイン機能レベルじゃないと正常に動作しないですよ。

また、DN にワイルドカードは使えません。ADSI スクリプトを使うなら、こういうのはどうでしょうか?
#なるべくいままでのやつを生かしてみました

----
on Error resume Next

Const OUPath = "OU=Users,OU=clubnoah,DC=abc,DC=com"

set objOU = GetObject("LDAP://" & OUPath)
objOU.Filter = Array("User")

For each objUser in objOU
cn = objUser.cn
set objLastLogon = objUser.Get("lastLogonTimestamp")
intLastLogonTime = objLastLogon.HighPart * (2^32) + objLastLogon.LowPart
intLastLogonTime = intLastLogonTime / (60 * 10000000)
intLastLogonTime = intLastLogonTime / 1440
Wscript.Echo "User name: " & cn & " " & "Last logon time: " & intLastLogonTime + #1/1/1601# + #09:00:00#
Next
----

もちろん ADODB を使うのもありですね。

  •  

回答7 (この回答は回答6に対する回答です)

  • 投稿ID:A2008053197
  • 投稿日時:2008/09/17 11:36

お礼が遅れてしまいまして、大変に申し訳ありませんでした。
何とかできそうです。本当にありがとうございました!

  •  

回答2 (この回答は質問に対する回答です)

  • 投稿ID:A2008052920
  • 投稿日時:2008/09/11 10:45

lastLogonTimestampは各ユーザのプロパティなので、OUを取得して調べても「ディレクトリのプロパティがキャッシュに見つかりません」とエラーがでます。OU内のメンバーを個別に調べないといけません。

また、一度もログインしていないユーザはこのプロパティがセットされていないので「ディレクトリのプロパティがキャッシュに見つかりません。」とエラーが出ます。

  •  

回答4 (この回答は回答2に対する回答です)

  • 投稿ID:A2008052923
  • 投稿日時:2008/09/11 10:51

ありがとうございます。
CN=*というようなワイルドカードは有効でしょうか?
ちなみに、以下のように書き換えて実行してみたところ、エラー内容が変わりました。
ワイルドカードは使えないんでしょうか??

VBS
Set objUser = GetObject("LDAP://CN=*,OU=Users,OU=clubnoah,DC=abc,DC=com")
Set objLastLogon = objUser.Get("lastLogonTimestamp")

intLastLogonTime = objLastLogon.HighPart * (2^32) + objLastLogon.LowPart
intLastLogonTime = intLastLogonTime / (60 * 10000000)
intLastLogonTime = intLastLogonTime / 1440

Wscript.Echo "Last logon time: " & intLastLogonTime + #1/1/1601#
以上

エラー
スクリプト:  C:\timestamp.vbs
行:     1
文字:    1
エラー:   サーバにそのようなオブジェクトはありません。
コード:   80072030
ソース:  (null)

  •  

回答5 (この回答は回答4に対する回答です)

  • 投稿ID:A2008052934
  • 投稿日時:2008/09/11 11:57

>ワイルドカードは使えないんでしょうか??
使えません

素直にユーザ一覧を取り出した上で、そのユーザに対して処理を行ってください。
#PowerShellとかですとラクラクですが^^;

むかーし書いたADOによる取得方法の書いたスクリプトが引っかかってきましたので手前味噌ですがよろしければ、ご参考になれば幸いです^^;
「ドメイン上のユーザー一覧の取得 - Windows Server Insider」
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=31464&forum=6&2マイクロソフト以外のサイトへ移動する

  •  

回答8 (この回答は回答5に対する回答です)

  • 投稿ID:A2008053199
  • 投稿日時:2008/09/17 11:37

お礼が遅れて申し訳ありませんでした。
ワイルドカード使えないんですね・・・orz
素直にShellとかの勉強に励みます。
本当にありがとうございました!

  •