Problem
外部プロセスを叩いてシステムに関わる設定を変更する,というニーズは少なからず発生します。
環境によってはvisudo
でパスワード無しtty無しを許可すれば事は足りますが,そのような設定が困難な場合に。
Solution
A.sudoers設定が可能な環境の場合
Mono on Linuxなどではこちらで。
sudo.cs
var psi = new ProcessStartInfo();
psi.FileName = "/usr/bin/sudo"; // 環境による
psi.Arguments = "(実行したいコマンドと引数)";
var p = Process.Start(psi);
p.WaitForExit();
B.どこで実行されるかわからない場合
OSXは基本的にこちらで。
AppleScript を叩いて実行していきます。
事前に実行したいコマンドをシェルスクリプトにまとめておくといいです。
withadmin.cs
var psi = new ProcessStartInfo();
psi.FileName = "/usr/bin/osascript";
psi.Arguments = "-e \"do shell script \\\"(path to shellscript)\\\" with administrator privileges\"";
var p = Process.Start(psi);
p.WaitForExit();
実行すると管理者のパスワード入力を求めるプロンプトをOSが表示してくれます。
Conclusion
AppleScript, もしくはシェルスクリプトで実行したい処理をまとめておくと,例外時のハンドリングもしやすいかと思います。