2013-07-28 17 views
6

So che è possibile eseguire un processo con un nome utente determinato/password nel seguente modo:Avvio di un processo con un nome utente e una password

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

Il problema che sto affrontando è che non lo faccio vuoi scrivere la password effettiva come parte del codice e il processo non verrà avviato se lascio l'attributo Password vuoto ... Come posso avviare il processo in modo sicuro senza esporre la password come una stringa codificata nel codice?

+0

proprietà Password di ProcessStartInfo è un SecureString. Non puoi semplicemente scriverlo in questo modo – Steve

+0

Puoi archiviarlo in un file/database che verrà letto all'avvio del programma. Puoi anche crittografarlo facendo affidamento su una semplice metodologia per il file (http://stackoverflow.com/questions/740812/whats-the-easiest-way-to-encrypt-a-file-in-c) o facendo affidamento su una funzione integrata del DB (http://dev.mysql.com/doc/refman/5.0/es/set-password.html). – varocarbas

risposta

5

Il ProcessStartInfo.Password non è una stringa semplice che è possibile annotare e assegnare alla proprietà. Quello di cui hai bisogno è un'istanza SecureString e non è possibile creare una SecureString passando una semplice stringa al suo costruttore. Ovviamente il sistema operativo non ha API o metodo che consente a un programma non affidabile di recuperare la password dell'utente corrente (sarebbe il più grande bug di sicurezza mai sentito).

Quindi, nel mio modo di pensare, si rimane con una sola opzione. Chiedi al tuo all'utente di digitare nuovamente la password e l'ingresso risultante dovrebbe essere trasformato in un SecureString

Questo esempio è un metodo di estensione per la classe stringa che 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; 
     } 
    } 
} 

si potrebbe utilizzare per trasformare la password digitata dal tuo utente e avvia il processo

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

Io uso il Windows Password Store per gestire tali password. Controlla la libreria http://credentialmanagement.codeplex.com/ che si avvolge attorno all'API di Windows. La tua Setup-Routine o Admin può aggiungere la password all'archivio, che può quindi essere recuperata in runtime dall'applicazione. L'unico inconveniente è che il negozio è specifico per l'utente. Non è possibile creare una password che possa essere utilizzata da più utenti.

E 'così semplice:

 _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); 
     } 
Problemi correlati