데브몬 (Obj C로 작성)이 실행 중이고 일부 사용자가 로그인 할 때 일부 작업을 수행하고 싶습니다. 데몬이 특정시기 사용자가 OSX에서 로그인 또는 로그 아웃합니까? 로그인 할 때 알림이 표시됩니까? Log in Item 또는 Launch Agent의 사용을 피하고 싶습니다. 또한 타이머를 폴링하여 로그인 한 사용자를 확인하지 않으려합니다.사용자가 MAC에 로그인 할 때를 알 수있는 데몬
답변
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
}
}
로그인 사용자가 변경 될 필요는 없습니다. 동일한 사용자가 로그 아웃하고 다시 로그인하더라도 알림을 받고 싶습니다. –
요구 사항에 따라 callBackFunction을 수정할 수 있습니다. 사용자가 로그 아웃하고 로그인 할 때 전화를받을 수 있습니다. –
사용자가 로그 아웃하면 콘솔 사용자가 "loginWindow"로 변경되었다는 알림을 받게됩니다. 로그인을하면 콘솔 사용자가 "loginwindow"에서 "Some user"로 변경되었다는 알림을 받게됩니다. –
어떻게 프로그램이 데몬과 코코아 응용 프로그램이 될 수 있습니까? – trojanfoe
나는 그것을 Obj C로 작성했다. Ques 편집하기 –
그건 좋은 질문이다. 데몬이 * 루트 세션 *에 있는지 확인할 수 있습니까? (https://developer.apple.com/library/mac/documentation/macosx/conceptual/BPMultipleUsers/Concepts/SystemContexts.html#//apple_ref/doc/uid/ 20002208-BCICFCJH)? – trojanfoe