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



objective-c cocoa macos carbon (5)

أحاول الحصول على قائمة بجميع المستخدمين وجميع المجموعات على نظام التشغيل 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> لتجميع النتائج.


Answers

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

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

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

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

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

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

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

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

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

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

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


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

# dscl . list /users
# dscl . list /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 من النظام.
  • تقسيمها من قبل الخطوط
  • قسّم كل سطر استنادًا إلى ":"
  • خذ الرمز الأول لكل سطر

تحقق من هذا الفصل الذي يستخدم واجهة win32. فقط إنشاء مثيل عن طريق توفير foldername الذي تريد قائمة البيانات ثم استدعاء الأسلوب getNextFile للحصول على filename التالي من الدليل. أعتقد أنه يحتاج windows.h و stdio.h .

class FileGetter{
    WIN32_FIND_DATAA found; 
    HANDLE hfind;
    char folderstar[255];       
    int chk;

public:
    FileGetter(char* folder){       
        sprintf(folderstar,"%s\\*.*",folder);
        hfind = FindFirstFileA(folderstar,&found);
        //skip .
        FindNextFileA(hfind,&found);        
    }

    int getNextFile(char* fname){
        //skips .. when called for the first time
        chk=FindNextFileA(hfind,&found);
        if (chk)
            strcpy(fname, found.cFileName);     
        return chk;
    }

};




c objective-c cocoa macos carbon