c - قائمة بجميع المستخدمين والمجموعات




objective-c cocoa (4)

أحاول الحصول على قائمة بجميع المستخدمين وجميع المجموعات على نظام التشغيل Mac OS X 10.5 والإصدارات الأحدث. كيف يمكنني أن أفعل هذا؟

على سبيل المثال ، يجب أن تظهر قائمة جميع المستخدمين على جهازي: _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 (التي تم تجميعها بعناية بشكل يدوي).

كيف يمكنني الحصول على تلك القائمة (والقائمة المقابلة لكل المجموعات) برمجيًا؟ أنا منفتح على حلول بديلة (غير معتمدة على c) ، مثل Applescript ، أو commandline ، إلخ.

تحديث وقت طويل في وقت لاحق

لقد دفعتني إجابة تالاما للتحقيق في واجهة برمجة التطبيقات إلى الدليل المفتوح ، ووجدت أن هذه القائمة يمكن الحصول عليها بسهولة برمجيًا:

#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]);
}

سيؤدي ذلك إلى تسجيل أسماء المستخدمين لكل مستخدم على النظام. سيؤدي kODRecordTypeGroups في kODRecordTypeGroups إلى الحصول على قائمة بكل المجموعات.

إن -[ODQuery resultsAllowingPartial:error:] الطريقة هي استدعاء حظر ، لذلك إما أن ترغب في تنفيذ هذا الرمز على مؤشر ترابط الخلفية ، أو استخدام <ODQueryDelegate> لتجميع النتائج.


أوامر non-garbbled / no-tempfile:

# dscl . list /users
# dscl . list /groups

تحقق ، على سبيل المثال ، dsexport .

وهنا بعض الأمثلة:

dsexport /tmp/export.out /Local/Default dsRecTypeStandard:Groups

dsexport /tmp/export.out /Local/Default dsRecTypeStandard:Users

المخرجات هراء قليلاً ، لكن شيئًا مثل Sed يمكنه تنظيفها لك.


من المؤكد تقريبا أن الأداة التي تريدها هي dscl. تم بالفعل الإشارة إلى أقصر الطرق للقيام بذلك:

$ dscl . list /users
$ dscl . list /groups

إذا كنت ترغب في إخراج معلومات حول كل مستخدم ، على الرغم من ذلك ، استخدم readall :

$ dscl . readall /users
$ dscl . readall /groups

وإذا كنت بحاجة إلى تحليل المعلومات المذكورة بشكل مبرمج ، استخدم -سهلة لجعل حياتك أسهل:

$ dscl -plist . readall /users
$ dscl -plist . readall /groups

نهج الدليل المفتوح (من: http://rickcogley.blogspot.com/2008/11/listing-open-directory-users-on-os-x.html ):

dscacheutil -q user
dscacheutil -q group

تأخذ كل سطر من الإخراج المعني الذي يبدأ بـ "الاسم:" أزل الشريط من "الاسم:" ولديك قائمة. إذا لم يكن لديك dscacheutil ، فيمكنك استخدام الأوامر اليدوية:

root# dscl localhost list /Local/Default/Users
root# dscl localhost list /LDAPv3/127.0.0.1/Users

نهج المدرسة القديمة قبل فتح الدليل .... (تنهد): للحصول على قائمة المستخدمين:

  • الاستيلاء على الملف / etc / passwd من النظام.
  • تقسيمها من قبل الخطوط
  • قسّم كل سطر استنادًا إلى ":"
  • خذ الرمز الأول لكل سطر

لقائمة المجموعات:

  • الاستيلاء على الملف / etc / group من النظام.
  • تقسيمها من قبل الخطوط
  • قسّم كل سطر استنادًا إلى ":"
  • خذ الرمز الأول لكل سطر




carbon