我有一個守護進程(寫在Obj C中)正在運行,並且我想在某些用戶登錄時執行某些操作。守護進程有可能知道某個特定用戶在OSX中登錄或註銷?登錄發生時是否有任何通知?我想避免使用登錄項或啓動代理。另外我想避免在定時器上輪詢以檢查登錄用戶。守護進程知道用戶何時登錄到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」到「某些用戶」的通知 –
- 1. 用Python登錄尾部守護進程
- 2. 允許守護進程用戶SSH登錄密鑰
- 3. MAC更改程序或守護進程?
- 4. 在用戶登錄註銷時啓動和停止守護進程
- 5. 守護進程未登錄到自定義日誌文件
- 6. 爲Mac OS X安裝守護進程
- 7. Mac守護進程howto(由'book')
- 8. 在MAC OSX中啓動守護進程
- 9. 定時器()作爲守護進程與非守護進程
- 10. 我應該如何從非root用戶的Debian Linux守護進程登錄?
- 11. 守護進程監控/登錄在Linux(應用計數器)
- 12. 查殺未知啓動守護進程
- 13. 如何知道用戶登錄
- 14. Linux守護進程
- 15. iphone守護進程
- 16. Python守護進程
- 17. 如何守護進程?
- 18. 使用python,守護進程
- 19. 用Clojure/JVM守護進程
- 20. 如何在Mac上使用/啓動gradle守護進程?
- 21. Azure活動目錄守護進程客戶端使用證書
- 22. Linux守護進程停止啓動 - 停止守護進程
- 23. 無法連接到Mac上的Docker守護進程
- 24. java守護進程線程
- 25. 如何知道用戶已經跨應用程序登錄
- 26. 網絡地圖/ mon工具阻塞telnet守護進程/登錄進程
- 27. 要知道何時登錄超時
- 28. 如何知道調用進程的登錄會話LUID?
- 29. CakePHP - 知道用戶登錄到我的應用程序的時間和日期
- 30. UWSGI不能登錄到我的logto /守護進程指定的文件
程序如何既可以是守護進程又可以是Cocoa應用程序? – trojanfoe
我打算寫它在Obj C ..編輯Ques –
這是一個很好的問題。你能否確認你的守護進程在* root會話中*(https://developer.apple.com/library/mac/documentation/macosx/conceptual/BPMultipleUsers/Concepts/SystemContexts.html#//apple_ref/doc/uid/ 20002208-BCICFCJH)? – trojanfoe