特定のサイトでhttpバインディングを更新しようとしています。
Set-ItemProperty "IIS:\Sites\SiteName" -Name bindings -Value @{protocol="http";bindingInformation=*:80:hostname.site.net}
私が抱えている問題は、このコマンドがバインディング情報を完全に置き換えるため、httpsバインディングがある場合、Set-ItemPropertyで削除されることです。
他のバインディングを削除したり、バインディング文字列全体を再作成したりせずに、HTTPなどの特定のバインディングを更新する方法を知っている人はいますか?
Webサイトのバインディングコレクションのバインディングを更新する手順は、実際にはWebサイトのバインディングコレクションを取得し、特定のバインディングを変更してから、コレクション全体を再設定することです。
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";
[注:20131016を編集:見やすくするために回答をクリーンアップ] [注:20160817を編集:param変数タイプの定義を修正]
別の構文形式を次に示します。より自然に見えるので、私はこれを好みます。 webadministration PSモジュールをまだロードしていない場合は、最初にインポートします(import-module webadministration
)。
New-WebBinding -name test03 -port 443 -Protocol https -HostHeader test03.int -IPAddress "*"
これが私が最近書いたPowershellスクリプトで、あなたが望むことをするように適応させることができます:
# 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
}
}
}
そして、これは上記のスクリプトからの出力例です。
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)
もちろん、スクリプトは他の方法でバインディングを変更するように適合させることができます。たとえば、次のスクリプトは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
}
}
}
Set-WebBinding -Name 'デフォルトのWebサイト' -BindingInformation "*:80:" -PropertyName Port -Value 12
サブラット
「New-ItemProperty」を使用して追加し、「Set-ItemProperty」を使用して既存のものを更新します。