Powershell脚本创建“子”网站

时间:2016-03-22 20:15:32

标签: asp.net powershell iis

我有两个文件夹:

C:\的Inetpub \ SITE1
C:\的Inetpub \ site1Sub

我希望“site1”成为“父”网站,将“site1Sub”作为“子”网站。这两个站点应该在同一个应用程序池下运行,这是一个专为这些站点创建的自定义池,称之为“site1”。在IIS管理器(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

方法2:创建虚拟目录并使用ConvertTo-WebApplication(如this answer中所述)。

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中编写此场景的脚本?

3 个答案:

答案 0 :(得分:2)

我发现在网站下创建应用时,我需要在调用-Force时指定New-Item开关。我已经遗漏了检查,看看该网站是否已经存在(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

答案 1 :(得分:1)

正如我所理解的,您希望在本地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

希望这有帮助。

答案 2 :(得分:-1)

您是否尝试将IIS目录树映射为PSDrive,然后重新尝试接近1?

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配置以确认您,但只是将其放在此处尝试。