You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取macOS GUI进程所在交互登录会话的用户名?

获取macOS GUI应用提权后的交互用户名

当你的GUI应用通过AuthorizationExecuteWithPrivileges提权到root后,getuid()/geteuid()会返回root的用户ID,无法拿到当前桌面登录的交互用户。此时可以使用系统提供的SCDynamicStoreCopyConsoleUser接口,它能直接获取当前控制台会话的交互用户信息,不受进程权限影响。

Swift 实现

需要导入SystemConfiguration框架,代码示例:

import SystemConfiguration

func getInteractiveUsername() -> String? {
    var uid: uid_t = 0
    var gid: gid_t = 0
    guard let username = SCDynamicStoreCopyConsoleUser(nil, &uid, &gid) as String? else {
        return nil
    }
    return username
}

// 调用示例
if let username = getInteractiveUsername() {
    print("当前交互用户名:\(username)")
} else {
    print("无法获取交互用户名")
}

C 实现

依赖SystemConfiguration框架,代码示例:

#include <SystemConfiguration/SystemConfiguration.h>
#include <stdio.h>

const char* getInteractiveUsername() {
    uid_t uid = 0;
    gid_t gid = 0;
    CFStringRef usernameRef = SCDynamicStoreCopyConsoleUser(NULL, &uid, &gid);
    if (usernameRef == NULL) {
        return NULL;
    }
    static char usernameBuffer[256];
    CFStringGetCString(usernameRef, usernameBuffer, sizeof(usernameBuffer), kCFStringEncodingUTF8);
    CFRelease(usernameRef);
    return usernameBuffer;
}

// 调用示例
int main() {
    const char* username = getInteractiveUsername();
    if (username != NULL) {
        printf("当前交互用户名:%s\n", username);
    } else {
        printf("无法获取交互用户名\n");
    }
    return 0;
}

补充说明

  • SCDynamicStoreCopyConsoleUser返回的是当前拥有活跃桌面会话的用户,无论进程以root还是其他身份运行,都能拿到正确的交互用户信息。
  • Swift代码需确保导入SystemConfiguration框架,C代码编译时需链接该框架(例如添加编译参数-framework SystemConfiguration)。
  • 该接口在macOS各版本中兼容性良好,无需额外处理版本适配问题。

内容的提问来源于stack exchange,提问作者c00000fd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 10:33:13