2013-07-28 5 views
6

와 프로세스를 시작 :난 당신이 다음과 같은 방법으로 특정 사용자 이름/암호로 프로세스를 실행할 수 있다는 사실을 알고 사용자 이름과 암호

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

내가 직면 해요 문제는 없다는 것입니다 코드의 일부로 실제 암호를 쓰려고하는데 암호 속성을 비워두면 프로세스가 시작되지 않습니다 ... 코드에서 하드 코딩 된 문자열로 암호를 표시하지 않고 프로세스를 안전하게 시작하려면 어떻게해야합니까?

+0

암호 속성은 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

은 속성에 적어서 할당 할 수있는 간단한 문자열이 아닙니다. 필요한 것은 SecureString 인스턴스이며 간단한 문자열을 생성자에 전달하여 SecureString을 만들 수 없습니다. 분명히 OS에는 신뢰할 수없는 프로그램이 현재 사용자의 암호를 검색 할 수있는 API 나 메소드가 없습니다 (이것은 가장 큰 보안 버그 일 것입니다).

제 생각에는 단지 하나의 옵션 만 남았습니다. 암호를 다시 입력하는 사용자를 요청하고 결과 입력이 SecureString

이 예제로 변환해야하는 것은 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; 
     } 
    } 
} 

당신이 입력 한 암호를 변환하는 데 사용할 수있는 문자열 클래스에 대한 확장 방법 귀하의 사용자가 프로세스를 시작하십시오.

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); 
     }