2013-11-28 5 views
0

Я создаю приложение для Mac, которое в определенное время должно переключать текущего пользователя в другой, заданный. По сути, это измененное окно входа в систему.Какао - заставить пользователя переключиться?

Есть ли способ сделать это с использованием какао?

- Ари

Редактировать: Есть ли способ, чтобы не требовать от пользователя ввода его пароля?

ответ

1

Прежде чем я скажу свое решение, я хочу сказать, что ответ @ jrodatus превосходный, он просто для немного другого варианта использования.

я придумал эту маленькую AppleScript:

set theUser to "user" 
set theUser to do shell script "/usr/bin/id -u " & theUser 
set password to "pswd" 
do shell script "/System/Library/CoreServices/Menu\\ Extras/User.menu/Contents/Resources/CGSession -switchToUserID " & theUser 
repeat 
    try 
     tell application "System Events" 
      repeat until visible of process "SecurityAgent" is false 
       set visible of process "SecurityAgent" to false 
      end repeat 
      keystroke password 
      keystroke return 
     end tell 
     exit repeat 
    on error 
     tell application "System Events" 
     end tell 
    end try 
end repeat 

Это просто вызывает экран входа в систему, с -switchToUserID набором для идентификатора пользователя с именем пользователя в. Затем, когда отображается хотя бы одно окно SecurityAgent (экран входа в систему), имитируйте нажатие клавиши пароля, затем введите результат, когда откроется окно входа в систему, с введенным паролем. Кроме того, у этого нет задержек.

1

Как объяснено в ответ на аналогичный вопрос 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.

+0

Привет, я ненавижу быть болью. Ваш ответ превосходный. Я обновил вопрос, не могли бы вы добавить. –

+0

Хорошо, см. Мое редактирование. Это все, что я мог найти, но Google не конец. – jrodatus

+0

Спасибо, я действительно придумал это прошлой ночью! Но хороший ответ! –

 Смежные вопросы

  • Нет связанных вопросов^_^