使用PowerShell脚本创建“子”网站

3

我有两个文件夹:

c:\inetpub\site1
c:\inetpub\site1Sub

我希望"site1"是"父级"网站,"site1Sub"是"子级"网站。这两个网站都应该在同一个应用程序池下运行,这是一个专门为这些网站创建的自定义池,称之为“site1”。在IIS Manager (7.5)中,我只需创建应用程序池,然后创建父站点,然后右键单击父站点并“添加应用程序”,将其指向物理路径“c:\inetpub\site1Sub”。这一切都很顺利。

但当我尝试在Powershell中编写脚本时,事情变得困难。我可以轻松创建"site1"和应用程序池,但是子站点让人头疼。我尝试了两种方法:

方法1:使用New-Item并在之后设置应用程序池。

$subSite = New-Item "IIS:\Sites\site1\site1Sub" -physicalPath "C:\inetpub\site1Sub" -type "Application"
$subSite | Set-ItemProperty -Name "applicationPool" -Value "site1"

使用这种方法,在Set-ItemProperty命令后,我收到了一个错误:

Set-ItemProperty : Cannot find path 'C:\site1Sub' because it does not exist.
At line:1 char:127
+ $subSite | Set-ItemProperty -Name "applicationPool" -Value "site1"  ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (C:\site1Sub:String) [Set-ItemProperty], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.SetItemPropertyCommand

方法二:创建一个虚拟目录并使用ConvertTo-WebApplication(如这个答案中所示)。

New-WebVirtualDirectory -Site "site1" -Name "site1Sub" -PhysicalPath "c:\inetpub\site1Sub"
ConvertTo-WebApplication -ApplicationPool "site1" "IIS:\Sites\site1\site1Sub"

这段代码运行良好,而且在 IIS 管理器中也看起来不错,但当我尝试访问网站时,收到一个错误提示,指出 web.config 解析失败:
“错误:在应用程序级别之外使用已注册为 allowDefinition='MachineToApplication' 的部分是错误的。这可能是由于虚拟目录未在 IIS 中配置为应用程序所致。”
我完全被卡住了。如何在 Powershell 中编写此方案呢?

故障排除方法1,以下操作是否有效:Set-ItemProperty -Path "IIS:\Sites\site1\site1Sub" -Name "applicationPool" -Value "site1"。如果有效,我怀疑Set-ItemProperty将绑定到$subSub对象的意外属性(例如,短名称“site1Sub”),并将其附加到当前工作目录C:\。 - Charlie Joynt
3个回答

4

我发现在网站下创建应用程序时,需要在调用New-Item时指定-Force开关。虽然我没有检查网站是否已经存在(Sneijder的答案展示了如何使用Test-Path进行检查),但这应该能解决问题:

Import-Module WebAdministration

$sitePath = 'IIS:\Sites\site1'
$subSitePath = "$sitePath\site1Sub"
$appPoolName = 'site1'

# Create Site and Subsite
New-Item $sitePath -PhysicalPath 'C:\Inetpub\site1' -Bindings  @{protocol="http";bindingInformation=":80:"}                        }
New-Item $subSitePath -Type Application -PhysicalPath 'C:\Inetpub\site1Sub' -Force

# Create App Pool
New-Item "IIS:\AppPools\$appPoolName"

# Associate sites to App Pool
Set-ItemProperty $sitePath -Name applicationPool -Value $appPoolName
Set-ItemProperty $subSitePath -Name applicationPool -Value $appPoolName

2

如果我理解正确,您希望在本地IIS管理器中获得以下结果:

IIS-Manager Sites

此脚本创建一个应用程序池。然后创建根站点,之后再创建子站点。

Import-Module WebAdministration

$iisAppPoolName = "applicationPool"
$iisAppPoolDotNetVersion = "v4.0"

$iisAppName = "site1"
$directoryPath = "C:\inetpub\site1"
$iisSubAppName = "site1sub"
$directorySubPath = "C:\inetpub\site1Sub"

#navigate to the app pools root
cd IIS:\AppPools\

#check if the app pool exists
if (!(Test-Path $iisAppPoolName -pathType container))
{
    #create the app pool
    $appPool = New-Item $iisAppPoolName
    $appPool | Set-ItemProperty -Name "managedRuntimeVersion" -Value $iisAppPoolDotNetVersion
}

#navigate to the sites root
cd IIS:\Sites\

#check if the site exists
if (Test-Path $iisAppName -pathType container)
{
    return
}

#create the site
$iisApp = New-Item $iisAppName -bindings @{protocol="http";bindingInformation=":80:"} -physicalPath $directoryPath
$iisApp | Set-ItemProperty -Name $iisAppPoolName -Value $iisAppPoolName

#create the subSite
$iisSubApp = New-WebApplication -Name $iisSubAppName -Site $iisAppName -PhysicalPath $directorySubPath -ApplicationPool $iisAppPoolName

结果:

Result

希望这能帮到您。


-1
你尝试过将IIS目录树映射为PSDrive,然后重新尝试第一种方法吗?

https://technet.microsoft.com/en-us/library/ee176915.aspx

执行 Get-PSDrive 命令,查看主机可用的 PS 提供程序,然后尝试像映射文件系统一样进行映射。

# For psprovider, I'm not sure if the provider name is 'IIS' or some other.
# For mapping remote drives, usually FileSystem works,
# but try Get-PSDrive to see whats available to your host for this switch.
New-PSDrive -name X -psprovider IIS -root 'IIS:\'

我在我的测试机上没有配置IIS来为您确认,但是我在这里发布它只是为了尝试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接