2010-07-07 17 views
7

Tôi đang viết một tiện ích WPF nhỏ để quản lý các mục nhập trong tệp máy chủ cho mục đích dev. Như bạn có thể biết các tập tin host được bảo vệ bởi các hệ điều hành mới hơn (Win 7/2008/Vista).Làm cách nào tôi có thể chỉnh sửa chương trình tệp máy chủ trong Windows 7/Server 2008?

Tôi đã thêm tệp kê khai vào ứng dụng của mình để đặt requestExecutionLevel thành "requireAdministrator", như chi tiết here (sử dụng "cách dễ dàng") và trong câu hỏi liên quan here.

Thật không may điều này đã không hiệu quả đối với tôi. Không có dấu nhắc độ cao khi tôi khởi động ứng dụng và gọi File.AppendText cho tệp máy chủ lưu trữ vẫn khiến System.UnauthorizedAccessException bị ném: "Truy cập vào đường dẫn 'C: \ Windows \ System32 \ drivers \ etc \ hosts' là từ chối."

HostsChanger.exe.manifest:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
<assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="HostsChanger" type="win32"/> 
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 
    <security> 
     <requestedPrivileges> 
      <requestedExecutionLevel level="requireAdministrator"/> 
     </requestedPrivileges> 
    </security> 
</trustInfo> 
</assembly> 

Bất kỳ ý tưởng?

+0

Vì vậy, ngoại lệ khi truy cập khóa đăng ký được bảo vệ là hoàn toàn mong đợi nếu bạn không nâng cấp. Tuy nhiên, tôi đã không sử dụng các tệp kê khai đủ để nhớ tất cả các bước, vì vậy tôi không biết tại sao những gì bạn đã thử không hoạt động cho bạn. –

+0

Có ngoại lệ được mong đợi ... và độ cao nên giải quyết nó nhưng thiếu dấu nhắc cho biết độ cao không xảy ra. – bszom

+0

Im tìm kiếm một chương trình Hostschanger đơn giản nhưng tôi chưa tìm thấy một ứng dụng nào được nêu ra – JasonDavis

Trả lời

3

Được diễn giải từ bình luận trước đây của tôi, biến thành một câu trả lời:

Câu trả lời ho1 đã chứa một app.manifest đó là giống hệt nhau như ứng dụng tôi đang làm việc tại nơi làm việc và độ cao đang hoạt động. Sự khác biệt ở đây là tên tệp là "app.manifest" và tùy chọn dự án "Tệp kê khai" (trên tab Ứng dụng) trỏ đến nó.

2

Tôi không chắc chắn nếu nó sẽ làm cho bất kỳ sự khác biệt nhưng đoạn biểu hiện của bạn hơi khác so với sự hiểu biết của tôi về nó như thế nào nên được (mặc dù đó có thể là phiên bản khác nhau):

<?xml version="1.0" encoding="utf-8"?> 
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <assemblyIdentity version="1.0.0.0" name="HostsChanger" /> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> 
     <security> 
     <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> 
      <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> 
     </requestedPrivileges> 
     </security> 
    </trustInfo> 
</asmv1:assembly> 

Nếu không, một làm việc xung quanh có thể có một ứng dụng "Loader" riêng biệt mà người dùng bắt đầu và chỉ bắt đầu công cụ WPF thực của bạn bằng cách sử dụng Verbrunas như được nêu chi tiết trong bài đăng blog this (do đó Process.StartInfo.Verb = "runas";).

+0

Thật không may, đoạn mã kê khai của bạn cũng không hoạt động. Tôi đã nghĩ để bắt đầu một quá trình mới với động từ runas bất cứ khi nào thay đổi tập tin host - nhưng điều này sẽ ảnh hưởng nghiêm trọng đến khả năng sử dụng của ứng dụng cho người dùng với UAC được kích hoạt (tức là: nó sẽ hết sức khó chịu). Một dấu nhắc UAC lúc bắt đầu sẽ tốt hơn. Không có hành vi phạm tội, nhưng một ứng dụng tải là một hack và tôi muốn tránh nó, nhưng cảm ơn cho đầu vào. – bszom

+1

Vì vậy, đó là chính xác như thế nào các biểu hiện tìm cho ứng dụng tôi đang làm việc trên tại nơi làm việc, và độ cao đang làm việc cho nó. Sự khác biệt ở đây có thể là tên tệp là "app.manifest" và tùy chọn dự án "Tệp kê khai" (trên tab Ứng dụng) trỏ đến nó. –

+0

Tôi có thuộc tính dự án của mình được đặt thành tệp kê khai. Tôi sẽ thử đổi tên nó thành app.manifest ... mặc dù điều đó có vẻ hy vọng.Vì vậy, bạn nhận được lời nhắc khi bắt đầu ứng dụng? Có phải WPF không? Ứng dụng của tôi không cửa sổ (chỉ dành cho người dùng khay điều khiển và khay WPF), đó có phải là yếu tố không? – bszom

1

Tôi sẽ bị đâm vào bóng tối ở đây và nói rằng đó là vấn đề chữ ký xác thực. Tôi đã không nghe nói bạn đề cập đến bất cứ điều gì về việc ký đơn của bạn. Theo như sự hiểu biết của tôi, không giống như Vista, trong Windows 2008/7, cách duy nhất để chạy một ứng dụng được nâng lên là có một tệp kê khai ứng dụng đã ký xác định mức đặc quyền mà ứng dụng cần. Nếu bạn cần sự giúp đỡ ký kết, đây là một bài viết về cách đăng ký ứng dụng của bạn: http://msdn.microsoft.com/en-us/library/bb756995.aspx

+0

Cũng giả sử bạn đã theo dõi quy trình làm việc này nhưng sẽ cung cấp ở đây để tham khảo hoặc danh sách kiểm tra: http://msdn.microsoft.com/en-us/library/bb756973.aspx – Sai

+0

Sau khi đổi tên thành app.manifest, VS thông báo rằng nó phải được chạy như là quản trị viên để gỡ lỗi (như mong đợi; xem liên kết đầu tiên tôi đăng). Ứng dụng hiện có quyền ghi vào tệp máy chủ. Nói cách khác: độ cao hiện hoạt động chính xác, ngay cả với ứng dụng chưa được ký. Tôi nghĩ rằng lợi thế của việc ký kết là không có sự can thiệp của người dùng là cần thiết để nâng cao, nhưng đó chỉ là một giả định. Cảm ơn bạn về thông tin! – bszom

Các vấn đề liên quan