2013-07-28 55 views
6

Tôi biết rằng bạn có thể chạy một quá trình với một tên người dùng/mật khẩu được đưa ra trong các cách sau:Bắt đầu một quá trình với một tên người dùng và mật khẩu

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

Vấn đề tôi đang phải đối mặt là tôi không muốn viết mật khẩu thực như là một phần của mã và quá trình sẽ không bắt đầu nếu tôi để trống thuộc tính Mật khẩu ... Làm cách nào tôi có thể bắt đầu quá trình một cách an toàn mà không lộ mật khẩu dưới dạng chuỗi mã hóa cứng?

+0

Mật khẩu tài sản của ProcessStartInfo là một SecureString. Bạn không thể đơn giản viết nó theo cách đó – Steve

+0

Bạn có thể lưu trữ nó trong một tệp/cơ sở dữ liệu sẽ được đọc khi chương trình được bắt đầu. Bạn cũng có thể mã hóa nó bằng cách dựa vào một phương pháp đơn giản cho tệp (http://stackoverflow.com/questions/740812/whats-the-easiest-way-to-encrypt-a-file-in-c) hoặc bằng cách dựa vào trên một chức năng trong xây dựng của DB (http://dev.mysql.com/doc/refman/5.0/es/set-password.html). – varocarbas

Trả lời

5

ProcessStartInfo.Password không phải là chuỗi đơn giản mà bạn có thể viết ra và gán cho thuộc tính. Những gì bạn cần là một cá thể SecureString và một SecureString không thể được tạo thông qua một chuỗi đơn giản đến hàm tạo của nó. Rõ ràng hệ điều hành không có API hoặc phương thức cho phép một chương trình không đáng tin cậy truy xuất mật khẩu của người dùng hiện tại (nó sẽ là lỗi bảo mật lớn nhất từng được nghe đến).

Vì vậy, trong suy nghĩ của tôi, bạn chỉ còn một tùy chọn. Yêu cầu người dùng phải gõ lại mật khẩu và nhập kết quả nên được chuyển thành một SecureString

Ví dụ này là một phương pháp mở rộng cho lớp chuỗi 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; 
     } 
    } 
} 

bạn có thể sử dụng nó để chuyển đổi các mật khẩu đã gõ bởi người dùng của bạn và bắt đầu quá trình

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

Tôi sử dụng cửa sổ Cửa hàng mật khẩu để quản lý mật khẩu đó. Kiểm tra thư viện http://credentialmanagement.codeplex.com/ bao quanh API cửa sổ. Hoặc thiết lập-thường xuyên hoặc quản trị của bạn có thể thêm mật khẩu cho các cửa hàng, mà sau đó có thể được lấy ra khi chạy từ ứng dụng. Hạn chế duy nhất là cửa hàng là người dùng cụ thể. Bạn không thể tạo mật khẩu có thể được sử dụng trên nhiều người dùng.

Đó là đơn giản như vậy:

 _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); 
     } 
Các vấn đề liên quan