2011-06-17 24 views
14

Estoy intentando actualizar la unión en un sitio en particular http cual puedo ver con:actualización Powershell IIS enlaces

Set-ItemProperty "IIS:\Sites\SiteName" -Name bindings -Value @{protocol="http";bindingInformation=*:80:hostname.site.net} 

El problema que estoy teniendo es que aunque este comando reemplaza totalmente la información de enlace de modo si hay un enlace https, se elimina con Set-ItemProperty.

¿Alguien sabe una forma de actualizar un enlace específico como HTTP sin tener que eliminar los otros o volver a crear toda la cadena de enlace?

Respuesta

17

Los pasos para ACTUALIZAR un enlace en la colección de enlace de un sitio web, el proceso es en realidad Obtener la colección de enlace del sitio web, modificar el enlace específico y luego establecer toda la colección nuevamente.

Function ReplaceWebsiteBinding { 

    Param(
     [string] $sitename, 
     [string] $oldBinding, 
     [string] $newValue 
    ); 
    import-module webadministration; 
    $wsbindings = (Get-ItemProperty -Path "IIS:\Sites\$sitename" -Name Bindings) 
    for($i=0;$i -lt ($wsbindings.Collection).length;$i++){ 
     if((($wsbindings.Collection[$i]).bindingInformation).Contains($oldBinding)){ 
      ($wsbindings.Collection[$i]).bindingInformation = $newValue; 
     } 
    } 
    Set-ItemProperty -Path "IIS:\Sites\$sitename" -Name Bindings -Value $wsbindings 
} 

ReplaceWebsiteBinding "Default Web Site" "*:80:" "192.168.1.101:80:SomeHostHeader.domain"; 

[Nota: Editado 20131016: Limpiar respuesta para facilitar la visualización] [Nota: Editado 20160817: Se ha corregido definiciones de tipo variable de parám]

+0

No creo que esta solución es bastante buena ya que borrará todos los enlaces si tiene más de uno y acabo de dejar con la especificada. –

+0

No estoy de acuerdo con que responda exactamente la pregunta, pero creo que es lo mejor que se puede hacer con PowerShell contra IIS. Lo que me gustaría ver es algo como '$ b = Get-WebBinding; $ b.SetAttribute ('Puerto', 9999); $ b.Guardar; 'pero eso no funciona. No puedo eliminar el downvote a menos que cambies la respuesta (!) ... raro. –

+0

La solución Spoonfed se ha proporcionado en la respuesta mediante un cambio. Por favor revise su downvote. – JonnyG

15

Aquí hay otra forma de sintaxis. Prefiero este porque parece más natural. Si aún no tiene cargado el módulo PS de administración web, impórtelo primero (import-module webadministration).

New-WebBinding -name test03 -port 443 -Protocol https -HostHeader test03.int -IPAddress "*" 
+1

¿Se puede agregar un certificado SSL con este comando? –

+1

sí - aquí hay más información sobre cómo hacer eso: http://www.iis.net/learn/manage/powershell/powershell-snap-in-configuring-ssl-with-the-iis-powershell-snap- en – northben

+0

Tenga en cuenta que este comando se introdujo con Windows Server 2012. Si todavía está en Server 2008, tendrá que ir con la solución de JohnnyG. – JamesQMurphy

1

Set-WebBinding -Nombre 'Sitio Web predeterminado' -BindingInformation "*: 80:" -propertyname Puerto -Valor 12

Subrat

+0

Debe intentar incluir un poco más de explicación en su respuesta. – kddeisz

1

Aquí es un script de PowerShell que escribí hace poco que se puede adaptar a hacer lo que quiera:

# Updates IIS bindings across all sites by replacing all occurrences 
# of $searchString for $replaceString in the binding host header. 
# Note that the search and replace is case insensitive. 

$searchString = "ovh-ws0" 
$replaceString = "ovh-ws1" 
foreach ($website in Get-Website) { 
    "Site: {0}" -f $website.name 
    $bindings = Get-WebBinding -Name $website.name 
    foreach ($binding in $website.bindings.Collection) { 
     $bindingInfo = $binding.bindingInformation 
     " Binding: {0}" -f $bindingInfo 
     if ($bindingInfo -imatch $searchString) { 
      $oldhost = $bindingInfo.Split(':')[-1] 
      $newhost = $oldhost -ireplace $searchString, $replaceString 
      "  Updating host: {0} ---> {1}" -f $oldhost, $newhost 
      Set-WebBinding -Name $website.name -BindingInformation $bindingInfo -PropertyName "HostHeader" -Value $newhost 
     } 
    } 
} 

y esto es un ejemplo del resultado del script anterior:

Site: alpha 
    Binding: 100.101.102.103:80:alpha.redacted.com 
    Binding: 100.101.102.103:80:ovh-ws0-alpha.redacted.com 
     Updating host: ovh-ws0-alpha.redacted.com ---> ovh-ws1-alpha.redacted.com 
    Binding: 100.101.102.103:443:ovh-ws0-alpha.redacted.com 
     Updating host: ovh-ws0-alpha.redacted.com ---> ovh-ws1-alpha.redacted.com 
    Binding: 100.101.102.103:443:alpha.redacted.com 
Site: beta 
    (etc) 
Site: release 
    (etc) 

Por supuesto, el script se puede adaptar para modificar enlaces de otras maneras. Por ejemplo, la siguiente secuencia de comandos actualizará las direcciones IP:

# Updates IIS bindings across all sites by replacing all IP addresses from $oldIP to $newIP. 

$oldIP = "100.101.102.103" 
$newIP = "*" 
foreach ($website in Get-Website) { 
    "Site: {0}" -f $website.name 
    $bindings = Get-WebBinding -Name $website.name 
    foreach ($binding in $website.bindings.Collection) { 
     $bindingInfo = $binding.bindingInformation 
     " Binding: {0}" -f $bindingInfo 
     if ($bindingInfo -imatch $oldIP) { 
      "  Updating IP: {0} ---> {1}" -f $oldIP, $newIP 
      Set-WebBinding -Name $website.name -BindingInformation $bindingInfo -PropertyName "IPAddress" -Value $newIP 
     } 
    } 
} 
Cuestiones relacionadas