Win7/Vista/Server2008下VS 環境 調試調用 HTTP.SYS 無法啟動監聽服務及啟動后其他機器無法訪問端口


 

一. VS調試在Win7(vista系列)操作系統下 HttpListener無法綁定多個 指定IP、端口問題

 

  

 

  來自:http://www.cnblogs.com/ryhan/p/4195693.html 

 

  現象:System.Net.HttpListenerException (0x80004005): 拒絕訪問。

  原因:VS IDE 權限不夠(生成的產物權限也會不夠),提升UAC權限即可解決

  步驟:

    1.選中對應Project,右鍵添加->新增應用程序清單文件 app.manifest

 

    

 

    2.將配置項 requestedExecutionLevel 的級別 asInvoker 改為 requireAdministrator

 

    

 

    3.啟動調試,會使用超級權限重啟IDE

 

    

 

    4.重啟后,服務啟動成功...    

         

    5.編譯的exe文件會出現盾牌標識

 

    

 

參考資料:

    http://blog.csdn.net/a316019667/article/details/8647237 --vs2005 中引入app.manifest(c#程序在win7下以管理員權限運行方法)

    http://www.tuicool.com/articles/BnE7jy --.NET中提升UAC權限的方法總結 - 大魔王mAysWINd

    http://tech.sina.com.cn/s/2009-12-10/07281168314.shtml --詳解Visual Studio對應用程序的UAC設置

    http://www.cnblogs.com/wene/archive/2010/09/12/1824476.html --Visual studio 2008中添加manifest文件

    http://blog.csdn.net/nanchuan/article/details/8301310 --WIN7中HttpListener拒絕訪問異常解決C# 

    

 

二. 在Win7(vista系列)已啟動的HTTP服務,其他機器無法訪問問題(或者無法以服務方式啟動程序)

 

  現象:其他機器無法訪問已啟動的服務端口

  原因:1.端口被防火牆隔離

     2.系統未監聽對應的端口數據

     3.系統未將監聽到的數據轉發給對應的處理程序

  步驟:

    用管理員模式打開命令行:

 

    1. 輸入以下指令 添加URL 訪問控制列表

    netsh http add urlacl url=http://+:8080/ sddl="D:(A;;GX;;;LS)"

    2.輸入以下指令 添加需要偵聽的IP+端口

    netsh http add iplisten ipaddress=0.0.0.0:8080

    3.輸入以下指令 添加防火牆規則(必選項)

    netsh advfirewall firewall add rule name="My Http Sev" dir=in action=allow protocol=TCP localport=8080

    完成以上步驟后,服務應該可以被其他機器訪問了。

 

    參考資料:

    http://www.cnblogs.com/cmdszh/archive/2012/08/16/httplistener.html --WIN7中 HttpListener 拒絕訪問 異常解決 C#
    http://www.cnblogs.com/jiewei915/archive/2010/06/21/1762066.html --WCF 部署問題 小總結 (HTTP 不能注冊的解決方法)

 

 

----------------------------------------------------------分割線  以下部分為抄錄----------------------------------------------------------------

源地址:http://www.cnblogs.com/jiewei915/archive/2010/06/21/1762066.html

 

可是工具寫完,部署之后, 卻出錯了, Windows 服務 卻沒有啟動。

當時原因是不知道的,因此我是在 Windows  2008 R2 Core 下部署的,查看不了日志(為什么要用 R2? 恩,因為我在Win 2008 Core下安裝 .NET 3.5 的時候出錯了~)

今天,又找了一下測試機,發現問題了

日志名稱:          Application
來源:            DDNSHostService
日期:            2009/8/13 14:13:06
事件 ID:         0
任務類別:          無
級別:            錯誤
關鍵字:           經典
用戶:            暫缺
計算機:           WPI2-PC
描述:
無法找到來自源 DDNSHostService 的事件 ID 0 的描述。本地計算機上未安裝引發此事件的組件,或者安裝已損壞。可以安裝或修復本地計算機上的組件。

 

如果該事件產生於另一台計算機,則必須在該事件中保存顯示信息。

以下是包含在事件中的信息:

 

無法啟動服務。System.ServiceModel.AddressAccessDeniedException: HTTP 無法注冊 URLhttp://+:8080/。進程不具有此命名空間的訪問權限(有關詳細信息,請參閱http://go.microsoft.com/fwlink/?LinkId=70353)。 ---> System.Net.HttpListenerException: 拒絕訪問。
   在 System.Net.HttpListener.AddAll()
   在 System.Net.HttpListener.Start()
   在 System.ServiceModel.Channels.SharedHttpTransportManager.OnOpen()
   --- 內部異常堆棧跟蹤的結尾 ---
   在 System.ServiceModel.Channels.SharedHttpTransportManager.OnOpen()
   在 System.ServiceModel.Channels.TransportManager.Open(TransportChannelListener channelListener)
   在 System.ServiceModel.Channels.TransportManagerContainer.Open(SelectTransportManagersCallback selectTransportManagerCallback)
   在 System.ServiceModel.Channels.HttpChannelListener.OnOpen(TimeSpan timeout)
   在 System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   在 System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen(TimeSpan timeout)
   在 System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   在 System.ServiceModel.ServiceHo...

在Windows 日志看到了這個錯誤,

網上查了一下,基本是權限問題。

 

實際上這個問題主要是由於使用了 HTTP 綁定引起的,因為系統中的 HTTP的注冊由 HTTP.sys 管理。

所以,不是HTTP的應該沒有這個問題。

 

解決方法給針對部署方式說明

如果是Windows程序, 一般 右鍵單擊, 選擇“以管理員方式啟動” 既可以,包括VS調試的時候

如果是在IIS下,一般 是沒有問題, WPA(Windows進程激活服務)/IIS7

一般是沒有問題的,IIS本身就已經具有權限了

如果是Windows 服務(本文重點),可能需要配置一下了

作為一個WCF服務來講,如果用一般程序來HOST,作為最終產品,始終有點不好,(當然,這個是以服務端是服務器的前提下說的, 如果是那種P2P一類的程序就不是這個問題!)

在部署服務的時候,一般會選擇一個系統帳號,來運行服務

默認情況下, 如果使用的是本地系統賬戶(Local system) 應該是沒有問題的,

其他的2個賬戶,可能就會遇到錯誤, 分別是 本地服務賬戶(Local Service Account) 和 網絡服務賬戶(Network Service Account)

當然,你可以自己指定一個賬戶,這里順便說一下, 上邊的3個賬戶是沒有密碼的

 

下面說一下解決辦法

1、用管理模式打開命令行

命令1 

 

netsh http add urlacl url=http://地址可以用+表示通用:端口/  sddl="D:(A;;GX;;;LS) user =domain\user

 

解釋一下

netsh 是HTTP的配置工具 Vista 以上 自帶, 之前的版本是HTTPCfg,在額外的工具包里

HTTP 是配置 HTTP相關的

add 是添加,也有其他操作 比如 刪除 Delete  和 顯示 Show

urlacl  就是最主要的了, URL ACL(URL 訪問控制列表)

URL=  就是你要用到的地址,可以是域名 比如  abc.com 之類的,也可以用 + 表示通用, (也包含端口哦)

SDDL 是 安全描述定義語言(Security Descriptor Definition Language),一個很晦澀的東西,我也沒有太懂。具體的可以參考后文鏈接。

這里解釋一下上面寫的。

D:(A;;GX;;;LS)

D: DACL 標記

A 表示 允許訪問

GX 一般執行 權限

LS 本地服務賬戶(Local service account)

另外還有

SY 本地系統賬戶( Local system)

NS 網絡服務賬戶(Network service account)

如果不用這個預知的賬戶,你可能需要輸入 對應賬戶的SID 才可以

User 表示 對應的用戶, 和上邊的最后一點差不多, 不過應該是用在自定義啟動賬戶上了。

 

例如, 允許 本地服務 注冊 所有地址 的8080端口 的命令是

 

netsh http add urlacl url=http://+:8080/ sddl="D:(A;;GX;;;LS)"

 

這個成功的話,你應該可以啟動服務。

接下來

命令2

 

netsh http add iplisten ipaddress=IP地址+端口

 

解釋,前半服務和前邊的相同。只說不同的部分

ipListen  是IP偵聽列表

ipaddress 是要偵聽的IP地址+端口 (可以是IPV6地址)

 

例如: 監聽所有地址的8080端口

 

netsh http add iplisten ipaddress=0.0.0.0:8080

 

接下來,添加防火牆規則, 如果你用的是Win2008以上的服務器,你需要配置一下系統防火牆,當然,你可以關掉。

命令3

 

netsh advfirewall firewall add rule name=名字 dir=in action=allow protocol=協議 localport=端口

 

解釋:

advfirewall  是高級防火牆功能

firewall  就是防火牆

add  和前邊的相同

Rule  是規則

Name 是規則的名字

Dir  是 數據方向,in 表示進入 out  表示 發出

action 是動作  有 allow 允許 和 block 阻止

protocol 是協議 可以是 0-255|icmpv4|icmpv6|icmpv4:type,code|icmpv6:type,code|tcp|udp|any (default=any) 一般是TCP

localport 就是本地使用的寬口號

 

例如,允許 HTTP 8080 端口 的外來訪問, 規則的名字是 "DDNS Client Host Service"

 

netsh advfirewall firewall add rule name="DDNS Client Host Service" dir=in action=allow protocol=TCP localport=8080

 

 

這些完成后,基本程序就能跑了。外邊的機器也應該能訪問了

如果要刪除的話,可以把 Add 換成 Delete  ,雖然有些小問題

 

---------

測試程序下載

---------


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM