PowerShell学习笔记(7):初步管理IIS7
本文在ITECN首发,未经许可严禁转载!
上篇笔记我曾提到过:“不过目前版本的PowerShell对IIS支持不是很好,相信后继版本出现后会有所改善。而且对IIS 7而言还有appcmd能用,因此IIS管理方面的内容这里暂且搁置一下,等以后时机成熟后再来讨论。”
我这里的“时机成熟”是指,在PowerShell中能使用现成的cmdlet来管理IIS7。不过这不意味着我们现在无法用PowerShell来管理IIS7,要实现这个目标,我们需要借助.NET Framework来编写脚本。不过以下我将要介绍的这个脚本只是完成了一些初级功能,并且只适合于IIS7,所以完整脚本这次不会放出,只介绍下部分脚本片段。
在正式介绍之前,先把一些我在写脚本时用到的资料分享给大家。
首先是由Tobin Titus在 www.iis.net Blog上发布的两篇关于如何在PowerShell中使用Microsoft.Web.Administration(.NET Framework中管理IIS7所对应的namespace)的文章,地址如下:
Accessing Microsoft.Web.Administration through PowerShell (Part I)
Extending Microsoft.Web.Administration through PowerShell (Part II)
然后既然提到了.NET Framework,那么MSDN文档自然就是必须的,地址如下:
http://msdn2.microsoft.com/zh-cn/library/microsoft.web.administration.aspx
说到这,有朋友大概会说,又是.NET啊,我又不是开发人员,有没有相关的WMI内容可以用啊?当然,的确Windows Server 2008 RC0里有相关的WMI namespace。
不过基于以下的一些原因,我的脚本中放弃使用WMI。
当我尝试用Get-WMIObject并使用-credential 及-computer参数链接到我需要的“root\webadministration”时,眼前闪现一抹红色,提示访问遭到拒绝:
“我凭据应该没输错吧”,我脑子里想了想,而面前这个信息所提供的内容也不容易找到错误在哪。无奈,只能去我那台win2008虚机上看看有没有相应日志了。幸运的是,这条日志记录是存在的:
但是不幸的是这个错误在PowerShell的中比较难处理。我使用了图中所高亮的“Pkt_Privacy”作为关键字搜索了下,发现了“PowerShell”之父Jeffrey Snover给出的回答:“Pkt_Privacy is not supported in V1” 不过MVP MOW 提供了一个解决方法,不过因为用到了“PSBase”,所以,我选择暂且跳过实现远程连接。
关于PSBase,脚本大师 Don Johns在“使用 Active Directory”一文的“不能完成的任务”一节中有所涉及,用兴趣的朋友不妨阅读下。
呵呵,啰嗦了一大段都没有正式介绍脚本片断,要是去投稿的话,会有骗稿费的嫌疑吧。下面言归正传,正式介绍脚本。(以Windows Server 2008 RC0 作为测试系统)
首先我们用Tobin Titus的方法加载DLL文件。
|
[void][system.Reflection.Assembly]::loadfrom("c:\windows\system32\inetsrv\Microsoft.Web.Administration.dll")
$Global:iismgr = New-Object Microsoft.Web.Administration.ServerManager |
|
提示:[void]是用来避免加载时出现提示,$Global是PowerShell中全局变量标识符。 |
然后我们就可以用foreach循环语句来获得每个站点的信息了(select后的内容是根据Site类的属性值来的,更多属性值可以查看MSDN文档,不过需要注意的是有些属性不只是一个字符串)
|
foreach ($site in $iismgr.sites) {
$site | select id,name,state,bindings,VirtualDirectoryDefaults
} |
运行结果
当然各位朋友肯定会问如何解决这个问题,那么下面我就以查找网站的物理路径为例来简单介绍下。
查找物理路径是我编写脚本中的一个难点。一开始因为不做.NET开发,所以即使看了MSDN文档,也没找到物理路径是用那个属性标识的,而且这个物理路径不是$site.VirtualDirectoryDefaults下的一个属性,一顿好找啊。不过后来看到MSDN上的C#范例代码,顿时茅塞顿开。
最后一共用了三个foreach循环才把PhysicalPath属性给挖了出来。
|
foreach ($site in $iismgr.sites) {
Write-Host "========$site==========" -fore yellow
foreach ($app in $site.Applications) {
foreach ($vd in $app.VirtualDirectories) {
$vd.PhysicalPath
}
}
} |
其中的Write-Host是我为了区分起见加上的,运行结果如下:
看了这么多东西,大家应该头晕了吧(也许这里还有我表述的问题),是该休息下了。最后奉上我目前正在写的这个脚本的一段运行视频。
IISPowerShell
写完本文时,正好因为台风关系而消失了几天的太阳也露了一小脸了,明天是个不错的日子吧。(*^__^*)
下次再见了。