diff --git a/go.mod b/go.mod index cb531252e..b53f7015f 100644 --- a/go.mod +++ b/go.mod @@ -16,6 +16,7 @@ require ( golang.org/x/exp v0.0.0-20230321023759-10a507213a29 golang.org/x/image v0.8.0 golang.org/x/sys v0.9.0 + howett.net/plist v1.0.0 ) require ( diff --git a/go.sum b/go.sum index b6f6fcaba..ef5657c7b 100644 --- a/go.sum +++ b/go.sum @@ -23,6 +23,7 @@ github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/jamesruan/go-rfc1924 v0.0.0-20170108144916-2767ca7c638f h1:Ko4+g6K16vSyUrtd/pPXuQnWsiHe5BYptEtTxfwYwCc= github.com/jamesruan/go-rfc1924 v0.0.0-20170108144916-2767ca7c638f/go.mod h1:eHzfhOKbTGJEGPSdMHzU6jft192tHHt2Bu2vIZArvC0= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/lufia/plan9stats v0.0.0-20230326075908-cb1d2100619a h1:N9zuLhTvBSRt0gWSiJswwQ2HqDmtX/ZCDJURnKUt1Ik= github.com/lufia/plan9stats v0.0.0-20230326075908-cb1d2100619a/go.mod h1:JKx41uQRwqlTZabZc+kILPrO/3jlKnQ2Z8b7YiVw5cE= @@ -98,6 +99,9 @@ golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0/go.mod h1:WDnlLJ4WF5VGsH/HVa3CI79GS0ol3YnhVnKP89i0kNg= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +howett.net/plist v1.0.0 h1:7CrbWYbPPO/PyNy38b2EB/+gYbjCe2DXBxgtOOZbSQM= +howett.net/plist v1.0.0/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g= diff --git a/tools/utils/passwd.go b/tools/utils/passwd.go new file mode 100644 index 000000000..0b996d5d3 --- /dev/null +++ b/tools/utils/passwd.go @@ -0,0 +1,171 @@ +// License: GPLv3 Copyright: 2023, Kovid Goyal, + +package utils + +import ( + "fmt" + "os" + "os/exec" + "os/user" + "runtime" + "strconv" + "strings" + + "howett.net/plist" +) + +var _ = fmt.Print + +type PasswdEntry struct { + Username, Pass, Uid, Gid, Gecos, Home, Shell string +} + +func ParsePasswdLine(line string) (PasswdEntry, error) { + parts := strings.Split(line, ":") + if len(parts) == 7 { + return PasswdEntry{parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6]}, nil + } + return PasswdEntry{}, fmt.Errorf("passwd line has %d colon delimited fields instead of 7", len(parts)) +} + +func ParsePasswdDatabase(raw string) (ans map[string]PasswdEntry) { + scanner := NewLineScanner(raw) + ans = make(map[string]PasswdEntry) + for scanner.Scan() { + line := scanner.Text() + if entry, e := ParsePasswdLine(line); e == nil { + ans[entry.Uid] = entry + } + } + return ans +} + +func ParsePasswdFile(path string) (ans map[string]PasswdEntry, err error) { + raw, err := os.ReadFile(path) + if err != nil { + return nil, err + } + return ParsePasswdDatabase(UnsafeBytesToString(raw)), nil +} + +var passwd_err error +var passwd_database = Once(func() (ans map[string]PasswdEntry) { + ans, passwd_err = ParsePasswdFile("/etc/passwd") + return +}) + +func PwdEntryForUid(uid string) (ans PasswdEntry, err error) { + pwd := passwd_database() + if passwd_err != nil { + return ans, passwd_err + } + ans, found := pwd[uid] + if !found { + return ans, fmt.Errorf("No user matching the UID: %#v found", uid) + } + return ans, nil +} + +func parse_dscl_data(raw []byte) (ans map[string]PasswdEntry, err error) { + var pd []any + _, err = plist.Unmarshal(raw, &pd) + if err != nil { + return + } + ans = make(map[string]PasswdEntry, 256) + for _, entry := range pd { + if e, ok := entry.(map[string]any); ok { + item := PasswdEntry{} + for key, a := range e { + array, ok := a.([]any) + if !ok || len(array) == 0 || !strings.HasPrefix(key, "dsAttrTypeNative:") { + continue + } + _, key, _ = strings.Cut(key, ":") + if val, ok := array[0].(string); ok { + switch key { + case "uid": + item.Uid = val + case "gid": + item.Gid = val + case "home": + item.Home = val + case "name": + item.Username = val + case "realname": + item.Gecos = val + case "shell": + item.Shell = val + } + } + } + ans[item.Uid] = item + } + } + return +} + +var dscl_error error + +var dscl_user_database = Once(func() map[string]PasswdEntry { + c := exec.Command("/usr/bin/dscl", "-plist", ".", "-readall", "/Users", "uid", "gid", "name", "realname", "home", "shell") + raw, err := c.Output() + if err != nil { + dscl_error = err + return nil + } + ans, err := parse_dscl_data(raw) + if err != nil { + dscl_error = err + return nil + } + return ans + +}) + +func LoginShellForUser(u *user.User) (ans string, err error) { + var db map[string]PasswdEntry + switch runtime.GOOS { + case "darwin": + db = dscl_user_database() + err = dscl_error + default: + db = passwd_database() + err = passwd_err + } + if err != nil { + return + } + if rec, found := db[u.Uid]; found { + return rec.Shell, nil + } + return ans, fmt.Errorf("No user record available for user with UID: %#v", u.Uid) +} + +func CurrentUser() (ans *user.User, err error) { + ans, err = user.Current() + if err != nil && runtime.GOOS == "darwin" { + uid := strconv.Itoa(os.Geteuid()) + db := dscl_user_database() + if dscl_error != nil { + err = dscl_error + return + } + if rec, found := db[uid]; found { + u := user.User{Uid: uid, Gid: rec.Gid, Username: rec.Username, Name: rec.Gecos, HomeDir: rec.Home} + ans = &u + err = nil + } else { + err = fmt.Errorf("Could not find the current uid: %d in the DSCL user database", os.Geteuid()) + } + } + return +} + +func LoginShellForCurrentUser() (ans string, err error) { + u, err := CurrentUser() + if err != nil { + return ans, err + } + return LoginShellForUser(u) +} diff --git a/tools/utils/passwd_test.go b/tools/utils/passwd_test.go new file mode 100644 index 000000000..3885f3961 --- /dev/null +++ b/tools/utils/passwd_test.go @@ -0,0 +1,3697 @@ +// License: GPLv3 Copyright: 2023, Kovid Goyal, + +package utils + +import ( + "fmt" + "testing" + + "github.com/google/go-cmp/cmp" +) + +var _ = fmt.Print + +func TestGettingLoginShell(t *testing.T) { + entries, err := parse_dscl_data([]byte(all_users_plist)) + if err != nil { + t.Fatal(err) + } + if diff := cmp.Diff(entries[`501`].Shell, "/bin/zsh"); diff != "" { + t.Fatalf("Failed to parse dscl data for shell. %v %s", entries[`501`], diff) + } + if _, e := CurrentUser(); e != nil { + t.Fatal(e) + } + if sh, e := LoginShellForCurrentUser(); e != nil || sh == "" { + t.Fatalf("Failed to get login shell for current user with error: %s", e) + } +} + +// plist test data {{{ +const all_users_plist string = ` + + + + + + dsAttrTypeNative:gid + + 278 + + dsAttrTypeNative:home + + /var/db/accessoryupdater + + dsAttrTypeNative:name + + _accessoryupdater + + dsAttrTypeNative:realname + + Accessory Update Daemon + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 278 + + dsAttrTypeStandard:RecordName + + _accessoryupdater + + + + dsAttrTypeNative:gid + + 83 + + dsAttrTypeNative:home + + /var/virusmails + + dsAttrTypeNative:name + + _amavisd + amavisd + + dsAttrTypeNative:realname + + AMaViS Daemon + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 83 + + dsAttrTypeStandard:RecordName + + _amavisd + amavisd + + + + dsAttrTypeNative:gid + + 263 + + dsAttrTypeNative:home + + /var/db/analyticsd + + dsAttrTypeNative:name + + _analyticsd + + dsAttrTypeNative:realname + + Analytics Daemon + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 263 + + dsAttrTypeStandard:RecordName + + _analyticsd + + + + dsAttrTypeNative:gid + + 273 + + dsAttrTypeNative:home + + /var/db/appinstalld + + dsAttrTypeNative:name + + _appinstalld + + dsAttrTypeNative:realname + + App Install Daemon + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 273 + + dsAttrTypeStandard:RecordName + + _appinstalld + + + + dsAttrTypeNative:gid + + 55 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _appleevents + + dsAttrTypeNative:realname + + AppleEvents Daemon + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 55 + + dsAttrTypeStandard:RecordName + + _appleevents + + + + dsAttrTypeNative:gid + + 260 + + dsAttrTypeNative:home + + /var/db/applepay + + dsAttrTypeNative:name + + _applepay + + dsAttrTypeNative:realname + + applepay Account + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 260 + + dsAttrTypeStandard:RecordName + + _applepay + + + + dsAttrTypeNative:gid + + 87 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _appowner + appowner + + dsAttrTypeNative:realname + + Application Owner + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 87 + + dsAttrTypeStandard:RecordName + + _appowner + appowner + + + + dsAttrTypeNative:gid + + 79 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _appserver + appserver + + dsAttrTypeNative:realname + + Application Server + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 79 + + dsAttrTypeStandard:RecordName + + _appserver + appserver + + + + dsAttrTypeNative:gid + + 33 + + dsAttrTypeNative:home + + /var/db/appstore + + dsAttrTypeNative:name + + _appstore + + dsAttrTypeNative:realname + + Mac App Store Service + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 33 + + dsAttrTypeStandard:RecordName + + _appstore + + + + dsAttrTypeNative:gid + + 67 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _ard + + dsAttrTypeNative:realname + + Apple Remote Desktop + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 67 + + dsAttrTypeStandard:RecordName + + _ard + + + + dsAttrTypeNative:gid + + 235 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _assetcache + + dsAttrTypeNative:realname + + Asset Cache Service + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 235 + + dsAttrTypeStandard:RecordName + + _assetcache + + + + dsAttrTypeNative:gid + + 245 + + dsAttrTypeNative:home + + /var/db/astris + + dsAttrTypeNative:name + + _astris + + dsAttrTypeNative:realname + + Astris Services + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 245 + + dsAttrTypeStandard:RecordName + + _astris + + + + dsAttrTypeNative:gid + + 97 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _atsserver + atsserver + + dsAttrTypeNative:realname + + ATS Server + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 97 + + dsAttrTypeStandard:RecordName + + _atsserver + atsserver + + + + dsAttrTypeNative:gid + + -2 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _avbdeviced + + dsAttrTypeNative:realname + + Ethernet AVB Device Daemon + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 229 + + dsAttrTypeStandard:RecordName + + _avbdeviced + + + + dsAttrTypeNative:gid + + 288 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _avphidbridge + + dsAttrTypeNative:realname + + Apple Virtual Platform HID Bridge + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 288 + + dsAttrTypeStandard:RecordName + + _avphidbridge + + + + dsAttrTypeNative:gid + + 291 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _backgroundassets + + dsAttrTypeNative:realname + + Background Assets Service + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 291 + + dsAttrTypeStandard:RecordName + + _backgroundassets + + + + dsAttrTypeNative:gid + + 289 + + dsAttrTypeNative:home + + /var/db/biome + + dsAttrTypeNative:name + + _biome + + dsAttrTypeNative:realname + + Biome + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 289 + + dsAttrTypeStandard:RecordName + + _biome + + + + dsAttrTypeNative:gid + + 93 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _calendar + calendar + + dsAttrTypeNative:realname + + Calendar + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 93 + + dsAttrTypeStandard:RecordName + + _calendar + calendar + + + + dsAttrTypeNative:gid + + 258 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _captiveagent + + dsAttrTypeNative:realname + + captiveagent + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 258 + + dsAttrTypeStandard:RecordName + + _captiveagent + + + + dsAttrTypeNative:gid + + 32 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _ces + + dsAttrTypeNative:realname + + Certificate Enrollment Service + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 32 + + dsAttrTypeStandard:RecordName + + _ces + + + + dsAttrTypeNative:gid + + 82 + + dsAttrTypeNative:home + + /var/virusmails + + dsAttrTypeNative:name + + _clamav + clamav + + dsAttrTypeNative:realname + + ClamAV Daemon + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 82 + + dsAttrTypeStandard:RecordName + + _clamav + clamav + + + + dsAttrTypeNative:gid + + 262 + + dsAttrTypeNative:home + + /var/db/cmiodalassistants + + dsAttrTypeNative:name + + _cmiodalassistants + + dsAttrTypeNative:realname + + CoreMedia IO Assistants User + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 262 + + dsAttrTypeStandard:RecordName + + _cmiodalassistants + + + + dsAttrTypeNative:gid + + 202 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _coreaudiod + + dsAttrTypeNative:realname + + Core Audio Daemon + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 202 + + dsAttrTypeStandard:RecordName + + _coreaudiod + + + + dsAttrTypeNative:gid + + 236 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _coremediaiod + + dsAttrTypeNative:realname + + Core Media IO Daemon + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 236 + + dsAttrTypeStandard:RecordName + + _coremediaiod + + + + dsAttrTypeNative:gid + + 280 + + dsAttrTypeNative:home + + /var/db/coreml + + dsAttrTypeNative:name + + _coreml + + dsAttrTypeNative:realname + + CoreML Services + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 280 + + dsAttrTypeStandard:RecordName + + _coreml + + + + dsAttrTypeNative:gid + + 259 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _ctkd + + dsAttrTypeNative:realname + + ctkd Account + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 259 + + dsAttrTypeStandard:RecordName + + _ctkd + + + + dsAttrTypeNative:gid + + 212 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _cvmsroot + + dsAttrTypeNative:realname + + CVMS Root + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 212 + + dsAttrTypeStandard:RecordName + + _cvmsroot + + + + dsAttrTypeNative:gid + + 72 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _cvs + + dsAttrTypeNative:realname + + CVS Server + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 72 + + dsAttrTypeStandard:RecordName + + _cvs + + + + dsAttrTypeNative:gid + + 6 + + dsAttrTypeNative:home + + /var/imap + + dsAttrTypeNative:name + + _cyrus + cyrusimap + + dsAttrTypeNative:realname + + Cyrus Administrator + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 77 + + dsAttrTypeStandard:RecordName + + _cyrus + cyrusimap + + + + dsAttrTypeNative:gid + + 284 + + dsAttrTypeNative:home + + /var/db/darwindaemon + + dsAttrTypeNative:name + + _darwindaemon + + dsAttrTypeNative:realname + + Darwin Daemon + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 284 + + dsAttrTypeStandard:RecordName + + _darwindaemon + + + + dsAttrTypeNative:gid + + 257 + + dsAttrTypeNative:home + + /var/db/datadetectors + + dsAttrTypeNative:name + + _datadetectors + + dsAttrTypeNative:realname + + DataDetectors + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 257 + + dsAttrTypeStandard:RecordName + + _datadetectors + + + + dsAttrTypeNative:gid + + 275 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _demod + + dsAttrTypeNative:realname + + Demo Daemon + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 275 + + dsAttrTypeStandard:RecordName + + _demod + + + + dsAttrTypeNative:gid + + 59 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _devdocs + devdocs + + dsAttrTypeNative:realname + + Developer Documentation + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 59 + + dsAttrTypeStandard:RecordName + + _devdocs + devdocs + + + + dsAttrTypeNative:gid + + 220 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _devicemgr + + dsAttrTypeNative:realname + + Device Management Server + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 220 + + dsAttrTypeStandard:RecordName + + _devicemgr + + + + dsAttrTypeNative:gid + + 271 + + dsAttrTypeNative:home + + /var/db/diskimagesiod + + dsAttrTypeNative:name + + _diskimagesiod + + dsAttrTypeNative:realname + + DiskImages IO Daemon + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 271 + + dsAttrTypeStandard:RecordName + + _diskimagesiod + + + + dsAttrTypeNative:gid + + 244 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _displaypolicyd + + dsAttrTypeNative:realname + + Display Policy Daemon + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 244 + + dsAttrTypeStandard:RecordName + + _displaypolicyd + + + + dsAttrTypeNative:gid + + 241 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _distnote + + dsAttrTypeNative:realname + + DistNote + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 241 + + dsAttrTypeStandard:RecordName + + _distnote + + + + dsAttrTypeNative:gid + + 6 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _dovecot + + dsAttrTypeNative:realname + + Dovecot Administrator + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 214 + + dsAttrTypeStandard:RecordName + + _dovecot + + + + dsAttrTypeNative:gid + + 227 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _dovenull + + dsAttrTypeNative:realname + + Dovecot Authentication + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 227 + + dsAttrTypeStandard:RecordName + + _dovenull + + + + dsAttrTypeNative:gid + + 215 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _dpaudio + + dsAttrTypeNative:realname + + DP Audio + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 215 + + dsAttrTypeStandard:RecordName + + _dpaudio + + + + dsAttrTypeNative:gid + + 270 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _driverkit + + dsAttrTypeNative:realname + + DriverKit + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 270 + + dsAttrTypeStandard:RecordName + + _driverkit + + + + dsAttrTypeNative:gid + + 71 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _eppc + eppc + + dsAttrTypeNative:realname + + Apple Events User + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 71 + + dsAttrTypeStandard:RecordName + + _eppc + eppc + + + + dsAttrTypeNative:gid + + 254 + + dsAttrTypeNative:home + + /var/db/findmydevice + + dsAttrTypeNative:name + + _findmydevice + + dsAttrTypeNative:realname + + Find My Device Daemon + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 254 + + dsAttrTypeStandard:RecordName + + _findmydevice + + + + dsAttrTypeNative:gid + + 265 + + dsAttrTypeNative:home + + /var/db/fpsd + + dsAttrTypeNative:name + + _fpsd + + dsAttrTypeNative:realname + + FPS Daemon + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 265 + + dsAttrTypeStandard:RecordName + + _fpsd + + + + dsAttrTypeNative:gid + + -2 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _ftp + ftp + + dsAttrTypeNative:realname + + FTP Daemon + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 98 + + dsAttrTypeStandard:RecordName + + _ftp + ftp + + + + dsAttrTypeNative:gid + + 247 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _gamecontrollerd + + dsAttrTypeNative:realname + + Game Controller Daemon + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 247 + + dsAttrTypeStandard:RecordName + + _gamecontrollerd + + + + dsAttrTypeNative:gid + + 56 + + dsAttrTypeNative:home + + /var/db/geod + + dsAttrTypeNative:name + + _geod + + dsAttrTypeNative:realname + + Geo Services Daemon + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 56 + + dsAttrTypeStandard:RecordName + + _geod + + + + dsAttrTypeNative:gid + + 261 + + dsAttrTypeNative:home + + /var/db/hidd + + dsAttrTypeNative:name + + _hidd + + dsAttrTypeNative:realname + + HID Service User + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 261 + + dsAttrTypeStandard:RecordName + + _hidd + + + + dsAttrTypeNative:gid + + 240 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _iconservices + + dsAttrTypeNative:realname + + IconServices + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 240 + + dsAttrTypeStandard:RecordName + + _iconservices + + + + dsAttrTypeNative:gid + + 25 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _installassistant + + dsAttrTypeNative:realname + + Install Assistant + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 25 + + dsAttrTypeStandard:RecordName + + _installassistant + + + + dsAttrTypeNative:gid + + 274 + + dsAttrTypeNative:home + + /var/db/installcoordinationd + + dsAttrTypeNative:name + + _installcoordinationd + + dsAttrTypeNative:realname + + Install Coordination Daemon + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 274 + + dsAttrTypeStandard:RecordName + + _installcoordinationd + + + + dsAttrTypeNative:gid + + -2 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _installer + + dsAttrTypeNative:realname + + Installer + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 96 + + dsAttrTypeStandard:RecordName + + _installer + + + + dsAttrTypeNative:gid + + 84 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _jabber + jabber + + dsAttrTypeNative:realname + + Jabber XMPP Server + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 84 + + dsAttrTypeStandard:RecordName + + _jabber + jabber + + + + dsAttrTypeNative:gid + + -2 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _kadmin_admin + + dsAttrTypeNative:realname + + Kerberos Admin Service + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 218 + + dsAttrTypeStandard:RecordName + + _kadmin_admin + + + + dsAttrTypeNative:gid + + -2 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _kadmin_changepw + + dsAttrTypeNative:realname + + Kerberos Change Password Service + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 219 + + dsAttrTypeStandard:RecordName + + _kadmin_changepw + + + + dsAttrTypeNative:gid + + 279 + + dsAttrTypeNative:home + + /var/db/knowledgegraphd + + dsAttrTypeNative:name + + _knowledgegraphd + + dsAttrTypeNative:realname + + Knowledge Graph Daemon + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 279 + + dsAttrTypeStandard:RecordName + + _knowledgegraphd + + + + dsAttrTypeNative:gid + + -2 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _krb_anonymous + + dsAttrTypeNative:realname + + Open Directory Kerberos Anonymous + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 234 + + dsAttrTypeStandard:RecordName + + _krb_anonymous + + + + dsAttrTypeNative:gid + + -2 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _krb_changepw + + dsAttrTypeNative:realname + + Open Directory Kerberos Change Password Service + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 232 + + dsAttrTypeStandard:RecordName + + _krb_changepw + + + + dsAttrTypeNative:gid + + -2 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _krb_kadmin + + dsAttrTypeNative:realname + + Open Directory Kerberos Admin Service + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 231 + + dsAttrTypeStandard:RecordName + + _krb_kadmin + + + + dsAttrTypeNative:gid + + -2 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _krb_kerberos + + dsAttrTypeNative:realname + + Open Directory Kerberos + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 233 + + dsAttrTypeStandard:RecordName + + _krb_kerberos + + + + dsAttrTypeNative:gid + + -2 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _krb_krbtgt + + dsAttrTypeNative:realname + + Open Directory Kerberos Ticket Granting Ticket + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 230 + + dsAttrTypeStandard:RecordName + + _krb_krbtgt + + + + dsAttrTypeNative:gid + + -2 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _krbfast + + dsAttrTypeNative:realname + + Kerberos FAST Account + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 246 + + dsAttrTypeStandard:RecordName + + _krbfast + + + + dsAttrTypeNative:gid + + -2 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _krbtgt + + dsAttrTypeNative:realname + + Kerberos Ticket Granting Ticket + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 217 + + dsAttrTypeStandard:RecordName + + _krbtgt + + + + dsAttrTypeNative:gid + + 239 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _launchservicesd + + dsAttrTypeNative:realname + + _launchservicesd + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 239 + + dsAttrTypeStandard:RecordName + + _launchservicesd + + + + dsAttrTypeNative:gid + + 211 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _lda + + dsAttrTypeNative:realname + + Local Delivery Agent + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 211 + + dsAttrTypeStandard:RecordName + + _lda + + + + dsAttrTypeNative:gid + + 205 + + dsAttrTypeNative:home + + /var/db/locationd + + dsAttrTypeNative:name + + _locationd + + dsAttrTypeNative:realname + + Location Daemon + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 205 + + dsAttrTypeStandard:RecordName + + _locationd + + + + dsAttrTypeNative:gid + + 272 + + dsAttrTypeNative:home + + /var/db/diagnostics + + dsAttrTypeNative:name + + _logd + + dsAttrTypeNative:realname + + Log Daemon + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 272 + + dsAttrTypeStandard:RecordName + + _logd + + + + dsAttrTypeNative:gid + + 26 + + dsAttrTypeNative:home + + /var/spool/cups + + dsAttrTypeNative:name + + _lp + lp + + dsAttrTypeNative:realname + + Printing Services + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 26 + + dsAttrTypeStandard:RecordName + + _lp + lp + + + + dsAttrTypeNative:gid + + 78 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _mailman + mailman + + dsAttrTypeNative:realname + + Mailman List Server + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 78 + + dsAttrTypeStandard:RecordName + + _mailman + mailman + + + + dsAttrTypeNative:gid + + 248 + + dsAttrTypeNative:home + + /var/setup + + dsAttrTypeNative:name + + _mbsetupuser + + dsAttrTypeNative:realname + + Setup User + + dsAttrTypeNative:shell + + /bin/bash + + dsAttrTypeNative:uid + + 248 + + dsAttrTypeStandard:RecordName + + _mbsetupuser + + + + dsAttrTypeNative:gid + + 54 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _mcxalr + mcxalr + + dsAttrTypeNative:realname + + MCX AppLaunch + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 54 + + dsAttrTypeStandard:RecordName + + _mcxalr + mcxalr + + + + dsAttrTypeNative:gid + + 65 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _mdnsresponder + + dsAttrTypeNative:realname + + mDNSResponder + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 65 + + dsAttrTypeStandard:RecordName + + _mdnsresponder + + + + dsAttrTypeNative:gid + + 283 + + dsAttrTypeNative:home + + /var/db/mmaintenanced + + dsAttrTypeNative:name + + _mmaintenanced + + dsAttrTypeNative:realname + + mmaintenanced + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 283 + + dsAttrTypeStandard:RecordName + + _mmaintenanced + + + + dsAttrTypeNative:gid + + 253 + + dsAttrTypeNative:home + + /var/ma + + dsAttrTypeNative:name + + _mobileasset + + dsAttrTypeNative:realname + + MobileAsset User + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 253 + + dsAttrTypeStandard:RecordName + + _mobileasset + + + + dsAttrTypeNative:gid + + 74 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _mysql + mysql + + dsAttrTypeNative:realname + + MySQL Server + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 74 + + dsAttrTypeStandard:RecordName + + _mysql + mysql + + + + dsAttrTypeNative:gid + + 268 + + dsAttrTypeNative:home + + /var/db/nearbyd + + dsAttrTypeNative:name + + _nearbyd + + dsAttrTypeNative:realname + + Proximity and Ranging Daemon + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 268 + + dsAttrTypeStandard:RecordName + + _nearbyd + + + + dsAttrTypeNative:gid + + 222 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _netbios + + dsAttrTypeNative:realname + + NetBIOS + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 222 + + dsAttrTypeStandard:RecordName + + _netbios + + + + dsAttrTypeNative:gid + + 228 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _netstatistics + + dsAttrTypeNative:realname + + Network Statistics Daemon + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 228 + + dsAttrTypeStandard:RecordName + + _netstatistics + + + + dsAttrTypeNative:gid + + 24 + + dsAttrTypeNative:home + + /var/networkd + + dsAttrTypeNative:name + + _networkd + + dsAttrTypeNative:realname + + Network Services + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 24 + + dsAttrTypeStandard:RecordName + + _networkd + + + + dsAttrTypeNative:gid + + 285 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _notification_proxy + + dsAttrTypeNative:realname + + Notification Proxy + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 285 + + dsAttrTypeStandard:RecordName + + _notification_proxy + + + + dsAttrTypeNative:gid + + 242 + + dsAttrTypeNative:home + + /var/db/nsurlsessiond + + dsAttrTypeNative:name + + _nsurlsessiond + + dsAttrTypeNative:realname + + NSURLSession Daemon + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 242 + + dsAttrTypeStandard:RecordName + + _nsurlsessiond + + + + dsAttrTypeNative:gid + + 243 + + dsAttrTypeNative:home + + /var/db/nsurlstoraged + + dsAttrTypeNative:name + + _nsurlstoraged + + dsAttrTypeNative:realname + + _nsurlstoraged + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 243 + + dsAttrTypeStandard:RecordName + + _nsurlstoraged + + + + dsAttrTypeNative:gid + + 441 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _oahd + + dsAttrTypeNative:realname + + OAH Daemon + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 441 + + dsAttrTypeStandard:RecordName + + _oahd + + + + dsAttrTypeNative:gid + + 249 + + dsAttrTypeNative:home + + /var/db/ondemand + + dsAttrTypeNative:name + + _ondemand + + dsAttrTypeNative:realname + + On Demand Resource Daemon + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 249 + + dsAttrTypeStandard:RecordName + + _ondemand + + + + dsAttrTypeNative:gid + + 27 + + dsAttrTypeNative:home + + /var/spool/postfix + + dsAttrTypeNative:name + + _postfix + postfix + + dsAttrTypeNative:realname + + Postfix Mail Server + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 27 + + dsAttrTypeStandard:RecordName + + _postfix + postfix + + + + dsAttrTypeNative:gid + + 216 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _postgres + + dsAttrTypeNative:realname + + PostgreSQL Server + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 216 + + dsAttrTypeStandard:RecordName + + _postgres + + + + dsAttrTypeNative:gid + + 76 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _qtss + qtss + + dsAttrTypeNative:realname + + QuickTime Streaming Server + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 76 + + dsAttrTypeStandard:RecordName + + _qtss + qtss + + + + dsAttrTypeNative:gid + + 269 + + dsAttrTypeNative:home + + /var/db/reportmemoryexception + + dsAttrTypeNative:name + + _reportmemoryexception + + dsAttrTypeNative:realname + + ReportMemoryException + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 269 + + dsAttrTypeStandard:RecordName + + _reportmemoryexception + + + + dsAttrTypeNative:gid + + 277 + + dsAttrTypeNative:home + + /var/db/rmd + + dsAttrTypeNative:name + + _rmd + + dsAttrTypeNative:realname + + Remote Management Daemon + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 277 + + dsAttrTypeStandard:RecordName + + _rmd + + + + dsAttrTypeNative:gid + + 60 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _sandbox + sandbox + + dsAttrTypeNative:realname + + Seatbelt + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 60 + + dsAttrTypeStandard:RecordName + + _sandbox + sandbox + + + + dsAttrTypeNative:gid + + 203 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _screensaver + + dsAttrTypeNative:realname + + Screensaver + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 203 + + dsAttrTypeStandard:RecordName + + _screensaver + + + + dsAttrTypeNative:gid + + 31 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _scsd + + dsAttrTypeNative:realname + + Service Configuration Service + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 31 + + dsAttrTypeStandard:RecordName + + _scsd + + + + dsAttrTypeNative:gid + + 92 + + dsAttrTypeNative:home + + /var/db/securityagent + + dsAttrTypeNative:name + + _securityagent + securityagent + + dsAttrTypeNative:realname + + SecurityAgent + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 92 + + dsAttrTypeStandard:RecordName + + _securityagent + securityagent + + + + dsAttrTypeNative:gid + + 58 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _serialnumberd + serialnumberd + + dsAttrTypeNative:realname + + _serialnumberd + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 58 + + dsAttrTypeStandard:RecordName + + _serialnumberd + serialnumberd + + + + dsAttrTypeNative:gid + + 281 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _sntpd + + dsAttrTypeNative:realname + + SNTP Server Daemon + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 281 + + dsAttrTypeStandard:RecordName + + _sntpd + + + + dsAttrTypeNative:gid + + 200 + + dsAttrTypeNative:home + + /var/db/softwareupdate + + dsAttrTypeNative:name + + _softwareupdate + + dsAttrTypeNative:realname + + Software Update Service + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 200 + + dsAttrTypeStandard:RecordName + + _softwareupdate + + + + dsAttrTypeNative:gid + + 89 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _spotlight + spotlight + + dsAttrTypeNative:realname + + Spotlight + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 89 + + dsAttrTypeStandard:RecordName + + _spotlight + spotlight + + + + dsAttrTypeNative:gid + + 75 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _sshd + sshd + + dsAttrTypeNative:realname + + sshd Privilege separation + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 75 + + dsAttrTypeStandard:RecordName + + _sshd + sshd + + + + dsAttrTypeNative:gid + + 73 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _svn + + dsAttrTypeNative:realname + + SVN Server + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 73 + + dsAttrTypeStandard:RecordName + + _svn + + + + dsAttrTypeNative:gid + + 13 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _taskgated + + dsAttrTypeNative:realname + + Task Gate Daemon + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 13 + + dsAttrTypeStandard:RecordName + + _taskgated + + + + dsAttrTypeNative:gid + + 94 + + dsAttrTypeNative:home + + /var/teamsserver + + dsAttrTypeNative:name + + _teamsserver + teamsserver + + dsAttrTypeNative:realname + + TeamsServer + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 94 + + dsAttrTypeStandard:RecordName + + _teamsserver + teamsserver + + + + dsAttrTypeNative:gid + + 266 + + dsAttrTypeNative:home + + /var/db/timed + + dsAttrTypeNative:name + + _timed + + dsAttrTypeNative:realname + + Time Sync Daemon + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 266 + + dsAttrTypeStandard:RecordName + + _timed + + + + dsAttrTypeNative:gid + + 210 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _timezone + + dsAttrTypeNative:realname + + AutoTimeZoneDaemon + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 210 + + dsAttrTypeStandard:RecordName + + _timezone + + + + dsAttrTypeNative:gid + + 91 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _tokend + tokend + + dsAttrTypeNative:realname + + Token Daemon + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 91 + + dsAttrTypeStandard:RecordName + + _tokend + tokend + + + + dsAttrTypeNative:gid + + 282 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _trustd + + dsAttrTypeNative:realname + + trustd + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 282 + + dsAttrTypeStandard:RecordName + + _trustd + + + + dsAttrTypeNative:gid + + 208 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _trustevaluationagent + + dsAttrTypeNative:realname + + Trust Evaluation Agent + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 208 + + dsAttrTypeStandard:RecordName + + _trustevaluationagent + + + + dsAttrTypeNative:gid + + 99 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _unknown + unknown + + dsAttrTypeNative:realname + + Unknown User + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 99 + + dsAttrTypeStandard:RecordName + + _unknown + unknown + + + + dsAttrTypeNative:gid + + -2 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _update_sharing + + dsAttrTypeNative:realname + + Update Sharing + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 95 + + dsAttrTypeStandard:RecordName + + _update_sharing + + + + dsAttrTypeNative:gid + + 213 + + dsAttrTypeNative:home + + /var/db/lockdown + + dsAttrTypeNative:name + + _usbmuxd + + dsAttrTypeNative:realname + + iPhone OS Device Helper + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 213 + + dsAttrTypeStandard:RecordName + + _usbmuxd + + + + dsAttrTypeNative:gid + + 4 + + dsAttrTypeNative:home + + /var/spool/uucp + + dsAttrTypeNative:name + + _uucp + + dsAttrTypeNative:realname + + Unix to Unix Copy Protocol + + dsAttrTypeNative:shell + + /usr/sbin/uucico + + dsAttrTypeNative:uid + + 4 + + dsAttrTypeStandard:RecordName + + _uucp + + + + dsAttrTypeNative:gid + + 224 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _warmd + + dsAttrTypeNative:realname + + Warm Daemon + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 224 + + dsAttrTypeStandard:RecordName + + _warmd + + + + dsAttrTypeNative:gid + + 221 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _webauthserver + + dsAttrTypeNative:realname + + Web Auth Server + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 221 + + dsAttrTypeStandard:RecordName + + _webauthserver + + + + dsAttrTypeNative:gid + + 88 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _windowserver + windowserver + + dsAttrTypeNative:realname + + WindowServer + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 88 + + dsAttrTypeStandard:RecordName + + _windowserver + windowserver + + + + dsAttrTypeNative:gid + + 70 + + dsAttrTypeNative:home + + /Library/WebServer + + dsAttrTypeNative:name + + _www + www + + dsAttrTypeNative:realname + + World Wide Web Server + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 70 + + dsAttrTypeStandard:RecordName + + _www + www + + + + dsAttrTypeNative:gid + + 252 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _wwwproxy + + dsAttrTypeNative:realname + + WWW Proxy + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 252 + + dsAttrTypeStandard:RecordName + + _wwwproxy + + + + dsAttrTypeNative:gid + + 251 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + _xserverdocs + + dsAttrTypeNative:realname + + macOS Server Documents Service + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 251 + + dsAttrTypeStandard:RecordName + + _xserverdocs + + + + dsAttrTypeNative:gid + + 1 + + dsAttrTypeNative:home + + /var/root + + dsAttrTypeNative:name + + daemon + + dsAttrTypeNative:realname + + System Services + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + 1 + + dsAttrTypeStandard:RecordName + + daemon + + + + dsAttrTypeNative:gid + + 20 + + dsAttrTypeNative:home + + /Users/kovid + + dsAttrTypeNative:name + + kovid + com.apple.idms.appleid.prd.001239-05-db37ae71-1475-47b3-9cd5-d749f085f52d + + dsAttrTypeNative:realname + + Kovid Goyal + + dsAttrTypeNative:shell + + /bin/zsh + + dsAttrTypeNative:uid + + 501 + + dsAttrTypeStandard:RecordName + + kovid + com.apple.idms.appleid.prd.001239-05-db37ae71-1475-47b3-9cd5-d749f085f52d + + + + dsAttrTypeNative:gid + + -2 + + dsAttrTypeNative:home + + /var/empty + + dsAttrTypeNative:name + + nobody + + dsAttrTypeNative:realname + + Unprivileged User + + dsAttrTypeNative:shell + + /usr/bin/false + + dsAttrTypeNative:uid + + -2 + + dsAttrTypeStandard:RecordName + + nobody + + + + dsAttrTypeNative:gid + + 0 + + dsAttrTypeNative:home + + /var/root + /private/var/root + + dsAttrTypeNative:name + + root + BUILTIN\Local System + + dsAttrTypeNative:realname + + System Administrator + + dsAttrTypeNative:shell + + /bin/sh + + dsAttrTypeNative:uid + + 0 + + dsAttrTypeStandard:RecordName + + root + BUILTIN\Local System + + + + +` // }}}