是否可以在 Objective-C 程序中获取用户的登录和注销时间?我可以使用 CGSessionCopyCurrentDictionary 函数获取会话 ID、用户名、userUID、userIsActive 和 loginCompleted,但我无法从中获取登录和注销时间,可以吗?
我知道我可以从 console.app 获取信息,但我想把它放在一个程序中。
我在哪里可以找到更多信息?在 Apple 的开发指南中找不到它。
谢谢!
是否可以在 Objective-C 程序中获取用户的登录和注销时间?我可以使用 CGSessionCopyCurrentDictionary 函数获取会话 ID、用户名、userUID、userIsActive 和 loginCompleted,但我无法从中获取登录和注销时间,可以吗?
我知道我可以从 console.app 获取信息,但我想把它放在一个程序中。
我在哪里可以找到更多信息?在 Apple 的开发指南中找不到它。
谢谢!
我不知道是否有任何特殊的 Cocoa 功能来获取用户登录/注销时间。
但是您可以使用getutxent_wtmp()
. 这就是“last”命令行工具的作用,可以在源代码中看到: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;
}
只是为了好玩:一个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();