Как объяснено в ответ на аналогичный вопрос here, в папке «Система» есть инструмент командной строки под названием «CGSession», который должен делать то, что вам нужно. Чтобы запустить инструмент командной строки внутри приложения Cocoa, просмотрите NSTask.
Для переключения пользователей напрямую, узнать идентификатор пользователя UNIX вашего заданного пользователя, запустив «идентификатор -u theUserName», а затем использовать выход в качестве аргумента для выполнения:
/System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -switchToUserID theUserIDNumber
или просто добраться до окно входа в систему (без выхода из системы), запуск:
/System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -suspend
Ниже приведена краткая категория Obj-C для NSWorkspace.
NSWorkspace-SwitchUser.h:
#import <Cocoa/Cocoa.h>
@interface NSWorkspace (SwitchUser)
-(BOOL)switchToUser:(NSString *)userName;
@end
NSWorkspace-SwitchUser.m:
#import "NSWorkspace-SwitchUser.h"
#import <sys/types.h>
#import <pwd.h>
#import <stdlib.h>
#import <unistd.h>
#import <stdio.h>
@implementation NSWorkspace (SwitchUser)
-(BOOL)switchToUser:(NSString *)userName {
struct passwd *pwd = malloc(sizeof(struct passwd));
if (!pwd) {
NSLog(@"Couldn't allocate struct passwd for getpwnam_r.");
return FALSE;
}
size_t buf_len = sysconf(_SC_GETPW_R_SIZE_MAX) * sizeof(char);
char *buffer = malloc(buf_len);
if (!buffer) {
NSLog(@"Couldn't allocate buffer for getpwnam_r.");
return FALSE;
}
getpwnam_r([userName UTF8String], pwd, buffer, buf_len, &pwd);
if (!pwd) {
NSLog(@"getpwnam_r failed to find the requested user.");
return FALSE;
}
uid_t userID = pwd->pw_uid;
free(pwd);
free(buffer);
// Run CGSession with the -switchToUserID argument
NSTask *cgsTask = [NSTask launchedTaskWithLaunchPath:@"/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession"
arguments:[NSArray arrayWithObjects:@"-switchToUserID",[NSString stringWithFormat:@"%u",userID],nil]];
// Wait till the task completes.
// Should be able to use -[NSTask waitUntilExit] instead, but it wasn't working for me :-P
while ([cgsTask isRunning]) {
usleep(100000);
}
return ([cgsTask terminationStatus] == 0);
}
@end
Edit: Если вам нужно переключить пользователей, не требуя от пользователя ввести свой пароль, то похоже, не имеет никакого способа сделать это без AppleScript, что ИМО небезопасно во всех смыслах этого слова. Но вы можете получить то, что вам нужно here и here.
Привет, я ненавижу быть болью. Ваш ответ превосходный. Я обновил вопрос, не могли бы вы добавить. –
Хорошо, см. Мое редактирование. Это все, что я мог найти, но Google не конец. – jrodatus
Спасибо, я действительно придумал это прошлой ночью! Но хороший ответ! –