2016-02-19 77 views
2

我在网上搜索了很多,在我的NSTask中找到了获取root权限的简单方法,但我只找到了用Objective-C编写的旧文章。但是我的Xcode项目是用Swift编写的:x有没有办法解决这个问题来运行具有Root Privilegs的NSTask? :)我知道我必须使用像AppleScript,STPrivilegedTask或BetterAuthorizationSample从Apple的东西,但我发现所有是Objective-C写...NSTask在Swift中的根权限

我的想法是创建一个应用程序,使存储介质可启动使用命令createinstallmedia:p完全正常工作唯一的问题是该命令需要root权限,对于测试,我只需打开终端并以root身份登录,但这不是解决此问题的最佳解决方案:D请帮助我! :○

我的代码,错过了唯一的事情就是代码获得root权限:

import Cocoa 


class ViewController: NSViewController { 

var Task = NSTask() 
var openPanel = NSOpenPanel() 

var workingpath_createinstallmedia : String! 
var workingpath_medium : String! 
var workingpath_application : String! 

var volume_flag = "--volume" 
var applicationpath_flag = "--applicationpath" 
var nointeraction_flag = "--nointeraction" 

var commandpath : String! 
var postcommand : [String]! 

var DirectoryOS : NSURL! 
var DirectoryMedium : NSURL! 

@IBOutlet weak var PathControlOS: NSPathControl! 

@IBOutlet weak var PathControlMedium: NSPathControl! 

@IBOutlet weak var Outputlabel: NSTextField! 

@IBAction func OSauswählen(sender: AnyObject) { 

    openPanel.canChooseDirectories = false 
    openPanel.canChooseFiles = true 
    openPanel.canCreateDirectories = false 
    openPanel.allowsMultipleSelection = false 

    if openPanel.runModal() == NSModalResponseOK { 

     DirectoryOS = openPanel.URLs[0] as NSURL 
     PathControlOS.objectValue = DirectoryOS 

} 
} 

@IBAction func Mediumauswählen(sender: AnyObject) { 

    openPanel.canChooseDirectories = true 
    openPanel.canChooseFiles = false 
    openPanel.canCreateDirectories = false 
    openPanel.allowsMultipleSelection = false 

    if openPanel.runModal() == NSModalResponseOK { 

     DirectoryMedium = openPanel.URLs[0] as NSURL 
     PathControlMedium.objectValue = DirectoryMedium 


    } 
} 

@IBAction func starttask(sender: AnyObject) { 

    //      edit Strings 

    // Createinstallmedia 

    workingpath_createinstallmedia = String(DirectoryOS) 
    workingpath_createinstallmedia = workingpath_createinstallmedia.stringByReplacingOccurrencesOfString("file://", withString: "") 
    workingpath_application = workingpath_createinstallmedia.stringByReplacingOccurrencesOfString("%20", withString: " ") 
    workingpath_createinstallmedia = workingpath_application + "/Contents/Resources/createinstallmedia" 

    // Medium 

    workingpath_medium = String(DirectoryMedium) 
    workingpath_medium = workingpath_medium.stringByReplacingOccurrencesOfString("file://", withString: "") 
    workingpath_medium = workingpath_medium.stringByReplacingOccurrencesOfString("%20", withString: " ") 

    // config Task Parameters 

    commandpath = workingpath_createinstallmedia 
    postcommand = [volume_flag,workingpath_medium,applicationpath_flag,workingpath_application,nointeraction_flag] 

    // commit the Parameters to the Task 

    Task.launchPath = commandpath 
    Task.arguments = postcommand 

    // start Task 

    Task.launch() 
    Task.waitUntilExit() 

    } 
} 

感谢您的帮助!

+0

您是否尝试过翻译*其中的任何一个*到Swift? –

+0

当然,我试图用AppleScript和一个名为SMJobBless()的函数来解决这个问题。但没有为我工作... – Joh

+0

你找到了解决方案?我在swift中编写安装程序,我很想获得使用具有root特权的进程的权限。 – jl303

回答

0

我解决了使用sudo进入命令,并要求用户输入密码,直接给须藤,以下列方式:

echo "passwordhere" | sudo -S command --arguments 

,这是使用sh外壳可执行文件运行过程做,使用这种方法,我成功地创建了一个应用程序来创建可启动的Mac OS安装介质,名为TINU,但在处理用户密码时需要小心,我选择让我的应用程序开放源代码,让其他人知道它与这种类型的需要用户密码的任务,但是在Mac OS上,您应该创建执行此类特权任务的专用程序,然后使用系统apis启动它们,这将为您管理身份验证并让专业计划去完成他的工作。