Cygwinでsudoもどき

Vistaを使ってると、たまに管理者権限じゃないと触れないファイルがあって鬱陶しい。そこで、Cygwin上でsudoもどきをやるためのコードを組んだ。

引数のファイルをパスから探し、管理者権限で実行する。以下ソース。

using System;
using System.IO;
using System.Diagnostics;
using System.Security;
using System.Security.Principal;

class sudo {
  static private string  SearchPath(string file){
    if(File.Exists(file)){
      return file;
    }
    if(Path.GetExtension(file)==String.Empty){
      file = file + ".exe";
    }
    string path = System.Environment.GetEnvironmentVariable("Path");
    string [] patharray = path.Split(new Char[] {';'});    
    foreach(string p in patharray){
      string filename = p + "\\"+file;
      if(File.Exists(filename)){
        return filename;
      }
    }
    return null;
  }
  static void Main(string[] args){
    if(args.Length ==0 ){
      Console.WriteLine("Usage: sudo filename");
      return;
    }
    string filename = args[0];
    string full_filename = SearchPath(filename);
    if (full_filename == null){
      Console.WriteLine("sudo: " + filename + ":command not found");
      return;
    }

    ProcessStartInfo si = new ProcessStartInfo();
    si.UseShellExecute = true;
    si.WorkingDirectory = Environment.CurrentDirectory;
    si.FileName = full_filename;
    if(args.Length >1) {
      si.Arguments = args[1];
    }
    si.Verb = "runas";
    try{
      Process p = Process.Start(si);
    }catch{
      return;
    }
  } 
}

使い方。

% cd /etc
% sudo vim hosts 

管理者権限への昇格ダイアログが出れば成功。

ちなみにviはvimへのショートカットになっているが、Cygwin独自形式で、こうかいてある。

!vim.exe

それをちゃんと読んで処理すればviと書いてもvimが起動するようにできるが、これはとりあえず今後の課題(手抜き)。