2013-07-28 10 views
6

とプロセスの開始:私はあなたが次のように指定されたユーザー名/パスワードを使用してプロセスを実行できることを知っているユーザー名とパスワード

var processInfo = new ProcessStartInfo 
    { 
     WorkingDirectory = workingDirectory, 
     FileName = "a name", 
     UserName = loggedUserName, 
     Password = "password", 
     Domain = userNameDomain, 
     UseShellExecute = false, 
    }; 
    Process.Start(processInfo); 

私が直面してる問題は、私がいないということですコードの一部として実際のパスワードを書いて、パスワード属性を空のままにしてもプロセスが開始しない...コード内にハードコードされた文字列としてパスワードを公開しないで、プロセスを安全に開始するにはどうすればよいですか?

+0

PasswordプロパティがSecureStringです。そのように書くことは簡単ではありません – Steve

+0

プログラムを開始するときに読み込まれるファイル/データベースに格納することができます。また、ファイルの簡単な方法論(http://stackoverflow.com/questions/740812/whats-the-easiest-way-to-encrypt-a-file-in-c)に頼るか、 DBの組み込み関数(http://dev.mysql.com/doc/refman/5.0/es/set-password.html)にあります。 – varocarbas

答えて

5

ProcessStartInfo.Passwordは、書き留めてプロパティに割り当てることができる単純な文字列ではありません。必要なのはSecureStringインスタンスです。SecureStringを作成して単純な文字列をコンストラクタに渡すことはできません。明らかに、OSには、信頼できないプログラムが現在のユーザーのパスワードを取得することを可能にするAPIやメソッドはありません(これまでに聞いたことがない最大のセキュリティバグでしょう)。

私の考えでは、1つのオプションしか残っていません。もう一度パスワードを入力するようユーザーに依頼し、その結果の入力はこの例では、入力したパスワードを変換するためにそれを使用することができますI have seen here

using System.Security; 

// ... 

public static SecureString ConvertToSecureString(this string password) 
{ 
    if (password == null) 
     throw new ArgumentNullException("password"); 

    unsafe 
    { 
     fixed (char* passwordChars = password) 
     { 
      var securePassword = new SecureString(passwordChars, password.Length); 
      securePassword.MakeReadOnly(); 
      return securePassword; 
     } 
    } 
} 

という文字列クラスの拡張メソッドであるSecureString

に変換する必要がありますあなたのユーザーが処理を開始します。

using(frmGetPassword fgp = new frmGetPassword()) 
{ 
    if(DialogResult.OK == fgp.ShowDialog()) 
    { 
     SecureString ss = fgp.Password.ConvertToSecureString(); 
     var processInfo = new ProcessStartInfo 
     { 
      WorkingDirectory = workingDirectory, 
      FileName = "a name", 
      UserName = loggedUserName, 
      Password = ss, 
      Domain = userNameDomain, 
      UseShellExecute = false, 
     }; 
     Process.Start(processInfo); 
    } 
} 
0

私はこのようなパスワードを管理するためにWindowsのパスワードストアを使用します。 Windows APIをラップするhttp://credentialmanagement.codeplex.com/ライブラリをチェックしてください。 Setup-RoutineまたはAdminのいずれかを使用してストアにパスワードを追加することができます。このパスワードは、アプリケーションから実行時に取得できます。ストアはユーザー固有の欠点のみです。複数のユーザー間で使用できるパスワードを作成することはできません。

は、それはそれと同じくらい簡単です:ProcessStartInfoの

 _credentials = new CredentialSet("myApp:*"); 
     if (_credentials.Count == 0) 
     { 
      //TODO: ask user for password, supply it here, or use windows UI to set password (rundll32.exe keymgr.dll, KRShowKeyMgr) 
      var c = new Credential() 
      { 
       Target = "myApp:Production", 
       Username = "SomeUser", 
       Description = "Credentials for doing something...", 
       PersistanceType = PersistanceType.LocalComputer, 
       Type = CredentialType.DomainPassword 
      }; 
      c.Save(); 
      _credentials.Add(c); 
     } 
関連する問題