Win7/Vista/Server2008下VS 環境 調試調用 HTTP.SYS 沒法啓動監聽服務及啓動後其餘機器沒法訪問端口

 

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

 

  

 

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

 

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

  緣由:VS IDE 權限不夠(生成的產物權限也會不夠),提高UAC權限便可解決服務器

  步驟:網絡

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

 

    

 

    2.將配置項 requestedExecutionLevel 的級別 asInvoker 改成 requireAdministratordom

 

    

 

    3.啓動調試,會使用超級權限重啓IDEtcp

 

    

 

    4.重啓後,服務啓動成功...    工具

         

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

 

    

 

參考資料:

    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 

 

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  ,雖然有些小問題

 

---------

測試程序下載

---------

相關文章
相關標籤/搜索