2012-05-24 11 views
7

Khi người dùng lưu tệp từ ứng dụng của tôi, họ hiện không thể lưu vào các vị trí bị hạn chế (như C :). Tôi nghĩ rằng đây là một hạn chế tốt, nhưng tôi muốn cung cấp một nhắc nhở UAC để nâng cao đặc quyền và cho phép người dùng lưu trong một khu vực hạn chế.Làm thế nào để hiển thị lời nhắc UAC cho tệp lưu vào vị trí bị hạn chế bằng cách sử dụng C#?

Tôi đã nhìn thấy rất nhiều câu trả lời xung quanh chủ đề này liên quan đến việc sinh ra một quy trình mới với đặc quyền nâng cao bằng cách sử dụng 'runas'. Ngoài ra, có vẻ như điều này có thể được thực hiện bằng cách mạo danh một người dùng khác. Từ những gì tôi hiểu, cả hai phương pháp đó đều yêu cầu người dùng cung cấp thông tin xác thực người dùng.

Điều tôi muốn làm là cơ bản những gì bản thân Windows thực hiện. Khi bạn cố gắng sao chép một tập tin vào C: \ trong Windows 7 (giả sử bạn đã có UAC thiết lập để mức mặc định của nó), bạn nhận được dấu nhắc sau:

UAC Prompt

Khi bạn nhấp vào nút Tiếp tục với lá chắn UAC, tệp được sao chép vào C: \ không có lời nhắc cho thông tin đăng nhập (giả sử bạn đã đăng nhập với đặc quyền quản trị viên).

Làm cách nào để sao chép hành vi này trong ứng dụng của tôi cho người dùng quản trị? Họ không nên mạo danh bất kỳ người dùng nào khác vì họ đã có đặc quyền quản trị viên. Bất cứ ai có thể cung cấp chi tiết về những gì Windows đang làm trong quá trình này? Họ có sinh ra một quá trình explorer.exe mới với các đặc quyền nâng cao không?

+0

Một số nguồn cảm hứng: http://stackoverflow.com/questions/573086/how-to-elevate-privileges-only-when-required –

Trả lời

5

Bạn cần làm những gì Windows thực hiện. Và sinh ra một quy trình mới sẽ chạy với quyền cao. Không có lối tắt nào ở đây. Mã thông báo được cấp phát khi quá trình bắt đầu là điều xác định quyền của quy trình. Không thể thay đổi mã thông báo đó sau khi quá trình đã bắt đầu. Nếu bạn cần nâng cấp, bạn cần một quy trình mới.

Tôi đã nhìn thấy rất nhiều câu trả lời xung quanh chủ đề này liên quan đến việc sinh ra một quy trình mới với đặc quyền nâng cao bằng cách sử dụng 'runas'. Ngoài ra, có vẻ như điều này có thể được thực hiện bằng cách mạo danh một người dùng khác. Từ những gì tôi hiểu, cả hai phương pháp đó đều yêu cầu người dùng cung cấp thông tin xác thực người dùng.

Không phải vậy. Nếu người dùng hiện tại không phải là quản trị viên, thì hộp thoại UAC sẽ nhắc thông tin đăng nhập mới của người dùng có quyền quản trị viên. Đó là hộp thoại over-the-shoulder UAC. Mặt khác, nếu người dùng hiện tại là quản trị viên thì họ chỉ nhận được hộp thoại đồng ý. Đó là hộp thoại được hiển thị trên màn hình an toàn và chỉ yêu cầu bạn nhấp vào Tiếp tục.

Một điều mà các thành phần Windows có thể làm mà bạn không thể bắt đầu quá trình được nâng lên mà không hiển thị cho bạn hộp thoại đồng ý. Điều đó chỉ xảy ra trên Windows 7 (không phải trên Vista) và chỉ khi bạn có cài đặt UAC ở cài đặt Mặc định đã được thêm vào Windows 7. Đó là cách Explorer có thể hiển thị hộp thoại mà bạn đưa vào câu hỏi và sau đó bắt đầu quá trình nâng cao để thực hiện sao chép mà không hiển thị hộp thoại UAC đồng ý. Chỉ các thành phần Windows mới được cấp khả năng đó.

Nhưng điểm mấu chốt là bạn cần bắt đầu một quy trình mới chạy cao. Sử dụng động từ runas là cách kinh điển để thực hiện.

+0

Cảm ơn câu trả lời. Hộp thoại _consent_ chắc chắn là những gì tôi đang tìm kiếm. Vì vậy, phương pháp 'runas' là mẫu ưa thích cho các đặc quyền nâng cao? Có vẻ như số câu trả lời được đề xuất được chia 50/50 với các câu trả lời đề xuất mẫu mạo danh (có vẻ như liên quan đến p/invoke). –

+0

Hộp thoại đồng ý là những gì bạn sẽ nhận được nếu bạn bắt đầu quá trình với động từ 'runas' và người dùng là quản trị viên. Đó là tầm thường để sử dụng 'runas' và tôi không thể thấy lý do tại sao bạn cần bất cứ điều gì khác. –

+1

Trên thực tế, cách được khuyến nghị là sử dụng tệp kê khai ứng dụng với cấp thực thi 'requireAdministrator'. Điều đó có tác dụng nếu bạn có hai tệp thực thi khác nhau, tất nhiên. Nếu chỉ có một thực thi, thì động từ 'runas' là cách duy nhất. –

6

Programming Elevated Privilege/UAC

các ứng dụng chạy với quyền hơn yêu cầu là chống lại các nguyên tắc đặc quyền tối thiểu, và có thể có an ninh tiềm năng dễ bị tổn thương. Để bảo vệ điều này, Windows Vista giới thiệu Tài khoản người dùng Điều khiển (UAC), để bảo vệ hệ điều hành bằng cách chạy các ứng dụng với đặc quyền giảm (như người dùng bình thường), ngay cả người dùng hiện tại là đăng nhập với tư cách quản trị viên. Ngày càng có nhiều người dùng XP/2K cũng sử dụng tài khoản người dùng thông thường để sử dụng hàng ngày. Đọc UAC Demystified đầu tiên để hoàn toàn hiểu UAC.

Có hai sai lầm phổ biến mà các nhà phát triển có xu hướng thực hiện:

  • Yêu cầu người dùng cuối để chạy một ứng dụng với quyền quản trị viên thậm chí mặc dù điều này là không cần thiết, phần lớn thời gian vì xấu thiết kế thực tiễn . Những ứng dụng này sẽ đe dọa người dùng cuối hoặc có khả năng có lỗ hổng bảo mật.
  • Không yêu cầu người dùng cuối để chạy ứng dụng được nâng lên nhưng cố gắng thực hiện các hoạt động mà yêu cầu đặc quyền của quản trị viên. Các ứng dụng này chỉ đơn giản là bẻ khóa theo tài khoản người dùng thông thường của Windows Vista hoặc Windows XP/2K trong tài khoản người dùng thông thường .

Mã mẫu có thể tải xuống thể hiện cách lập trình nâng cao đặc quyền/UAC. Cả hai ứng dụng mẫu WPF và Windows Forms đều được cung cấp . Chạy ứng dụng cho các tình huống sau để xem khác biệt:

  • người dùng bình thường, Windows XP/Windows Vista: biểu tượng cái khiên UAC được hiển thị. Nhấp vào "Lưu vào C: \" sẽ hiển thị hộp thoại "Chạy dưới dạng", yêu cầu người dùng nhập mật khẩu quản trị viên để tiếp tục;
  • Quản trị viên, Windows XP/Windows Vista với UAC bị tắt: biểu tượng khiên UAC là bị ẩn. Nhấp vào "Lưu vào C: \" đã hoàn thành mà không cần bất kỳ hộp thoại nào;
  • Quản trị viên, Windows Vista có UAC được bật: biểu tượng khiên UAC là được hiển thị. Nhấp vào hộp thoại “Lưu vào C: \” sẽ hiển thị yêu cầu quyền của người dùng là để tiếp tục.

Link to Download

Gọi nâng lên thực hiện (kiểm tra cho admin đầu tiên):

private void SaveToRootFolder_Click(object sender, EventArgs e) 
    { 
     string fileName = @"C:\Test.txt"; 
     if (App.IsAdmin) 
      DoSaveFile(textBox1.Text, textBox2.Text, fileName); 
     else 
     { 
      NameValueCollection parameters = new NameValueCollection(); 
      parameters.Add("Text1", textBox1.Text); 
      parameters.Add("Text2", textBox2.Text); 
      parameters.Add("FileName", fileName); 
      string result = Program.ElevatedExecute(parameters); 
      if (!string.IsNullOrEmpty(result)) 
       MessageBox.Show(result); 
     } 
    } 

Elevated thực hiện:

internal static string ElevatedExecute(NameValueCollection parameters) 
    { 
     string tempFile = Path.GetTempFileName(); 
     File.WriteAllText(tempFile, ConstructQueryString(parameters)); 

     try 
     { 
      ProcessStartInfo startInfo = new ProcessStartInfo(); 
      startInfo.UseShellExecute = true; 
      startInfo.WorkingDirectory = Environment.CurrentDirectory; 
      Uri uri = new Uri(Assembly.GetExecutingAssembly().GetName().CodeBase); 
      startInfo.FileName = uri.LocalPath; 
      startInfo.Arguments = "\"" + tempFile + "\""; 
      startInfo.Verb = "runas"; 
      Process p = Process.Start(startInfo); 
      p.WaitForExit(); 
      return File.ReadAllText(tempFile); 
     } 
     catch (Win32Exception exception) 
     { 
      return exception.Message; 
     } 
     finally 
     { 
      File.Delete(tempFile); 
     } 
    } 
+0

Cảm ơn câu trả lời chi tiết! –

1

Một lựa chọn hạn chế, chỉ có ích khi di chuyển, Đổi tên, sao chép và xóa tệp:

SHFileOperation

Nếu bạn cố gắng thực hiện thao tác tệp qua chức năng này, Windows sẽ cung cấp lời nhắc độ cao cho người dùng.

Lưu ý có một số nhược điểm cho việc này:

  • chỉ này hoạt động cho Di chuyển, đổi tên, sao chép, và xóa. Lưu một tập tin mới theo cách này sẽ yêu cầu lưu vào một thư mục tạm thời, sau đó di chuyển nó đến vị trí mong muốn. Điều này không giải quyết được vấn đề của Hộp thoại Lưu Tệp tin không cho phép bạn chọn một vị trí được bảo vệ UAC làm mục tiêu.
  • Nếu thư mục đích không tồn tại (đối với Di chuyển hoặc Sao chép), SHFileOperation có thể nhắc người dùng nếu thư mục đích được tạo. Tuy nhiên, nó sẽ KHÔNG yêu cầu đặc quyền nâng cao để làm như vậy, và như vậy sẽ thất bại dưới một vị trí được bảo vệ UAC. Giải pháp cho việc này là tạo thủ công các thư mục không tồn tại ở một vị trí tạm thời, sau đó di chuyển/sao chép chúng đến vị trí đích. Điều này S provide cung cấp dấu nhắc UAC.
  • Bạn cần có kế hoạch dự phòng tại chỗ nếu người dùng chọn 'Bỏ qua' hoặc 'Hủy' đối với hộp thoại Di chuyển/Sao chép hoặc nếu người dùng chọn 'Không' tại lời nhắc UAC.
Các vấn đề liên quan