2014-04-24 9 views
4

데브몬 (Obj C로 작성)이 실행 중이고 일부 사용자가 로그인 할 때 일부 작업을 수행하고 싶습니다. 데몬이 특정시기 사용자가 OSX에서 로그인 또는 로그 아웃합니까? 로그인 할 때 알림이 표시됩니까? Log in Item 또는 Launch Agent의 사용을 피하고 싶습니다. 또한 타이머를 폴링하여 로그인 한 사용자를 확인하지 않으려합니다.사용자가 MAC에 로그인 할 때를 알 수있는 데몬

+0

어떻게 프로그램이 데몬과 코코아 응용 프로그램이 될 수 있습니까? – trojanfoe

+0

나는 그것을 Obj C로 작성했다. Ques 편집하기 –

+0

그건 좋은 질문이다. 데몬이 * 루트 세션 *에 있는지 확인할 수 있습니까? (https://developer.apple.com/library/mac/documentation/macosx/conceptual/BPMultipleUsers/Concepts/SystemContexts.html#//apple_ref/doc/uid/ 20002208-BCICFCJH)? – trojanfoe

답변

6

SCDynamicStoreCopyConsoleUser을 사용하여 콘솔 사용자 이름을 가져옵니다.

CFStringRef consoleUserName = nil; 
uid_t  uid; 
gid_t  gid; 
consoleUserName = SCDynamicStoreCopyConsoleUser(NULL, &uid, &gid); 

일부 멤버 변수에는 consoleUserName이 저장됩니다. 지금 SCDynamicStoreCreate

 SCDynamicStoreRef store; 
    CFStringRef   key; 
    CFArrayRef   keys; 
    CFRunLoopSourceRef rls; 
    store = SCDynamicStoreCreate(
            NULL, 
            CFSTR("com.apple.dts.ConsoleUser"), 
            callBackFunction, 
            NULL 
            ); 

    // Set it up to notify us when the console user value changes. 

    key = SCDynamicStoreKeyCreateConsoleUser(NULL); 
    assert(key != NULL); 

    keys = CFArrayCreate(NULL, (const void **) &key, 1, &kCFTypeArrayCallBacks); 
    //assert(keys != NULL); 

    success = SCDynamicStoreSetNotificationKeys(store, keys, NULL); 
    //assert(success); 

    // Add it to the runloop. 

    rls = SCDynamicStoreCreateRunLoopSource(NULL, store, 0); 
    // assert(rls != NULL); 

    CFRunLoopAddSource(CFRunLoopGetCurrent(), rls, kCFRunLoopDefaultMode); 


    mConsoleUserName = CopyCurrentConsoleUsername(store); 
    CFRunLoopRun(); 

    CFRunLoopSourceInvalidate(rls); 
    CFRelease(rls); 
    CFRelease(keys); 
    CFRelease(key); 
    CFRelease(store); 

callBackFunction 함수를 구현하여 시스템 구성 서버에 의해 유지 된 동적 저장소와 상호 작용하는 세션을 생성한다. 콘솔 사용자 값이 변경되면 콜백을 받게됩니다.

static void callBackFunction(
           SCDynamicStoreRef store, 
           CFArrayRef   changedKeys, 
           void *    info 
           ) 
{ 
    CFStringRef   currentConsoleUser; 
    Boolean    didChange; 

    // Get the current console user. 

    currentConsoleUser = CopyCurrentConsoleUsername(store); 

    if (currentConsoleUser == NULL) 
    { 
     return; 
    } 
    didChange = ! CFEqual(storedvalue, currentConsoleUser); 
    if (![currentConsoleUser isEqualToString:@"loginwindow"]) 
    { 
     // pass this value to some method 
    } 
} 
+0

로그인 사용자가 변경 될 필요는 없습니다. 동일한 사용자가 로그 아웃하고 다시 로그인하더라도 알림을 받고 싶습니다. –

+0

요구 사항에 따라 callBackFunction을 수정할 수 있습니다. 사용자가 로그 아웃하고 로그인 할 때 전화를받을 수 있습니다. –

+0

사용자가 로그 아웃하면 콘솔 사용자가 "loginWindow"로 변경되었다는 알림을 받게됩니다. 로그인을하면 콘솔 사용자가 "loginwindow"에서 "Some user"로 변경되었다는 알림을 받게됩니다. –