iis 无法提交配置更改,因为磁盘上的文件已更改

taor4pac  于 2022-11-12  发布在  其他
关注(0)|答案(3)|浏览(213)

我想有一个powershell脚本,可以创建一个IIS网站。但我得到错误
新IIS站点:文件名:\?\C:\Windows\系统配置\应用程序主机. config错误:无法提交配置更改,因为磁盘上的文件已更改。位置:C:\projects\salonsecretSrc\RegisterWebSite.ps1:38 char:9 +新IIS站点绑定信息$strIssBindigFormat -名称$st...+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~类别信息:未指定:(:)[新IIS站点],文件加载异常+完全限定的错误ID:异常错误,错误代码为。
这是我剧本:

$strCurrentPath = $MyInvocation.MyCommand.Path
$strWebSiteFolder = Get-ChildItem (dir $strCurrentPath)
$strWebSiteBindingPath = $strWebSiteFolder.Directory.FullName+"\build\WebSite"
$strCurrentFolderName = $strWebSiteFolder.Directory.Name
$strIssSiteName = "$strCurrentFolderName.local"
$strIssBindigFormat = ":80:$strIssSiteName"

Write-Host "Current Script path: $strCurrentPath"
Write-Host "IIS Web Site phycical path: $strWebSiteBindingPath"
Write-Host "IIS SiteName: $strIssSiteName"
Write-Host "IIS Bindindg Format: $strIssBindigFormat"
Write-Host "Creating App Pool - $strIssSiteName"
        New-WebAppPool -Name $strIssSiteName -Force
        Write-Host "Creating Web Site Pool - $strIssSiteName"
        New-IISSite -BindingInformation $strIssBindigFormat -Name $strIssSiteName -PhysicalPath "$strWebSiteBindingPath" -Force
        Write-Host "Mapping Pull and Web Site - $strIssSiteName"
        Set-ItemProperty "IIS:\Sites\$strIssSiteName" -name applicationPool -value $strIssSiteName
        Write-Host "$strIssSiteName WebSite Created"

什么是如何解决问题?
它可以创建一个网站第一次,但第二次,如果我手动删除它,它会得到这个错误。

wpcxdonn

wpcxdonn1#

有许多不同的东西可以锁定applicationHost.config文件并导致powershell命令(如New-IISSite)失败。
在本例中,您提到您手动删除了该站点,因此可能您仍打开IIS管理器,并且它正在锁定该文件。我建议关闭IIS管理器。
正如这篇关于Powershell和IIS的博客文章中所描述的,Octopus Deploy的开发者发现,文件锁定问题的唯一可靠解决方案是将任何更改文件的命令(如New-WebAppPool) Package 在try-catch块中,并多次重试这些操作。实现此操作的函数的源代码可以在博客中找到。

ssgvzors

ssgvzors2#

看起来New-IISSite命令真的有问题。我最后回到New-Website(通过WebAdministration模块),所有的问题都消失了。

fnvucqvd

fnvucqvd3#

由于这是第一次进入谷歌关于这个问题,我将描述我的调查结果,以造成错误消息在这里。它可能不是有关的操作系统的问题。

失败代码示例

Get-IISAppPool
New-WebAppPool -Name TestAppPool
New-IISSite -Name TestSite -PhysicalPath D:\ -BindingInformation *:80:test

说明

如果在IISAdministration PowerShell Module中使用Get-IISAppPool,然后在WebAdministration PowerShell Module中使用New-WebAppPool,则命令Get-IISAppPool将以某种方式阻止New-WebAppPool关闭applicationHost.config文件,并可能使其处于打开状态。
如果我们现在运行New-IISSite,我们将得到错误:New-IISSite : Filename: \\?\C:\Windows\system32\inetsrv\config\applicationHost.config Error: Cannot commit configuration changes because the file has changed on disk
如果按照上面描述的顺序,我也可以用其他命令来重现这一点:
1.从IIS管理模块获取-Cmdlet
1.新建-
来自Web管理模块的命令包
1.来自IIS管理模块的新IIS站点绑定

预防问题

为了解决这个问题,我找到了两个解决方案。
1.在执行New-IISSite之前删除IIS管理模块
1.将Get-IISAppPoolNew-WebAppPool Package 为Start-IISCommitDelay/Stop-IISCommitDelay
1.只使用其中一个模块。我决定只使用IIS管理模块。它不在Microsoft文档中,但您也可以使用Get-IISServerManager cmdlet创建/删除AppPools,如此处所述。

解决方法1

Get-IISAppPool
New-WebAppPool -Name TestAppPool
Remove-Module IISAdministration
New-IISSite -Name TestSite -PhysicalPath D:\ -BindingInformation *:80:test

解决方法2

Start-IISCommitDelay
Get-IISAppPool
New-WebAppPool -Name TestAppPool
Stop-IISCommitDelay
New-IISSite -Name TestSite -PhysicalPath D:\ -BindingInformation *:80:test

相关问题