通过 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 机器

检查是不是通过 Powershell 远程启用了 CredSSP

Powershell - 运行位于远程机器上的脚本,该脚本反过来从网络共享访问文件