Xamarin.Macで管理者権限に昇格してコマンド実行する
Mac OS Xのアプリは通常は一般権限で実行されるが、システムファイルの操作など管理者権限に昇格して危険な操作をしたいこともある。
実装1:ExecuteWithPrivileges
Security名前空間のAuthorizationクラスにExecuteWithPrivilegesメソッドという恐ろしいものが用意されている。 認証が成功した場合はroot権限で実行されので取り扱いには細心の注意を必要とする。
using System;
using AppKit;
using Security;
namespace Auth
{
static class MainClass
{
static void Main(string[] args)
{
NSApplication.Init();
var ret = Auth();
Console.WriteLine(ret);
}
static AuthorizationStatus Auth()
{
var defaults = AuthorizationFlags.Defaults;
using (var auth = Authorization.Create(defaults))
{
// ExecuteWithPrivilegesメソッドを呼ぶと認証ダイアログが表示される。
var args = new[]{"-c", "\"\"mkdir -p /usr/share/MyFolder\"\""};
var ret = (AuthorizationStatus)auth.ExecuteWithPrivileges("/bin/sh", defaults, args);
return ret;
}
}
}
}
注意1
このプログラムを実行すると「/usr/share/MyFolder」というゴミディレクトリがroot権限で生成されるので注意しよう。 root権限やsudoの意味がわからない者にはオススメできない。
注意2
また、アップルの公式ドキュメントによると管理者権限に昇格して直接的に危険な操作をすることは推奨されておらず、管理者権限が不必要な部分と管理者権限が必要な部分でプログラムを分離させて、プロセス間通信をすることが推奨されている。つまりこの実装は手抜きで楽であるが世間様にオススメできるようなものではない。