win2000下iis無法訪問asp網頁 未能啟動 aspnet_wp.exe
今天維護一個windows2000的iis服務器,網頁無法訪問,系統應用程序日志提示:
①、未能啟動 aspnet_wp.exe,原因是配置文件的 processModel 節中提供的用戶名和/或密碼無效。
②、未能啟動 aspnet_wp.exe。失敗的 HRESULT:80004005
找了很多原因,都說是域服務器的donnet下的用戶權限配置問題,引用詳見下面,但是我的服務器不在域環境中,納悶了很久。
引用:
************************************************************************************
Win2000域服務器 IIS 無法使用asp.net程序的解決方法
把一臺服務器升級為域控制器后,安裝了ASP.NET,配置完IIS后,發現無法運行*.ASPX文件,每次運行都告訴我服務器內部錯誤,同時會在系統應用程序日志里加上以下2個錯誤
未能啟動 aspnet_wp.exe,原因是配置文件的 processModel 節中提供的用戶名和/或密碼無效。
未能啟動 aspnet_wp.exe。失敗的 HRESULT:80004005
*.ASP文件運行正常,請那位高手指點一下,到底是什么問題?
解決的辦法有幾種,
其中最快但不安全的一種是:
更改machine.config文件,
它位于C:\WINNT\Microsoft.NET\ Framework\v1.0.3705(asp.net 1.0是這樣,如果你的版本是1.1的,文件夾名回不同)\CONFIG\,
將里面一個部件<processModel>中的 username的屬性設置為SYSTEM,正因為它原來默認的設置為machine,
所以訪問的asp.net的用戶名為aspnet,而這個帳號為本地帳號,而我們登錄的帳號是域控制器的帳號,不是本地機器的帳號,
這樣導致aspnet_wp.exe找不到一個本地的localmachinename \aspnet帳號而不能啟動.
這種方法我實驗過,驗證上述情況.但它很不安全,但你發布asp.net網頁時,瀏覽的用戶在你的域中是屬于system 屬性,
這樣會帶來安全隱患.最好的辦法就是,也是微軟推薦的.在你的域中添加一個aspnet帳號,設置適當的權限,而不去更改 machine.config文件.
解決方案
要解決此問題,請使用下列方法之一:
?創建具有正確權限的弱帳戶,然后配置 Machine.config 文件的 <processModel> 部分以使用該帳戶。
?在 Machine.config 文件的 <processModel> 部分,將 userName 屬性設置為 SYSTEM。
?配置 Machine.config 文件的 <processModel> 部分以使用管理員帳戶。
注意:在 ASP.NET 1.1 中,ASPNET 的進程標識為 IWAM_MachineName,所以不存在此問題。
注意:如果允許 ASP.NET 應用程序作為 SYSTEM 或管理員帳戶運行,將帶來嚴重的安全問題。如果使用其中的任一種替代方法,在Aspnet_wp.exe 進程中運行的代碼都將有權訪問域控制器和域設置。從 Aspnet_wp.exe 進程啟動的可執行文件在相同的上下文中運行,它們也有權訪問域控制器。
因此,Microsoft 建議使用第一種替代方法。若要使用第一種替代方法,請按照下列步驟操作: 1. 在計算機上創建名為 ASPUSER 的用戶帳戶,然后將此帳戶添加到用戶組中。
注意:如果更改了 .NET Framework 創建的 ASPNET 帳戶的密碼,也可以使用該帳戶。您必須知道此帳戶的密碼,因為需要在后面的步驟中將該密碼添加到 <processModel> 部分。
2. 授予 ASPUSER 或 ASPNET 帳戶“作為批處理作業登錄”用戶權限。確保此更改出現在“本地安全策略”設置中。
注意:若要向此帳戶授予“作為批處理作業登錄”用戶權限,可能必須在以下每一個安全策略中都授予此用戶權限(從控制面板/管理工具開始操作):
?域控制器安全策略
?域安全策略
?本地安全策略
注意:您可能必須重新啟動服務器以使這些更改生效。
3. 確保 ASPUSER 或 ASPNET 帳戶有權訪問啟動 Aspnet_wp.exe 進程和為 ASP.NET 頁提供服務所必需的全部目錄和文件。有關必須授予此帳戶何種權限的其他信息,請單擊下面的文章編號,以查看 Microsoft 知識庫中相應的文章:
317012 INFO:ASP.NET 中的進程和請求標識
4. 打開 Machine.config 文件。該文件的路徑是:%Systemroot%\Microsoft.NET\Framework\v1.0.3705\CONFIG。
5. 在 Machine.config 文件的 <processModel> 部分,將 userName 和 password 屬性更改為您在第一步中創建的帳戶的名稱和密碼。例如:
userName="DomainName\ASPUSER" password="ASPUSERpassword"
6. 保存對 Machine.config 文件所做的更改。
************************************************************************************
弄了很久一直不行,后來終于發現系統中iuse_oaserver(oaserver是服務器的計算機名)用戶名被改成了iuse_server,很多用戶都沒掉了或者被改名了,可能是原先中毒的緣故,我添加了IUSE_OASERVER,添加了dotnet1.1安裝目錄下的權限等,網頁可以訪問了。主要有以下操作:
①、aspnet_regiis -i (重新安裝ASP.NET 組件);
②、給donnet1.1 安裝目錄C:\WINNT\Microsoft.NET\Framework\v1.1.4322的安全屬性里添加iuse_oaserver讀取的權限;
③、重新啟動一下IIS 或者在"運行"中輸入:iisreset;
④、激活2個帳戶 ASPNET、IUSR_machine("machine"為計算機名稱),不要設置密碼,確認在IIS的安全設置(匿名訪問)里面找到"IUSR_machine"用戶,并且是由IIS控制密碼的;
這一章,我們了解一下launchSettings.json的作用。
打開launchSettings.json 文件后,默認情況下,您將找到以下代碼。
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:1118",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"WebApplication4": {
"commandName": "Project",
"dotnetRunMessages": "true",
"launchBrowser": true,
"applicationUrl": "http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
在這里,您可以看到,我們有兩個部分。 一種用于IIS Express(IIS服務器),另一種用于Kestrel服務器。
在Visual Studio中,您可以找到上述兩個配置文件(IIS Express和WebApplication4),如下所示。
如果選擇 IIS Express,則它將使用 IIS 服務器,如果您選擇 WebApplication4 應用程序,則它將使用 Kestrel 服務器。
launchSettings.json文件的 commandName 屬性的值可以是以下任何一個:
當我們在launchSettings.json文件中將CommandName用作Project時,ASP.NET Core將忽略AspNetCoreHostingModel值。 Kestrel是唯一將托管應用程序并處理傳入請求的服務器。 讓我們證明這一點。 現在,我們需要將啟動Profile設置為WebApplication4,如下所示。
如果查看launchSettings.json文件,那么您將看到WebApplication4配置文件使用"commandName":"Project"值,并且請注意下面所示的應用程序URL。
在我的應用程序中,URL為http://localhost:5000,端口號在您的示例中可能有所不同。
"WebApplication4": {
"commandName": "Project",
"dotnetRunMessages": "true",
"launchBrowser": true,
"applicationUrl": "http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
現在,將應用程序項目文件中的AspNetCoreHostingModel元素值更改為InProcess,如下所示。
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
</PropertyGroup>
</Project>
然后, 啟動該項目, 可以看到首先啟動了CMD,在這種情況下將使用kestrel服務器托管應用程序。
注: 因為當CommandName值為Project時,它將忽略AspNetCoreHostingModel值,而Kestrel是唯一將托管和處理傳入請求的服務器。
如果我們使用命令名作為 IISExpress 配置文件,如果我們將 AspNetCoreHostingModel 值設置為 OutOfProcess,則ASP.NET Core使用IIS Express作為外部 Web 服務器,Kestrel 是內部 Web 服務器。外部 Web 服務器(即 IIS Express)將接收傳入的 HTTP 請求,然后將請求轉發到內部 Web 服務器,即將處理請求的 Kestrel。讓我們證明這一點。
由于我們已經將啟動配置文件設置為 IIS Express,我們只需要將 AspNetCoreHostingModel 元素值更改為應用程序的項目文件中的 OutOfProcess,如下所示。
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<AspNetCoreHostingModel>OutOfProcess</AspNetCoreHostingModel>
</PropertyGroup>
</Project>
運行應用程序,瀏覽器輸出了項目名稱, 如下所示, 因為請求由Kestrel Web Server服務器處理。
注: 通過運行時,輸出當前進程名稱即可。