2009-09-13 9 views
6

मैं एक साधारण एप्लिकेशन बना रहा हूं जो आपको चलाने के लिए जल्दी से शेल कमांड दर्ज करने देता है। यह पूरी तरह से काम करता है, हालांकि सुडो कमांड की समस्या है। वर्तमान में, यह एक सूडो कमांड का पता लगाता है, और फिर मैं इसे उपयोगकर्ता के पासवर्ड के लिए प्राधिकरण विंडो लाने की कोशिश करता हूं, ठीक उसी तरह जैसे आप इंस्टॉलर में देखेंगे।मैक एप्लिकेशन में व्यवस्थापक अधिकारों को बढ़ाकर

यहाँ कोड एक बार यह पता लगाता है कि यह एक sudo आदेश है:

SFAuthorization *authorization = [[SFAuthorization alloc] initWithFlags:kAuthorizationFlagPreAuthorize rights:NULL environment:kAuthorizationEmptyEnvironment]; 
if ([authorization obtainWithRight:"com.mycompany.myapplication" flags:kAuthorizationFlagPreAuthorize error:nil]){ 
    //authorized, now run the command using NSTask. 
}else{ 
    //fail 
} 

अब, जहाँ तक मुझे पता है, यह पूरी तरह से और पूरी तरह से गलत है। यह वही है जो मैंने दस्तावेज से एक साथ पाई। कोई विचार?

उत्तर

1

सुरक्षा कठिन है। मैं प्रलेखन को पारदर्शी कर सकता हूं और कोड स्निपेट प्रदान कर सकता हूं, लेकिन शायद यह गलत होगा। इससे भी बदतर, भले ही मेरे उच्च स्तरीय विवरण सही थे, फिर भी संभवतः कोड स्निपेट में एक छोटी सी बग होगी जो सुरक्षा को मार डालेगी।

यदि आप विशेषाधिकार वृद्धि के साथ गड़बड़ करने जा रहे हैं, तो सबसे अच्छा तरीका दस्तावेज़ों को पढ़ने और प्रदान किए गए नमूने का उपयोग करना है।

https://developer.apple.com/mac/library/documentation/Security/Conceptual/authorization_concepts/01introduction/introduction.html#//apple_ref/doc/uid/TP30000995-CH204-TP1

1

आप इस तरह, AuthorizationExecuteWithPrivileges समारोह का उपयोग करना चाहेंगे:

- (IBAction)touch: (id) sender { 

    NSString * filepath = [_filepathfield stringValue]; 
    FILE *commpipe = NULL; 
    OSStatus execstatus; 


    NSLog(@"file path is %@", filepath); 

    char *args[] = {[filepath cString], NULL}; 


    SFAuthorization * authorization = [SFAuthorization authorization]; 

    execstatus = AuthorizationExecuteWithPrivileges([authorization authorizationRef], 
                "/usr/bin/touch", 
                kAuthorizationFlagDefaults, 
                args, 
                &commpipe); 

    if (execstatus == errAuthorizationSuccess) 
    NSlog(@"Toot! It worked"); 
    else 
    NSLog(@"No dice"); 

} 

यह देखते हुए कि बीएसडी एक नाजुक और गुस्सैल फूल मैं दे नहीं एक उपयोगकर्ता से मनमाने ढंग से आदेश पर अमल की सलाह देते हैं है रूट के रूप में ऐप।

/व्याख्यान

अपने उदाहरण से कोड रास्ते जाने के लिए यदि आप अपने आप उपयोगकर्ताओं से अपने खुद के कार्यक्रम के कार्यों को सीमित करना चाहते की शुरुआत है। उदाहरण के लिए, आपके पास एक ऐप हो सकता है जो केवल कुछ उपयोगकर्ताओं को सहेजी गई फ़ाइल से डेटा को बदलने देता है। तो आप सुरक्षा डेटाबेस 'com.mycompany.LibraryApp.AlterData' में एक प्रविष्टि बनाएंगे और यह देखने के लिए जांच लें कि उपयोगकर्ता को डेटा बदलने का प्रयास करते समय यह विशेषाधिकार है या नहीं। लेकिन यह एक अलग विषय है ...

आशा है कि -p मदद करता है।

+0

लेकिन यह एनएसटीस्क निष्पादित नहीं करेगा। विशेषाधिकारों का उपयोग करके एनएसटीस्क को निष्पादित करने के बारे में कोई विचार? –

1

मुझे पता है कि यह वास्तव में एक पुराना सवाल है, लेकिन उन लोगों के लिए जो अभी भी एक उत्तर की तलाश में हैं, यहां जाता है। (यह AppleScript का उपयोग करता है)

NSAppleScript *script = [[NSAppleScript alloc] initWithSource:@"do shell script \"[YOUR SCRIPT HERE]\" with administrator privileges"]; 
बेशक,

, अपनी स्क्रिप्ट वाली [अपनी स्क्रिप्ट यहाँ] को बदलने, और स्ट्रिंग, कोको तरह से बचने के लिए सुनिश्चित करें।

NSDictionary *errorInfo; 
[script executeAndReturnError:&errorInfo]; 

आगे स्पष्टीकरण के लिए, कृपया टिप्पणी करें।

संबंधित मुद्दे