특정 시점에 현재 로그인 한 사용자를 다른 미리 설정된 사용자로 전환해야하는 Mac 응용 프로그램을 구축 중입니다. 본질적으로 수정 된 로그인 창.코코아 - 강제로 사용자 전환 하시겠습니까?
코코아를 사용하여이를 수행 할 수있는 방법이 있습니까?
- 아리
편집 : 입력 암호로 사용자를 필요로하지하는 방법이 있나요?
특정 시점에 현재 로그인 한 사용자를 다른 미리 설정된 사용자로 전환해야하는 Mac 응용 프로그램을 구축 중입니다. 본질적으로 수정 된 로그인 창.코코아 - 강제로 사용자 전환 하시겠습니까?
코코아를 사용하여이를 수행 할 수있는 방법이 있습니까?
- 아리
편집 : 입력 암호로 사용자를 필요로하지하는 방법이 있나요?
내 솔루션을 말하기 전에 @ 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
(로그인 화면)의 창이 하나 이상 표시되면 암호 입력을 시뮬레이트 한 다음 암호를 입력 한 상태에서 로그인 창이 열리면 결과를 입력하십시오. 또한 지연이 없습니다.
비슷한 질문에 대한 대답으로 설명했듯이 "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는 모든면에서 안전하지 않습니다. 그러나 당신은 here과 here이 필요한 것을 모을 수 있습니다.
안녕하세요. 나는 고통스럽지 않습니다. 당신의 대답은 훌륭합니다. 질문을 업데이트했습니다. 추가 할 수 있습니까? –
내 편집을 참조하십시오. 그게 내가 찾아 낼 수있는 전부지만, 구글은 끝이 아니다. – jrodatus
고마워, 나는 지난 밤에 실제로 그걸 생각해 냈어! 그러나 좋은 대답! –