MacOS App代碼提權(quán)詳解

最近一段時間開發(fā)公司一款MacOS平臺的App時需要用到管理員權(quán)限陪拘,于是乎上網(wǎng)查詢了MacOS App使用代碼提權(quán)的方式,目前主要有以下幾種:

1.通過ServiceManagement注冊LaunchdDaemon

這種方法是目前蘋果官方推薦的一種提權(quán)方式如迟,官方也提供了一個SMJobBless的Demo一也,但是需要用蘋果開發(fā)者賬號編譯(我會在我博客后面的文章單獨介紹一種不需要開發(fā)者賬號編譯的方式署隘,也能通過這種方式達到高權(quán)限的需求蘑秽,在本文末尾會提供思路!)饺著,而且使用起來很復(fù)雜箫攀。帶來的好處是,將高權(quán)限任務(wù)封裝到獨立的子程序幼衰,將按需調(diào)用靴跛,不會讓整個程序處于高權(quán)限的狀態(tài)會相對安全一些,子程序便能輕松實現(xiàn)開機自啟塑顺、常駐后臺汤求、高權(quán)限的需求俏险。

我通過研究官方SMJobBless的Demo严拒,發(fā)現(xiàn)其實是通過launchd工具加載一個與Daemon程序相關(guān)的標(biāo)準(zhǔn)的plist文件,由于launchd需要高權(quán)限運行竖独,所以啟動的子程序自然而然也是高權(quán)限運行裤唠。程序運行之后,會將子程序放到/Library/PrivilegedHelperTools這個目錄莹痢,需要的plist文件會被放到/Library/LaunchDaemons种蘸,這樣launchd加載plist時,會去啟動子程序竞膳。

在SMJobBless的Demo中是通過ServiceManagement這個框架的API來完成提權(quán)操作的航瞭,而這框架在10.6就出現(xiàn)了,所以不需要擔(dān)心兼容性的問題坦辟。本文在這里不詳細介紹如何使用相關(guān)API了刊侯,只是在這里簡單說說編譯方法吧!在Demo中的ReadMe.txt中雖然講述的很清楚锉走,但是新版xcode編譯之后的目錄有所不同滨彻。(注意:程序雖然編譯成功,但在默認(rèn)的SMJobBlessHelper-Launchd.plist中并沒有RunAtLoad這一屬性挪蹭,所以launchd不會啟動子程序亭饵,只會將子程序放和plist文件到相關(guān)目錄,如需啟動子程序梁厉,需在SMJobBlessHelper-Launchd.plist中添加RunAtLoad屬性辜羊,Boolean類型,值為YES)

1.在xcode中編譯項目 (Product > Build或者command+b)
2.使用終端進入項目根目錄词顾,運行以下命令:
./SMJobBlessUtil.py setreq <SMJobBlessApp.app:path> SMJobBlessApp/SMJobBlessApp-Info.plist SMJobBlessHelper/SMJobBlessHelper-Info.plist 

<SMJobBlessApp.app:path>是指在xcode左邊的Navigator的product下的編譯的APP的路徑

腳本運行成功會輸出:

SMJobBlessApp/SMJobBlessApp-Info.plist: updated
SMJobBlessHelper/SMJobBlessHelper-Info.plist: updated
3.clean項目(Product > Clean)八秃,然后再次編譯(Product > Build)。
4.在項目根目錄下计技,終端執(zhí)行:
./SMJobBlessUtil.py check <SMJobBlessApp.app:path>

腳本運行成功沒有輸出任何東西喜德,說明成功了。

5.運行編譯的APP垮媒。

這時會彈出需要輸入密碼的認(rèn)證提示框舍悯,輸入密碼之后航棱,xcode在控制臺打印Job is available!,App上有顯示The Helper Tool is available!字樣萌衬,表示成功運行了饮醇。

官方Demo:SMJobBless.zip

2.AuthorizationExecuteWithPrivileges函數(shù)

這個函數(shù)是Security.framework中的一函數(shù),使用很方便秕豫,而且還有一個封裝非常好的庫STPrivilegedTask朴艰,接口和NSTask幾乎一樣。但是AuthorizationExecuteWithPrivileges函數(shù)在MacOS 10.7的時候就開始被棄用了混移,在新版的10.13.3中發(fā)現(xiàn)某些時候會提權(quán)失敗祠墅,所以不推薦使用這種方法,在本文也不做過多介紹歌径!

3.使用AppleScript提權(quán)

AppleScript是蘋果獨有的腳本語言毁嗦,通過OC或者Swift都可以調(diào)用AppleScript,在這里提供一個OC寫的方法:

-(NSDictionary*)doAppleScript:(NSString*)cmd{
    cmd=[NSString stringWithFormat:@"do shell script \"%@\" with administrator privileges",cmd];
    NSAppleScript *script= [[NSAppleScript alloc] initWithSource:cmd];
    NSDictionary *scriptError = nil;
    NSAppleEventDescriptor *descriptor = [script executeAndReturnError:&scriptError];
    NSMutableDictionary *dicResult=[NSMutableDictionary dictionary];
    if(scriptError) {
        [dicResult setObject:@NO forKey:@"id"];
        [dicResult setObject:[scriptError objectForKey:NSAppleScriptErrorMessage] forKey:@"result"];
    } else {
        NSAppleEventDescriptor *unicode = [descriptor coerceToDescriptorType:typeUnicodeText];
        NSData *data = [unicode data];
        NSString *result = [[NSString alloc] initWithCharacters:(unichar*)[data bytes] length:[data length] / sizeof(unichar)];
        [dicResult setObject:@YES forKey:@"id"];
        [dicResult setObject:result forKey:@"result"];
    }
    return dicResult;
}

AppleScript方法固然簡單回铛,但是還有一些缺點狗准,比如每次需要管理員權(quán)限時,都需要提示輸入密碼茵肃,會讓用戶感覺你總是在獲取權(quán)限腔长,造成用戶對你程序的不信任,在執(zhí)行需要等待結(jié)果的命令時验残,會造成UI卡住捞附,一直占有線程,所以建議在子線程中運行!

4.自創(chuàng)的提權(quán)方法(思路)

提供一個通過AppleScript啟動launchd子程序的思路(我博客后面的文章單獨做介紹)胚膊,這樣也可以實現(xiàn)高權(quán)限故俐,常駐后臺的需求。

AppleScript可以運行shell腳本(方法3提供的OC語言的方法就可以執(zhí)行腳本)紊婉,而shell腳本可以傳入?yún)?shù)药版,知道這兩點,我們就可以在自己項目中建立子程序和需要plist文件喻犁,通過AppleScript執(zhí)行管理員權(quán)限運行shell腳本槽片,shell腳本把plist文件和子程序移動到方法1中的所提到的目錄中,這樣是不是可以達到一樣的方法呢肢础?感興趣的童鞋可以試試还栓!

本文來源:https://blog.ihitun.com/posts/431360628/
未經(jīng)博主同意不得轉(zhuǎn)載!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末传轰,一起剝皮案震驚了整個濱河市剩盒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌慨蛙,老刑警劉巖辽聊,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纪挎,死亡現(xiàn)場離奇詭異,居然都是意外死亡跟匆,警方通過查閱死者的電腦和手機异袄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來玛臂,“玉大人笔呀,你說我怎么就攤上這事孕锄≈魑浚” “怎么了移宅?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長叁巨。 經(jīng)常有香客問我斑匪,道長,這世上最難降的妖魔是什么锋勺? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮狡蝶,結(jié)果婚禮上庶橱,老公的妹妹穿的比我還像新娘。我一直安慰自己贪惹,他們只是感情好苏章,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著奏瞬,像睡著了一般枫绅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上硼端,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天并淋,我揣著相機與錄音,去河邊找鬼珍昨。 笑死县耽,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的镣典。 我是一名探鬼主播兔毙,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼兄春!你這毒婦竟也來了澎剥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤赶舆,失蹤者是張志新(化名)和其女友劉穎哑姚,沒想到半個月后趾唱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡蜻懦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年甜癞,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宛乃。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡悠咱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出征炼,到底是詐尸還是另有隱情析既,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布谆奥,位于F島的核電站眼坏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏酸些。R本人自食惡果不足惜宰译,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望魄懂。 院中可真熱鬧沿侈,春花似錦、人聲如沸市栗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽填帽。三九已至蛛淋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間篡腌,已是汗流浹背褐荷。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留哀蘑,地道東北人诚卸。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像绘迁,于是被迫代替她去往敵國和親合溺。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,518評論 25 707
  • mac上有自帶的腳本工具缀台,腳本編輯器棠赛。AppleScript 是 Mac OS X內(nèi)置的一種功能強大的腳本語言。 ...
    Curry_J_X閱讀 10,769評論 2 8
  • 你說:人都是越活越現(xiàn)實的,只有你每天天真的以為著什麼都沒變都不會變 你說:我們總有一天會分開熬υ肌鼎俘!沒有人會一輩子在一...
    一期一會8閱讀 165評論 3 2
  • 1.我還是很喜歡你,像風(fēng)走了八千里辩涝,不問歸期贸伐。 2.我還是很喜歡你,像雨灑落在熱帶與極地怔揩,不遠萬里捉邢。 3.我還是很...
    mmmm演員閱讀 249評論 0 0
  • 來京參賽,碰巧一位攝影師朋友也在同天抵京商膊,一起約午飯伏伐。 她是會計專業(yè)轉(zhuǎn)攝影專業(yè),家境優(yōu)渥晕拆,準(zhǔn)備出國留學(xué)藐翎。 之前因為...
    _SSharon閱讀 178評論 0 0