I'm trying to get a list of all users and all groups on Mac OS X 10.5+. How can I do this?
For example, the list of all users on my machine should return: _amavisd, _appowner, _appserver, _ard, _atsserver, _calendar, _carddav, _clamav, _coreaudiod, _cvmsroot, _cvs, _cyrus, _devdocs, _dovecot, _eppc, _installer, _jabber, _lda, _locationd, _lp, _mailman, _mcxalr, _mdnsresponder, _mysql, _pcastagent, _pcastserver, _postfix, _qtss, _sandbox, _screensaver, _securityagent, _serialnumberd, _softwareupdate, _spotlight, _sshd, _svn, _teamsserver, _timezone, _tokend, _trustevaluationagent, _unknown, _update_sharing, _usbmuxd, _uucp, _windowserver, _www, _xgridagent, _xgridcontroller, daemon, dave, nobody, root
(that was painstakingly compiled manually).
How can I get that list (and the corresponding list of all groups) programmatically? I'm open to alternative (non-c based) solutions, such as Applescript, commandline, etc.
Update a long time later
TALlama's answer prompted me to investigate the API to Open Directory, and I found that this list can be easily acquired programmatically:
#import <OpenDirectory/OpenDirectory.h> ODSession *s = [ODSession defaultSession]; ODNode *root = [ODNode nodeWithSession:s name:@"/Local/Default" error:nil]; ODQuery *q = [ODQuery queryWithNode:root forRecordTypes:kODRecordTypeUsers attribute:nil matchType:0 queryValues:nil returnAttributes:nil maximumResults:0 error:nil]; NSArray *results = [q resultsAllowingPartial:NO error:nil]; for (ODRecord *r in results) { NSLog(@"%@", [r recordName]); }
That will log the usernames of every user on the system. Substituting in kODRecordTypeGroups
will get you the list of all the groups.
The -[ODQuery resultsAllowingPartial:error:]
method is a blocking call, so you'd either want to execute this code on a background thread, or use an <ODQueryDelegate>
to aggregate the results.
Using getent As we know, the /etc/group file defines the groups on the Linux system, whereas the /etc/passwd file describes its user login accounts. Unlike the /etc/group file, which contains the user names for a given group, the /etc/passwd file only contains the associated group's GID.
Use the most commonly used “cat” command to get the list of the groups available in the “/etc/group” file. When you run the command, you will get the list of the groups.
Open the Ubuntu Terminal through Ctrl+Alt+T or through the Dash or connect to the Ubuntu system by SSH. This command lists all the groups that you belong to.
The tool you want is almost certainly dscl. The shortest way to do it was already pointed out:
$ dscl . list /users $ dscl . list /groups
If you want to output information about each user, though, use readall
:
$ dscl . readall /users $ dscl . readall /groups
And if you need to programatically parse said information, use -plist to make your life easier:
$ dscl -plist . readall /users $ dscl -plist . readall /groups
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With