문제

Mac OS X 로그인 창, /system/library/coreservices/loginwindow.app를 사용자 정의 로그인 창 응용 프로그램으로 교체 할 수 있습니까? (그렇게하려면 합리적으로 참조하십시오.)

내 코코아 프로그래밍 기술이 초보적인 일이 두렵습니다. 나는 probe cgsession을 실행할 때 ( 빠른 사용자 스위칭을 수행하는 서류 미비 유틸리티) 수행하여 사용하는 기능을 확인합니다

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

연결된 함수 중 하나는 다음과 같습니다.

(undefined [lazy bound]) external _CGSCreateLoginSession (from ApplicationServices)

ApplicationServices 프레임 워크에 대한 문서를 찾지 못했습니다. 애플리케이션 프로그래머 인터페이스 대신 서비스 제공 업체 인터페이스에 깊이 빠져들고있는 것으로 보입니다.

나는 정말 흥미로운 스 니펫을 발견했다 : (Google 캐시) (다운 페이지에 직접 링크; 빠른 사용자 전환이 비활성화되어 있어도 로그인 창으로 전환한다고 주장하는 응용 프로그램에서 사이트가 재구성되고있는 것으로 보입니다.

#include "CGSInternal.h"

int main (int argc, const char * argv[]) {
    // switch to the login window
    CGSCreateLoginSession(NULL);

    return 0;
}

나는 CG를 CoreGraphics를 의미하기 위해 CG를 가져 가고 로그인과 관련된 것이 무엇인지 이해하지 못합니다 (아마도 현재 사용자의 작업에 대한 로그인 대화 상자를 제외하고는 제외).

로그인 창을 대체 할 수없는 경우 에도이 라인을 따라 할 수있는 일 (Apple에서 일하지 않는 사람들)이 무엇을 할 수 있는지 알고 싶습니다.

도움이 되었습니까?

해결책

로그인 창 응용 프로그램은 시작 구성의 일부로 정의됩니다. /system/library/launchdaemons/com.apple.loginwindow.plist.

이론적으로 로그인 창을 자신의 것으로 바꿀 수는 있지만 새 앱에서 무엇을 해야하는지 모르겠습니다. 로그인 창이 인증과 사용자 세션 설정보다 조금 더 많은 것을 수행한다고 생각합니다. 출시 관련 집안일을하는 것 같습니다.

호출하는 응용 프로그램을 컴파일했습니다 cgscreateLoginsession 일단 실행되면 회전 큐브를 통해 로그인 창으로 전환됩니다. 이것이 CoreGraphics가 필요한 이유라고 생각합니다. 마지막에 로그 아웃을 호출하는 그래픽 기능 일뿐입니다.

입력 관리자를 시도하고 로그인 창이 코드를로드 할 수 있습니다 .-> 그렇다면 로그인 위도우 펜촉을 변경할 수 있습니다 (loginwindowui.nib) 그리고 사용자 브라우저를 사용하여 새 창을 표시하기 위해 버튼을 추가하십시오. 학생이 자신의 사진을 선택하면 LoginWindow의 사용자 이름과 비밀번호 필드를 자동으로 수렴 할 수 있습니다.

노드 이것은 모든 이론이며 보입니다 매우 연약하고 안전하지 않습니다.

행운을 빕니다.

나중에 편집

이것은 매우 안전하지 않으므로 조심스럽게 사용하십시오 - 나는이 물건을 시험해 볼 때 내 시스템을 몇 번 호스했다.

다음은 LoginWindow에서 코드를 주입하는 개념 증명 구현입니다.

#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <strings.h>
#include <syslog.h>

#import <Cocoa/Cocoa.h>

#include <execinfo.h>

@interface LLApp:NSApplication
@end
@implementation LLApp
- (void)run
{
    syslog(LOG_ERR, "LLApp being run");
    [super run];
}
@end

void my_openlog(const char *ident, int logopt, int facility);

typedef struct interpose_s 
{
        void * new_func;
        void * orig_func;
} interpose_t;

int MyNSApplicationMain(int argc,  const char ** argv);


static const interpose_t interposers[] __attribute__ ((section("__DATA, __interpose")))     = {
{ (void *) my_openlog, (void *) openlog },
};

void my_openlog(const char *ident, int logopt, int facility)
{
        openlog(ident, logopt, facility);

    if(!strcmp(ident, "/System/Library/CoreServices/loginwindow.app/Contents/MacOS/loginwindow"))
    {

        [LLApp poseAsClass:[NSApplication class]];
    }
    else
    {
        syslog(LOG_ERR, "Ignoring unknown indent: >%s<", ident);
    }
    return;
}

코드는 다음과 컴파일합니다.

gcc -Wall -dynamiclib -undefined dynamic_lookup -o ~/Desktop/libinterposers.dylib testin.m -framework Cocoa

코드 로딩은 중재를 기반으로하므로 LoginWindow의 시작 정의에는 추가 항목이 포함되어야합니다 (동적 링커에서 중재를 활성화하기 위해) : 즉 :

<key>EnvironmentVariables</key>
<dict>    
    <key>DYLD_INSERT_LIBRARIES</key>
    <string>path_to/Desktop/libinterposers.dylib</string>
</dict>

다른 팁

예, sfauthorizationpluginview를 사용할 수 있습니다

여기 ADC의 참조 링크가 있습니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top