可是工具寫完,部署之後, 卻出錯了, 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.net.httplistener.addall()
在 system.net.httplistener.start()
在 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.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 ,雖然有些小問題
@echo off
:: 安裝工具
:: 第一個是32位版的,第二個是64位版的, 注意: 在64位系統中,2個都可以 用,根據需求選擇
if "%processor_architecture%"=="amd64" set installutil=%windir%\microsoft.net\framework64\v2.0.50727\installutil.exe else set installutil=%windir%\microsoft.net\framework\v2.0.50727\installutil.exe
::服務程式檔案
set service=ddnsservice.exe
::服務端口
set port=8080
::服務顯示名字
set name="dynamicdns client host service"
if "%1"=="/u" goto uninstall
echo 正在安裝服務 %name%
%installutil% %service%
echo 正在配置本地端口
netsh http add urlacl url=http://+:%port%/ sddl="d:(a;;gx;;;sy)"
netsh http add iplisten ipaddress=0.0.0.0:%port%
echo 正在設定防火牆
netsh advfirewall firewall add rule name=%name% dir=in action=allow protocol=tcp localport=%port%
::啟動服務,可以注釋掉
echo 啟動服務
net start %name%
echo 安裝完畢! 你 可以運作 “setup.bat” /u 進行解除安裝。
goto end
:uninstall
echo 開始解除安裝服務
echo 正在停止服務
net stop %name%
echo 正在解除安裝服務 %name%
%installutil% %service% /u
echo 正在清理本地端口配置
netsh http delete urlacl url=http://+:%port%/
netsh http delete iplisten ipaddress=0.0.0.0
echo 正在清理防火牆設 置
netsh advfirewall firewall delete rule name=%name%
echo 解除安裝完畢!
:end
pause
其他參考
歡迎加群互相學習,共同進步。qq群:ios: 58099570 | android: 330987132 | go:217696290 | python:336880185 | 做人要厚道,轉載請注明出處!http://www.cnblogs.com/sunshine-anycall/archive/2010/04/30/1725357.html