2010-07-07 96 views
7

我正在寫一點WPF實用程序來管理主機文件中的條目以用於開發目的。正如你可能知道hosts文件受到較新的操作系統(Win 7/2008/Vista)的保護。如何以編程方式編輯Windows 7/Server 2008中的hosts文件?

我已經向我的應用程序添加了一個清單,將requestedExecutionLevel設置爲「requireAdministrator」,詳細信息請參見here(使用「簡單方法」)和相關問題here

不幸的是,這並沒有爲我工作。啓動應用程序時沒有提示提示,並且爲hosts文件調用File.AppendText仍然會導致System.UnauthorizedAccessException異常拋出:「訪問路徑'C:\ Windows \ System32 \ drivers \ etc \ hosts'是拒絕「。

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> 

任何想法?

+0

因此,如果您不升級,訪問受保護註冊表項的異常是完全可以預料的。儘管我沒有使用清單來記住所有的步驟,但我不知道爲什麼你所嘗試的並不適合你。 – 2010-07-07 09:29:31

+0

是的,預計會發生異常...和高程應該可以解決這個問題,但缺少提示表明高程不會發生。 – bszom 2010-07-07 10:01:23

+0

我正在尋找一個簡單的主機交換器程序,但我還沒有找到一個 – JasonDavis 2012-09-09 17:26:00

回答

3

意譯,變成了一個答案:

答案HO1了包含app.manifest是完全一樣的作爲我正在工作的應用程序,並且提升正在爲此工作。這裏的區別是文件名是「app.manifest」,項目選項「Manifest」(在應用程序選項卡上)指向它。

2

我不知道這是否會作出任何差別,但您的清單片斷是從我的就應該是這樣的理解略有不同(儘管可能是不同的版本):

<?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> 

否則,解決辦法可能是讓用戶啓動一個單獨的「Loader」應用程序,該應用程序僅使用Verbrunas開始您的真實WPF工具,詳見this博客文章(如此Process.StartInfo.Verb = "runas";)。

+0

不幸的是你的清單片段也無法正常工作。我曾經想過,只要需要更改主機文件,就會啓動一個新的流程,但這會嚴重影響啓用UAC的用戶的應用程序的可用性(例如:這將徹底惱人)。一開始UAC提示會更好。沒有冒犯,但裝載機應用程序是一個黑客,我寧願避免它,但感謝您的意見。 – bszom 2010-07-07 10:05:55

+1

所以,這就是清單如何查找我在工作中工作的應用程序,並且提升正在爲此工作。這裏的區別可能是文件名是「app.manifest」,項目選項「Manifest」(在應用程序選項卡上)指向它。 – 2010-07-07 20:35:54

+0

我確實將我的項目屬性設置爲清單文件。我會嘗試將它重命名爲app.manifest ...雖然這看起來很有希望。所以你在開始申請時得到提示?它是WPF?我的應用程序沒有窗口(僅限trayicon和WPF用戶控制),這可能是一個因素嗎? – bszom 2010-07-07 22:46:41

1

我要在這裏暗暗刺戳,並說這是一個真實的簽名問題。我沒有聽到你提到過簽署你的申請。據我的理解,與Vista不同,在Windows 2008/7中,運行應用程序的唯一方法是提供一個經過簽名的應用程序清單,用於標識應用程序所需的特權級別。如果您需要幫助的簽署,這裏是如何應用程序簽名的文章:從我先前的評論http://msdn.microsoft.com/en-us/library/bb756995.aspx

+0

另外假設你已經遵循這個工作流程,但要在這裏提供參考或清單:http://msdn.microsoft.com/en-us/library/bb756973.aspx – Sai 2010-07-08 14:28:51

+0

好了重命名爲app.manifest之後,VS通知它必須以管理員身份運行才能進行調試(如預期;請參閱我發佈的第一個鏈接)。該應用程序現在具有對主機文件的寫入訪問權限。換句話說:即使使用未簽名的應用程序,高程現在也能正常工作。我認爲簽署的好處是不需要用戶干預來提升,但這只是一個假設。謝謝(你的)信息! – bszom 2010-07-09 09:19:37