2013-11-28 2 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 

이 단순히 사용자 이름의 사용자 ID에 -switchToUserID 세트, 로그인 화면을 트리거합니다. 그런 다음 SecurityAgent (로그인 화면)의 창이 하나 이상 표시되면 암호 입력을 시뮬레이트 한 다음 암호를 입력 한 상태에서 로그인 창이 열리면 결과를 입력하십시오. 또한 지연이 없습니다.

1

비슷한 질문에 대한 대답으로 설명했듯이 "CGSession"이라는 명령 줄 도구가 시스템 폴더에 숨겨져있어 필요한 작업을 수행 할 수 있습니다. Cocoa 응용 프로그램에서 명령 줄 도구를 실행하려면 NSTask를 살펴보십시오.

직접 사용자를 전환 "theUserName -u ID"를 실행하여 미리 설정된 사용자의 UNIX 사용자 ID를 찾아 다음 실행을위한 인수로 출력을 사용하려면

/System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -switchToUserID theUserIDNumber 

또는 단지에 도착를 로그인 창 (로그 아웃하지 않음) :

/System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -suspend 

다음은 NSWorkspace의 빠른 Obj-C 카테고리입니다.

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 

편집 : 당신이 암호를 입력하도록 요구하지 않고 사용자를 전환해야하는 경우가를 AppleScript 없이는 그렇게 할 수있는 방법이 아닌 것 같습니다. IMO는 모든면에서 안전하지 않습니다. 그러나 당신은 herehere이 필요한 것을 모을 수 있습니다.

+0

안녕하세요. 나는 고통스럽지 않습니다. 당신의 대답은 훌륭합니다. 질문을 업데이트했습니다. 추가 할 수 있습니까? –

+0

내 편집을 참조하십시오. 그게 내가 찾아 낼 수있는 전부지만, 구글은 끝이 아니다. – jrodatus

+0

고마워, 나는 지난 밤에 실제로 그걸 생각해 냈어! 그러나 좋은 대답! –

관련 문제