Изменение физического пути веб-сайта IIS на удаленной машине через Powershell - PullRequest
24 голосов
/ 15 октября 2010

В настоящее время я работаю над сценарием развертывания, который берет мой сайт, экспортирует его из svn, удаляет из него все тестовые файлы и т. Д., Минимизирует javascript / css, копирует код на удаленный веб-сервер и затем переключаетфизический путь существующего сайта к новому каталогу.

Пока у меня все работает, кроме переключения физического каталога в IIS.

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

Когда я смотрю на значения, которые у меня есть, яне могу найти свойство физического пути.

Буду признателен за любые предложения.

Ответы [ 3 ]

45 голосов
/ 15 октября 2012

Это также работает:

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

(обратите внимание на использование обратных кавычек для продолжения строки)

23 голосов
/ 15 октября 2010

Проблема с провайдером root/WebAdministration WMI заключается в том, что он не очень богатый набор функций.

Вместо этого вы можете использовать управляемый API Microsoft.Web.Administration.Этот скрипт будет работать, если он выполняется на самом сервере.

[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

2 голосов
/ 22 января 2016

Я бы хотел опираться на пост @ Кева.

Вы можете использовать его метод локально , но, как он говорит, нет никакого реального способа предоставить учетные данные для его комментариев.метод удаленного подключения:

$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 гарантируют, что TCP-порты 5985 и 5986 открыты для исходящих вызовов в локальной сети и входящих на удаленный сервер.

...