def disable_fde_autologin(): '''Disables autologin to the unlocking user's account on a FileVault- encrypted machines.''' # See https://support.apple.com/en-us/HT202842 # We attempt to store the original value of com.apple.loginwindow # DisableFDEAutoLogin so if the local admin has set it to True for #reasons # we don't inadvertently clear it when clearing bootstrap mode # is OriginalDisableFDEAutoLogin already set? If so, bootstrap mode was # already enabled, and never properly cleared. Don't stomp on it. original_value = CFPreferencesCopyValue('OriginalDisableFDEAutoLogin', 'com.apple.loginwindow', kCFPreferencesAnyUser, kCFPreferencesCurrentHost) if not original_value: # get the current value of DisableFDEAutoLogin if any original_value = CFPreferencesCopyValue('DisableFDEAutoLogin', 'com.apple.loginwindow', kCFPreferencesAnyUser, kCFPreferencesCurrentHost) if not original_value: # we need a way to record the original value was not set, # and we can't store None... original_value = '<not set>' # store it so we can restore it later CFPreferencesSetValue('OriginalDisableFDEAutoLogin', original_value, 'com.apple.loginwindow', kCFPreferencesAnyUser, kCFPreferencesCurrentHost) # set com.apple.loginwindow DisableFDEAutoLogin to True CFPreferencesSetValue('DisableFDEAutoLogin', True, 'com.apple.loginwindow', kCFPreferencesAnyUser, kCFPreferencesCurrentHost) CFPreferencesAppSynchronize('com.apple.loginwindow')
def getSoftwareUpdatePref(prefname): '''Returns a preference from /Library/Preferences/com.apple.SoftwareUpdate using CoreFoundation methods''' return CFPreferencesCopyValue(prefname, 'com.apple.SoftwareUpdate', kCFPreferencesAnyUser, kCFPreferencesCurrentHost)
def get_config_level(domain, pref_name, value): '''Returns a string indicating where the given preference is defined''' if value is None: return '[not set]' if CFPreferencesAppValueIsForced(pref_name, domain): return '[MANAGED]' # define all the places we need to search, in priority order levels = [ { 'file': ('/var/root/Library/Preferences/ByHost/' '%s.xxxx.plist' % domain), 'domain': domain, 'user': kCFPreferencesCurrentUser, 'host': kCFPreferencesCurrentHost }, { 'file': '/var/root/Library/Preferences/%s.plist' % domain, 'domain': domain, 'user': kCFPreferencesCurrentUser, 'host': kCFPreferencesAnyHost }, { 'file': ('/var/root/Library/Preferences/ByHost/' '.GlobalPreferences.xxxx.plist'), 'domain': '.GlobalPreferences', 'user': kCFPreferencesCurrentUser, 'host': kCFPreferencesCurrentHost }, { 'file': '/var/root/Library/Preferences/.GlobalPreferences.plist', 'domain': '.GlobalPreferences', 'user': kCFPreferencesCurrentUser, 'host': kCFPreferencesAnyHost }, { 'file': '/Library/Preferences/%s.plist' % domain, 'domain': domain, 'user': kCFPreferencesAnyUser, 'host': kCFPreferencesCurrentHost }, { 'file': '/Library/Preferences/.GlobalPreferences.plist', 'domain': '.GlobalPreferences', 'user': kCFPreferencesAnyUser, 'host': kCFPreferencesCurrentHost }, ] for level in levels: if (value == CFPreferencesCopyValue(pref_name, level['domain'], level['user'], level['host'])): return '[%s]' % level['file'] if value == DEFAULT_PREFS.get(pref_name): return '[default]' return '[unknown]'
def get_receipts(): """Get the delivery receipts for the current console user""" receipts = CFPreferencesCopyValue( "DeliveryReceipts", BUNDLE_ID, get_console_user()[0], kCFPreferencesAnyHost) # Convert result into a mutable python dict. return dict(receipts) if receipts else {}
def reset_fde_autologin(): '''Resets the state of com.apple.loginwindow DisableFDEAutoLogin to its value before we set it to True''' # get the previous value of DisableFDEAutoLogin if any original_value = CFPreferencesCopyValue( 'OriginalDisableFDEAutoLogin', 'com.apple.loginwindow', kCFPreferencesAnyUser, kCFPreferencesCurrentHost) if original_value == '<not set>': original_value = None # reset DisableFDEAutoLogin to original value (if original_value is None, # the key gets deleted) CFPreferencesSetValue( 'DisableFDEAutoLogin', original_value, 'com.apple.loginwindow', kCFPreferencesAnyUser, kCFPreferencesCurrentHost) # delete the OriginalDisableFDEAutoLogin key CFPreferencesSetValue( 'OriginalDisableFDEAutoLogin', None, 'com.apple.loginwindow', kCFPreferencesAnyUser, kCFPreferencesCurrentHost) CFPreferencesAppSynchronize('com.apple.loginwindow')
def schedule_notification(args): """Schedule a notification to be delivered to users""" # Get the arguments from the system-level preferences (i.e. # /Library/Preferences/com.sheagcraig.yo.plist). This precludes us # from using the _slightly_ shorter CFPreferencesCopyAppValue. notifications = CFPreferencesCopyValue("Notifications", BUNDLE_ID, kCFPreferencesAnyUser, kCFPreferencesAnyHost) # We get an immutable NSCFDictionary back from CFPreferences, so # copy it to a mutable python dict. notifications = dict(notifications) if notifications else {} # Convert args to string representation of a python list for later # reconversion back to python. notifications[repr(args)] = NSDate.alloc().init() CFPreferencesSetValue("Notifications", notifications, BUNDLE_ID, kCFPreferencesAnyUser, kCFPreferencesAnyHost) # Use the simpler `AppSynchroniize`; it seems to flush all changes, # despite having to use the primitive methods above. CFPreferencesAppSynchronize(BUNDLE_ID)
def fixSpotlight(): DISABLED_ITEMS = set(["MENU_WEBSEARCH", "MENU_SPOTLIGHT_SUGGESTIONS"]) REQUIRED_ITEM_KEYS = set(["enabled", "name"]) BUNDLE_ID = "com.apple.Spotlight" PREF_NAME = "orderedItems" DEFAULT_VALUE = [{ 'enabled': True, 'name': 'APPLICATIONS' }, { 'enabled': False, 'name': 'MENU_SPOTLIGHT_SUGGESTIONS' }, { 'enabled': True, 'name': 'MENU_CONVERSION' }, { 'enabled': True, 'name': 'MENU_EXPRESSION' }, { 'enabled': True, 'name': 'MENU_DEFINITION' }, { 'enabled': True, 'name': 'SYSTEM_PREFS' }, { 'enabled': True, 'name': 'DOCUMENTS' }, { 'enabled': True, 'name': 'DIRECTORIES' }, { 'enabled': True, 'name': 'PRESENTATIONS' }, { 'enabled': True, 'name': 'SPREADSHEETS' }, { 'enabled': True, 'name': 'PDF' }, { 'enabled': True, 'name': 'MESSAGES' }, { 'enabled': True, 'name': 'CONTACT' }, { 'enabled': True, 'name': 'EVENT_TODO' }, { 'enabled': True, 'name': 'IMAGES' }, { 'enabled': True, 'name': 'BOOKMARKS' }, { 'enabled': True, 'name': 'MUSIC' }, { 'enabled': True, 'name': 'MOVIES' }, { 'enabled': True, 'name': 'FONTS' }, { 'enabled': True, 'name': 'MENU_OTHER' }, { 'enabled': False, 'name': 'MENU_WEBSEARCH' }] items = CFPreferencesCopyValue(PREF_NAME, BUNDLE_ID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost) newItems = None if items is None or len(items) is 0: # Actual preference values are populated on demand; if the user # hasn't previously configured Spotlight, the preference value # will be unavailable newItems = DEFAULT_VALUE else: newItems = NSMutableArray.new() for item in items: missing_keys = [] for key in REQUIRED_ITEM_KEYS: if not item.has_key(key): missing_keys.append(key) if len(missing_keys) != 0: print "Preference item %s is missing expected keys (%s), skipping" % ( item, missing_keys) newItems.append(item) continue if item["name"] not in DISABLED_ITEMS: newItems.append(item) continue newItem = NSMutableDictionary.dictionaryWithDictionary_(item) newItem.setObject_forKey_(0, "enabled") newItems.append(newItem) CFPreferencesSetValue(PREF_NAME, newItems, BUNDLE_ID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost) CFPreferencesSynchronize(BUNDLE_ID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost)
def get_config_level(bundle_id, pref_name, value, showPath): '''Returns a string indicating where the given preference is defined''' if value is None: return 'not set' if CFPreferencesAppValueIsForced(pref_name, bundle_id): return 'Managed' home_dir = os.path.expanduser('~') # define all the places we need to search, in priority order levels = [ { 'location': 'User/ByHost', 'file': os.path.join(home_dir, 'Library/Preferences/ByHost', bundle_id + '.xxxx.plist'), 'domain': bundle_id, 'user': kCFPreferencesCurrentUser, 'host': kCFPreferencesCurrentHost }, { 'location': 'User', 'file': os.path.join(home_dir, 'Library/Preferences/', bundle_id + '.plist'), 'domain': bundle_id, 'user': kCFPreferencesCurrentUser, 'host': kCFPreferencesAnyHost }, { 'location': 'User/ByHost/Global', 'file': os.path.join(home_dir, 'Library/Preferences/ByHost', '.GlobalPreferences.xxxx.plist'), 'domain': kCFPreferencesAnyApplication, 'user': kCFPreferencesCurrentUser, 'host': kCFPreferencesCurrentHost }, { 'location': 'User/Global', 'file': os.path.join(home_dir, 'Library/Preferences', '.GlobalPreferences.plist'), 'domain': kCFPreferencesAnyApplication, 'user': kCFPreferencesCurrentUser, 'host': kCFPreferencesAnyHost }, { 'location': 'Computer', 'file': os.path.join('/Library/Preferences', bundle_id + '.plist'), 'domain': bundle_id, 'user': kCFPreferencesAnyUser, 'host': kCFPreferencesCurrentHost }, { 'location': 'Computer/Global', 'file': '/Library/Preferences/.GlobalPreferences.plist', 'domain': kCFPreferencesAnyApplication, 'user': kCFPreferencesAnyUser, 'host': kCFPreferencesCurrentHost }, ] for level in levels: if (value == CFPreferencesCopyValue(pref_name, level['domain'], level['user'], level['host'])): if showPath: return level['file'] else: return level['location'] return 'unknown'
def get_key(key): """Returns the keys in Defaults""" return CFPreferencesCopyValue(key, kCFPreferencesAnyApplication, kCFPreferencesCurrentUser, kCFPreferencesAnyHost)
#!/usr/bin/python from Foundation import CFPreferencesCopyValue, \ kCFPreferencesCurrentUser, \ kCFPreferencesAnyUser, \ kCFPreferencesCurrentHost, \ kCFPreferencesAnyHost, \ kCFPreferencesAnyApplication # User's ByHost (defaults -currentHost read) print "Screen Saver: idleTime = ", print CFPreferencesCopyValue("idleTime", "com.apple.screensaver", kCFPreferencesCurrentUser, kCFPreferencesCurrentHost) # User (defaults read) print "Screen Saver: askForPassword = "******"askForPassword", "com.apple.screensaver", kCFPreferencesCurrentUser, kCFPreferencesAnyHost) # User, global domain print "Global Domain: AppleLanguages = ", print CFPreferencesCopyValue("AppleLanguages", kCFPreferencesAnyApplication, kCFPreferencesCurrentUser, kCFPreferencesAnyHost) # all Users (defaults read /Library/Preferences/) print "Login Window: lastUserName = "******"lastUserName", "com.apple.loginwindow", kCFPreferencesAnyUser, kCFPreferencesCurrentHost) # all Users, global print "All Users, Global: AppleLanguages = ", print CFPreferencesCopyValue("AppleLanguages", kCFPreferencesAnyApplication, kCFPreferencesAnyUser, kCFPreferencesCurrentHost)