Изменение физического пути на веб-сайте 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}
Когда я просматриваю значения, у меня есть я не могу найти свойство физического пути.
Приветствуются любые предложения.
Ответы
Ответ 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 открыты исходящие в вашей локальной сети и входящие удаленный сервер.