web-dev-qa-db-ja.com

Powershellを介してリモートマシン上のIIS Webサイトの物理パスを変更する

私は現在、自分のサイトを取得し、svnからエクスポートし、その中のテストファイルなどを削除し、javascript/cssを縮小し、コードをリモートWebサーバーにコピーしてから、の物理パスを切り替えるデプロイメントスクリプトに取り組んでいます。既存のサイトを新しいディレクトリに移動します。

これまでのところ、IISの物理ディレクトリを切り替える以外はすべて機能しています。

$IIsServer = Get-WmiObject Site -Namespace "root/WebAdministration" -ComputerName $serverIP -Credential $credentials -Authentication PacketPrivacy
$site = $IIsServer | Where-Object {$_.Name -eq $siteName}

持っている値を調べても、物理パスのプロパティが見つかりません。

任意の提案をいただければ幸いです。

27
Ryan French

root/WebAdministration WMIプロバイダーの問題は、機能があまり豊富ではないことです。

代わりに、Microsoft.Web.AdministrationマネージAPIを使用できます。このスクリプトは、サーバー自体で実行すると機能します。

[Void][Reflection.Assembly]::LoadWithPartialName("Microsoft.Web.Administration")

$siteName = "Default Web Site"
$serverIP = "your ip address"
$newPath = "your new path"

$serverManager = New-Object Microsoft.Web.Administration.ServerManager
## $serverManager = [Microsoft.Web.Administration.ServerManager]::OpenRemote($serverIP)
$site = $serverManager.Sites | where { $_.Name -eq $siteName }
$rootApp = $site.Applications | where { $_.Path -eq "/" }
$rootVdir = $rootApp.VirtualDirectories | where { $_.Path -eq "/" }
$rootVdir.PhysicalPath = $newPath
$serverManager.CommitChanges()

これをリモートで行う必要がある場合に役立つ可能性のあるコメント付きのアウトラインがあることに気付くでしょう。

## $serverManager = [Microsoft.Web.Administration.ServerManager]::OpenRemote($serverIP)

残念ながら、MSは資格情報を提供する方法を提供しようとは考えていませんでした。これは、スクリプトを実行しているアカウントには、リモートサーバーで付与されたすべての適切なアクセス許可が必要であることを意味します。 AD環境の近くにいないため、今はこれを試すことができません。

スクリプト自体がサイトルートの物理パス(/)を更新します。

IIS7の構成の詳細については、次のリンクを参照してください。

IIS7構成リファレンス> system.applicationHost

23
Kev

これも機能します:

PS IIS:\Sites> Set-ItemProperty IIS:\Sites\Staging `
                   -name physicalPath `
                   -value "C:\blah\Web"

(行の継続にはバックティックを使用することに注意してください)

46
Doug

@Kevの投稿の上に構築したいと思います。

彼の方法を使用することができますローカル、しかし彼が言うように、リモート接続の彼のコメントアウトされた方法に資格情報を提供する実際の方法はありません:

$serverManager = [Microsoft.Web.Administration.ServerManager]::OpenRemote($serverIP)

資格情報を使用して物理パスをリモートで変更するには、次を使用します。

#configure your remote credentials
$computerName = "remotehostname"
$securePassword = ConvertTo-SecureString "password" -AsPlainText -force
$credential = New-Object System.Management.Automation.PsCredential("username", $securePassword)

#remove –SkipCACheck –SkipCNCheck –SkipRevocationCheck if you don't have any SSL problems when connecting
$options = New-PSSessionOption –SkipCACheck –SkipCNCheck –SkipRevocationCheck
$session = New-PSSession -ComputerName $computerName -Authentication Basic -Credential $credential -UseSSL -SessionOption $options

$block = {
    [Void][Reflection.Assembly]::LoadWithPartialName("Microsoft.Web.Administration")

    $siteName = "Default Web Site"
    $serverIP = "your ip address"
    $newPath = "your new path"

    $serverManager = New-Object Microsoft.Web.Administration.ServerManager
    $site = $serverManager.Sites | where { $_.Name -eq $siteName }
    $rootApp = $site.Applications | where { $_.Path -eq "/" }
    $rootVdir = $rootApp.VirtualDirectories | where { $_.Path -eq "/" }
    $rootVdir.PhysicalPath = $newPath
    $serverManager.CommitChanges()
}

#run the code in $block on your remote server via the $session var
Invoke-Command -Session $session -ScriptBlock $block

注:リモートPowerShellスクリプトの場合、ensure TCPポート5985および5986が開いているアウトバウンドローカルネットワーク上で、リモートサーバー上でインバウンド。

2
theyetiman