環境:Windows2000(SP2)・IE5.5(SP2)・VC++6.0(SP?)・SDK
Win2000でCtrl+Alt+Delキーを押すと「Windows のセキュリティ」ダイアログが
表示されると思います。
そこに「ログオンの日付」が表示されていますが、この日付を取得するにはどう
すればよろしいでしょうか?
Net系のAPIをMSDNで片っ端から調べましたが、それらしきものは見つかりません
でした(探し方が悪いのかもしれませんが)。
ご存知の方、ご教授願います。
GetTickCountの説明を読んで、解決したらここに方法を説明してください。
後の人が助かります。(私はちょっと時間がないので。)
あ、失礼。2000でログオンした日付でしたね。
それもGetTickCountの説明にちらっと書いてますが・・・あれ?
そんなレジストリあったっけ?
以下MSDNより
Windows NT/2000/XP: To obtain the time elapsed since the computer was started,
retrieve the System Up Time counter in the performance data in the registry key
HKEY_PERFORMANCE_DATA. The value returned is an 8-byte value. For more
information, see Performance Monitoring.
> HKEY_PERFORMANCE_DATA
>
稼動中プロセスの列挙をする時、使った記憶が...
プロセスビューアのサンプルプログラムで登場してたと思います。
レスありがとうございます。
HKEY_PERFORMANCE_DATA の System Up Timeを取得して、time()などで取得した値から
引いてやればいいという考え方ということですね。
HKEY_PERFORMANCE_DATAってレジストリエディタで見えないのでちょっと苦労しそうですが、
試してみて後ほど報告します。
「Windowsのセキュリティ」ダイアログもそうやっているんですかね?
ログオンした日付をレジストリなどに保存しておけばいいだけのような気もしますけどね。
「Windowsのセキュリティ」ダイアログはGINA.DLLが持っています。
余計な記録領域を持つことになりますが、GINA.DLL内でログオン時刻をグローバルに持てば、
WinLogon.exeからSASメッセージが渡された時にダイアログへ表示することは出来ます。
ちなみに私はGINA.DLLでログオン時刻をメモリに格納しました。
なんの回答にもなっていないですね。ごめんなさい。
レスありがとうございます。
ということは「ログオンの日付」はGINAが内部的に持っているので取得することは
できないということですかね...。
HKEY_PERFORMANCE_DATA についてはいまだ進捗なしです。
遅くなりましたが、報告します。
_USER_INFO_2 *ui;
char str[256];
tm *tmLogon;
long lLogonTime;
if(NetUserGetInfo(NULL, Lusername, 2, (LPBYTE *)&ui) == NERR_Success){
lLogonTime = ui->usri2_last_logon;
tmLogon = localtime(&lLogonTime);
strftime(str, sizeof(str), %Y/%m/%d(%A) %H:%M:%S, tmLogon);
MessageBox(hWnd, str, logon time, MB_OK);
if(ui)
NetApiBufferFree(ui);
}
こんな感じにすればローカルコンピュータにログインした場合にのみ、日付が取得できます。
NetUserGetInfoの第1引数をNetGetDCNameで取得したドメインコントローラにすると
ドメインにログオンした日付も取得できることが分かったのですが、あくまでもドメイン
にログオンした日付(ドメインコントローラのマシンタイム)のためなのか、実際には
「Windowsのセキュリティ」ダイアログの日付とは時刻がずれてしまいます。
やはり、GINAが内部的に持っている情報なんですかね...。
しばらくして解決方法が見つからなければ、これでよしとして解決済みのチェックをしたいと
思います。