通过Powershell更改远程计算机上IIS网站的物理路径

时间:2010-10-14 22:20:45

标签: iis-7 wmi powershell-v2.0

我正在开发一个部署脚本,它将占用我的网站,从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}

当我查看我拥有的值时,我无法找到物理路径属性。

任何建议都将不胜感激。

3 个答案:

答案 0 :(得分:44)

这也有效:

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

(注意使用反引号进行续行)

答案 1 :(得分:23)

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 Configuration Reference > system.applicationHost

答案 2 :(得分:2)

我想建立在@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在您的本地网络上打开 出站并在您的本地网络上出站   远程服务器。