通过 Powershell 在远程机器上更改 IIS 网站的物理路径
Posted
技术标签:
【中文标题】通过 Powershell 在远程机器上更改 IIS 网站的物理路径【英文标题】:Changing the physical path of an IIS website on a remote machine via Powershell 【发布时间】:2011-04-25 16:21:44 【问题描述】:我目前正在开发一个部署脚本,它将获取我的站点,从 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
当我查看我拥有的值时,我找不到物理路径属性。
任何建议将不胜感激。
【问题讨论】:
两台机器都在 Active Directory 中吗? 机器位于 Active Directory 中的不同域中,但如果需要,我们可以更改它,以便我们在 Web 服务器上而不是在本地开发机器上运行脚本。 【参考方案1】:这也有效:
PS IIS:\Sites> Set-ItemProperty IIS:\Sites\Staging `
-name physicalPath `
-value "C:\blah\Web"
(注意在续行时使用反引号)
【讨论】:
请注意,在您 IISRESET 或重新启动 IIS 管理器之前,IIS 管理器可能不会注意到更改。 他需要先拥有Import-Module WebAdministration
才能使用。
我不需要重新启动 IIS 7.5 即可检测到更改。
真的很奇怪....看来PS v2允许PhysicalPath和physicalPath,而PS v4只允许physicalPath作为-name参数。
我可以确认您无需重置 IIS 即可检测到此更改。如果您打开了 IIS 管理器,则需要将其关闭并再次打开以查看更改。就站点而言,运行此命令后会立即更改物理路径【参考方案2】:
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
【讨论】:
谢谢。我对 Powershell 和编写 IIS 脚本还很陌生,几天来我一直在为此苦苦挣扎。 这对我帮助很大,谢谢!但在我的 Microsoft.Web.Administration OpenRemote 版本中是静态的,这导致我 $serverManager = [Microsoft.Web.Administration.ServerManager]::OpenRemote($serverIP) @mikael - 你是绝对正确的,我已经更新了我的答案。谢谢! 如果您安装了 IIS Express,您需要指定要加载的库的版本。 7.0.0.0 用于完整的 IIS,7.9.0.0 用于 IIS Express。 ***.com/q/25812169/247702【参考方案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 在您的本地网络上打开出站并在您的 远程服务器。
【讨论】:
以上是关于通过 Powershell 在远程机器上更改 IIS 网站的物理路径的主要内容,如果未能解决你的问题,请参考以下文章
通过Powershell PSSession调用invoke-wmimethod而不是远程机器上的管理员?
在远程机器上启动应用程序并保持运行,powershell 脚本不应等待进程完成
Windows 使用 PowerShell 来管理另外一台 Windows 机器
Windows 使用 PowerShell 来管理另外一台 Windows 机器