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

Iis 7 通过Powershell更改远程计算机上IIS网站的物理路径,iis-7,wmi,powershell-2.0,Iis 7,Wmi,Powershell 2.0,我目前正在开发一个部署脚本,它将获取我的站点,从svn导出,删除其中的任何测试文件等,缩小javascript/css,将代码复制到远程web服务器,然后将现有站点的物理路径切换到新目录 到目前为止,除了在IIS中切换物理目录之外,我的一切都正常工作 $IIsServer = Get-WmiObject Site -Namespace "root/WebAdministration" -ComputerName $serverIP -Credential $credentials -Authen

我目前正在开发一个部署脚本,它将获取我的站点,从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}
当我查看我拥有的值时,我找不到物理路径属性


如果您有任何建议,我们将不胜感激。

root/WebAdministration WMI提供程序的问题在于它的功能不太丰富

您可以使用
Microsoft.Web.Administration
ManagedAPI。如果在服务器本身上运行,则此脚本将正常工作

[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没有想到提供一种提供凭证的方法。这意味着运行脚本的帐户需要在远程服务器上授予所有正确的权限。我现在不能尝试,因为我不在广告环境附近

脚本本身将更新站点根物理路径(
/

有关IIS7配置的更多信息,请参见以下链接:

这也适用于:

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

(请注意,行连续体使用了反勾号)

我想在@Kev的帖子之上构建

您可以在本地使用他的方法,但正如他所说,没有真正的方法为他的远程连接方法提供凭据:

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

要使用凭据远程更改物理路径,请使用以下命令: 注意:对于远程PowerShell脚本,确保TCP端口5985和 5986在本地网络上打开出站,在本地网络上打开入站 远程服务器


这两台机器都在Active Directory中吗?这两台机器在Active Directory中的不同域上,但如果需要,我们可以更改它,以便在web服务器上而不是在本地开发人员机器上运行脚本。谢谢。我对Powershell和编写IIS脚本还不太熟悉,这几天来我一直在用它来敲打墙壁。这对我帮助很大,谢谢!但是在我的Microsoft.Web.Administration版本中,OpenRemote是静态的,这导致我找到$serverManager=[Microsoft.Web.Administration.serverManager]::OpenRemote($serverIP)@mikael-你完全正确,我已经更新了我的答案。谢谢如果已安装IIS Express,则需要指定要加载的库的版本。完整IIS为7.0.0.0,IIS Express为7.9.0.0。请注意,在您设置或重新启动IIS管理器之前,IIS管理器可能不会注意到更改。他需要先导入
模块WebAdministration
,才能使其正常工作。我不需要重新启动IIS 7.5来检测更改。真奇怪。。。。PS v2似乎允许PhysicalPath和PhysicalPath,而PS v4只允许PhysicalPath作为-name参数。我可以确认,您不需要重置IIS即可检测到此更改。如果已打开IIS管理器,则需要将其关闭,然后再次打开以查看更改。就站点而言,运行此命令后,将立即更改物理路径
#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