Подтвердить что ты не робот

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

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

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

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

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

Приветствуются любые предложения.

4b9b3361

Ответ 1

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

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

[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 не думала предоставить способ предоставления учетных данных. Это означало бы, что для учетной записи, на которой запущен script, нужны все права, предоставленные на удаленном сервере. Я не могу попробовать это прямо сейчас, потому что я не рядом с средой AD.

Сам script обновит физический путь корневого сайта (/).

Для получения дополнительной информации о конфигурации IIS7 см. следующую ссылку:

Справочник по конфигурации IIS7 > system.applicationHost

Ответ 2

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

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

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

Ответ 3

Я хотел бы построить поверх сообщения @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 обеспечить TCP-порты 5985 и 5986 открыты исходящие в вашей локальной сети и входящие удаленный сервер.