我正在开发一个部署脚本,它将占用我的网站,从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}
当我查看我拥有的值时,我无法找到物理路径属性。
任何建议都将不胜感激。
答案 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配置的更多信息,请参阅以下链接:
答案 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在您的本地网络上打开 出站并在您的本地网络上出站 远程服务器。