Найти пользователя, который запустил 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, элементы входа в систему, агенты демонов, инструменты командной строки и т. д.). Многие приложения сегодня делегируют большую часть своей работы одному из этих подпроцессов и не фиксируются.