SMJobBless官方Demo筆記
SMJobBless是蘋果官方提供的用於“MacOS app獲取root權限”的demo。
具體思路
使用Security.framework和ServiceManagement.framework兩個庫,把需要root權限的操作封裝成一個進程,作為項目的子Target,把該子進程註冊LaunchdDaemon。
成為LaunchdDaemon後:
- 子進程會被放在
/Library/PrivilegedHelperTools
- 相應的配置文件
.plist
被放在/Library/LaunchDaemons
,Launchd加載該子進程會需要讀取該配置文件
更多介紹請見"參考資料1"
編譯SMJobBless
從官網下載SMJobBless源碼(下面"參考資料3"也有鏈接),具體操作Demo裏的ReadMe.txt也講述得比較清楚,只是由於新版本Xcode的編譯產物不再放在項目目錄裏,所以ReadMe.txt裏有一些步驟的路徑要做一些調整
在xcode先編譯項目
用終端進入項目根目錄,運行下面命令
./SMJobBlessUtil.py setreq <path-to-SMJobBlessApp.app> SMJobBlessApp/SMJobBlessApp-Info.plist SMJobBlessHelper/SMJobBlessHelper-Info.plist
其中
<path-to-SMJobBlessApp.app>
可以在xcode左邊的Navigator的product下的編譯產物APP"右擊-Show in Finder"的到編譯產物的路徑。腳本運行成功後會輸出
SMJobBlessApp/SMJobBlessApp-Info.plist: updated SMJobBlessHelper/SMJobBlessHelper-Info.plist: updated
在Xcode對項目Clean,然後再Build
終端在項目根目錄下執行
./SMJobBlessUtil.py check <path-to-SMJobBlessApp.app>
沒有輸出任何東西即說明check通過。
Run編譯產物APP,會彈出輸入賬號密碼的認證窗口,提示要"Install Helper";輸入密碼後,若Xcode打印出"Job is available!"的log,已經App的UI上有"The Helper Tool is available!",即說明Demo成功運行。
參考資料
通過ServiceManagement註冊LaunchdDaemon
Apple官方論壇關於如何編譯SMJobBless的解析
Apple官方Demo: SMJobBless
Apple官方Demo: EvenBetterAuthorizationSample
這個是SMJobBless進一步的Demo,結合Sand-box的特性。
StackOverflow: AuthorizationExecuteWithPrivileges is deprecated
StackOverflow: Writing a privileged helper tool with SMJobBless()
Apple官方文檔: Authorization Services Programming Guide
Jacob Pan ( jacobpan3g.github.io/cn )
SMJobBless官方Demo筆記