UAC対策

無効にしたくはないけど、特定のプログラムは頻繁に立ち上げるんで聞かれたくないとか。

アプリ内で昇格してしまおうという。
もちろんリスクにはつながるけど。

class Program {
  static void Main( string[] args ) {
    if( args.Length == 0 ) {
      return;
    }

    ExecuteProcess( args[0] );
  }

  static private void ExecuteProcess( string path ) {
    Console.WriteLine( path + "を起動しています。" );

    string currentBack = Environment.CurrentDirectory;
    Environment.CurrentDirectory
      = Path.GetDirectoryName( path );

    try {
      Process.Start( path, ConfigurationManager.AppSettings["user"]
        , ConvertSecureString( ConfigurationManager.AppSettings["password"] )
        , ConfigurationManager.AppSettings["domain"]
      );

    } catch (Exception e) {
      Console.WriteLine( e );
    }

    Environment.CurrentDirectory = currentBack;
  }

  static private SecureString ConvertSecureString( string p ) {
    if (p == null) {
      return null;
    }

    SecureString ss = new SecureString();
    foreach (char item in p) {
      ss.AppendChar( item );
    }
    return ss;
  }
}

AppSettings 内の文字列を暗号化しとくともっといいよね。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
    <add key="user" value="Administrator" />
    <add key="password" value="" />
    <add key="domain" value="" />
  </appSettings>
</configuration>