Xamarin.Macで管理者権限に昇格してコマンド実行する

提供: MonoBook
2018年7月27日 (金) 06:50時点におけるimported>Administratorによる版 (Administrator がページ「Xamarin.Mac/管理者権限に昇格して実行する」を「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[編集 | ソースを編集]

また、アップルの公式ドキュメントによると1つのアプリが管理者権限に昇格して直接的に危険な操作をすることは推奨されておらず、管理者権限が不必要な部分と、管理者権限が必要な部分でアプリを2つに分離させて、プロセス間通信をすることが推奨されている。つまりこの実装は手抜きで楽であるが世間様にオススメできるようなものではない。

関連項目[編集 | ソースを編集]

参考文献[編集 | ソースを編集]