【问题标题】:Powershell scripting creation of a "sub" websitePowershell 脚本创建“子”网站
【发布时间】:2016-03-28 23:10:36
【问题描述】:

我有两个文件夹:

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

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

但是,当我尝试在 Powershell 中编写脚本时,事情变得很困难。我可以毫无问题地创建“site1”和应用程序池。这是一个痛苦的子站点。我尝试了两种方法:

方法一:使用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 中编写此场景的脚本?

【问题讨论】:

  • 故障排除方法 1,执行以下工作:Set-ItemProperty -Path "IIS:\Sites\site1\site1Sub" -Name "applicationPool" -Value "site1"。如果是这样,我怀疑Set-ItemProperty 绑定到来自 $subSub 对象的意外属性(例如短名称“site1Sub”)并将其附加到当前工作目录 C:\。

标签: asp.net powershell iis


【解决方案1】:

我发现在网站下创建应用程序时,我需要在对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 管理器中获得以下结果:

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

    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
    

    结果:

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      您是否尝试过将 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 来为你确认,只是把它放在这里试试。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-10-17
        • 1970-01-01
        • 2020-12-26
        • 1970-01-01
        • 1970-01-01
        • 2017-10-06
        • 1970-01-01
        • 2022-11-15
        相关资源
        最近更新 更多