Objective-c - 用户的登录和注销时间

Ogg*_*ggy 6 cocoa objective-c

是否可以在Objective-c程序中获取用户的登录和注销时间?我可以使用CGSessionCopyCurrentDictionary函数获取会话ID,用户名,userUID,userIsActive和loginCompleted,但是我无法从中获取登录和注销时间,是吗?

我知道我可以从console.app获取信息,但我想把它放在一个程序中.

我在哪里可以找到更多信息?在Apple的开发指南中找不到它.

谢谢!

Mar*_*n R 7

我不知道是否有任何特殊的Cocoa函数来获取用户登录/注销时间.

但您可以使用直接读取登录/注销历史记录getutxent_wtmp().这就是"最后一个"命令行工具的作用,如源代码中所示:http://www.opensource.apple.com/source/adv_cmds/adv_cmds-149/last/last.c

举一个非常简单的例子:以下程序将所有登录/注销时间打印到标准输出:

#include <stdio.h>
#include <utmpx.h>

int main(int argc, const char * argv[])
{
    struct utmpx *bp;
    char *ct;

    setutxent_wtmp(0); // 0 = reverse chronological order
    while ((bp = getutxent_wtmp()) != NULL) {
        switch (bp->ut_type) {
            case USER_PROCESS:
                ct = ctime(&bp->ut_tv.tv_sec);
                printf("%s login %s", bp->ut_user, ct);
                break;
            case DEAD_PROCESS:
                ct = ctime(&bp->ut_tv.tv_sec);
                printf("%s logout %s", bp->ut_user, ct);
                break;

            default:
                break;
        }
    };
    endutxent_wtmp();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

只是为了好玩:一个Swift 4解决方案:

import Foundation

extension utmpx {
    var userName: String {
        return withUnsafePointer(to: ut_user) {
            $0.withMemoryRebound(to: UInt8.self, capacity: MemoryLayout.size(ofValue: ut_user)) {
                String(cString: $0)
            }
        }
    }
    var timestamp: Date {
        return Date(timeIntervalSince1970: TimeInterval(ut_tv.tv_sec))
    }
}

setutxent_wtmp(0)
while let bp = getutxent_wtmp() {

    switch bp.pointee.ut_type {
    case Int16(USER_PROCESS):
        print(bp.pointee.userName, "login", bp.pointee.timestamp)
    case Int16(DEAD_PROCESS):
        print(bp.pointee.userName, "logout", bp.pointee.timestamp)
    default:
        break
    }
}
endutxent_wtmp();
Run Code Online (Sandbox Code Playgroud)