Найти пользователя, который запустил NSRunningApplication

Как я могу получить эту информацию? Учитывая NSRunningApplication Например, мне нужно знать, кто его запустил. Монитор активности показывает эту информацию.

3 ответа

Решение

Если вам просто нужно имя пользователя, который запустил экземпляр NSRunningApplicationВот метод категории, который должен это сделать:

#import <libproc.h>
#import <pwd.h>

@implementation NSRunningApplication (UserName)

- (NSString *)foo_userName {
    pid_t pid = [self processIdentifier];
    struct proc_bsdshortinfo info;
    proc_pidinfo(pid, PROC_PIDT_SHORTBSDINFO, 0, &info, sizeof(info));
    struct passwd *passwd = getpwuid(info.pbsi_uid);
    return [NSString stringWithUTF8String:passwd->pw_name];
}

@end

Из документации по NSRunningApplication: отслеживаются только пользовательские приложения; это не дает информацию о каждом процессе в системе.

Т.е. это не даст вам всех процессов в системе.

Самое близкое, что вы можете сделать, это взять runningApplications от NSWorkspace, Но это будет неполный список.

Кроме того, вы можете перейти к тем же API, которые система использует в Activity Monitor. Но это будет больно. Или вы могли бы запустить ps auxwww из NSTask и разбора вывода, тоже больно.

Класс NSRunningApplication предоставит вам только экземпляры приложений, запускаемых ТЕКУЩИМ ПОЛЬЗОВАТЕЛЕМ. Если несколько пользователей одновременно входят в систему на Mac, каждый из которых запускает свои собственные приложения, NSRunningApplication НЕ будет предоставлять список запущенных приложений для всех вошедших в систему пользователей. Только приложения звонящего пользователя.

Тем не менее, вопрос ОП переводится как «Каково мое имя пользователя», потому что любой экземпляр NSRunningApplication будет принадлежать и управляться этим пользователем,

Важное примечание: NSRunningApplication возвращает только основные процессы связанных приложений. Он НЕ будет предоставлять подпроцессы (службы XPC, элементы входа в систему, агенты демонов, инструменты командной строки и т. д.). Многие приложения сегодня делегируют большую часть своей работы одному из этих подпроцессов и не фиксируются.

Другие вопросы по тегам