天天看点

GPO 安装 .net 4.5和WMF4

今天早上接了个邮件,需要在所有的windows 2008R2的服务器上都安装 .net 4.5和 WMF4( PowerShell 4.0)。

豆子做了些研究,觉得需要做到以下几点

 扫描所有的windows 2008 R2服务器,能够查看4.5和Powershell的当前版本是什么;

 如果需要安装,必须以先安装.net 4.5, 然后安装WMF4的顺序进行,不然会出现安装显示正常,但是WMF4并未完全安装的问题。

安装的方式,可以采用MSI+MST的自定义安装,或者使用开机/关机的脚本执行,或者通过powrshell或者psexec 的远程命令直接安装 

第一点我可以通过Powershell脚本实现,通过get-adcomputer获取对应的服务器对象,然后对每一个对象进行invoke-command的远程操作,查看注册表和powershell版本即可。

查看.net 的版本和ps的版本

1

2

3

4

<code>Get-ChildItem</code> <code>'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP'</code> <code>-Recurse | </code>

<code>Get-ItemProperty</code> <code>-name Version -EA 0 |</code>

<code>Where-Object</code> <code>{ </code><code>$_</code><code>.PSChildName </code><code>-match</code> <code>'^(?!S)\p{L}'</code><code>} | </code><code>Sort-Object</code> <code>version -Descending | </code>

<code>Select-Object</code> <code>-ExpandProperty Version -First 1</code>

<code>$PSVersionTable</code><code>.PSVersion.Major</code>

需要注意的一点是,在所有的远程服务器上面,必须启动了winrm的服务,并打开了对应的防火墙接口才能执行invoke-command命令。一个简单的命令是winrm quickconfig 可以自动启动并配置防火墙。考虑到机器比较多,豆子使用的是组策略来统一更改。

具体的配置可以参考

<a href="http://blog.powershell.no/2010/03/04/enable-and-configure-windows-powershell-remoting-using-group-policy/" target="_blank">http://blog.powershell.no/2010/03/04/enable-and-configure-windows-powershell-remoting-using-group-policy/</a>

第二点,必须注意的是windows 2008 R2对应的WMF4其实是一个升级补丁,可以通过下面命令查看一下是否真正安装了,否则如果安装顺序不对,这个补丁不会安装的。

5

6

7

8

<code>$status</code><code>=</code><code>get-hotfix</code><code>| </code><code>Where-Object</code> <code>{</code><code>$_</code><code>.hotfixid </code><code>-eq</code> <code>"KB2819745"</code><code>}</code>

<code>if</code> <code>(</code><code>$status</code><code>) {</code>

<code>Write-host</code> <code>" WMF4 is Installed "</code>

<code>}</code>

<code>else</code>

<code>{</code>

<code>Write-host</code> <code>"WMF4 is Not Installed"</code>

第三点,具体的安装方式,最开始我打算直接用powershell远程session直接从共享网络上安装就行了,后来发现微软默认的安全机制会禁止这种连续跳转的权限。比如我从机器A上远程控制机器B,然后从机器C的共享里面安装程序是被严厉禁止的,这是为了避免中间人攻击。

可以通过激活credssp的方式执行,参考如下,但是为了避免安全隐患,豆子还是决定放弃

<a href="http://blogs.technet.com/b/heyscriptingguy/archive/2012/11/14/enable-powershell-quot-second-hop-quot-functionality-with-credssp.aspx" target="_blank">http://blogs.technet.com/b/heyscriptingguy/archive/2012/11/14/enable-powershell-quot-second-hop-quot-functionality-with-credssp.aspx</a>

MST+MSI的安装方式比较麻烦,需要用orca修改对应的属性,这里豆子也放弃了,感兴趣的可以参考这个博客

<a href="http://www.itninja.com/blog/view/deploy-net-dot-net-4-5-1-via-gpo" target="_blank">http://www.itninja.com/blog/view/deploy-net-dot-net-4-5-1-via-gpo</a>

最后的选择则是关机脚本

两个脚本

安装.net 4.5

9

<code>rem script to install .net 4.5</code>

<code>@echo off</code>

<code>reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,version=v4.5"</code>

<code>if %errorlevel%==1 goto installnet</code>

<code>if %errorlevel%==0 goto exit</code>

<code>:installnet</code>

<code>start /wait "\\syd02\Syd_Transfer\yli\dotnetfx45_full_setup.exe /ceipconsent /norestart /q"</code>

<code>:exit</code>

<code>exit</code>

安装 WMF4

10

<code>pushd %~dp0</code>

<code>echo %CD%</code>

<code>reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3\powerShellEngine" /f 4.0</code>

<code>if %errorlevel%==1 goto installwmf</code>

<code>:installwmf</code>

<code>expand -f:* \\syd02\syd_transfer\yli\Windows6.1-KB2819745-x64-MultiPkg.msu %temp%</code>

<code>pkgmgr.exe /n:%temp%\Windows6.1-2819745-x64.xml /norestart /quiet</code>

把上面的脚本配置成关机脚本,注意安装顺序,重启服务器就会自动安装。

最后给个比较完整的脚本

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

<code>$a</code><code>=</code><code>Get-ADComputer</code> <code>-</code><code>Filter</code> <code>{operatingsystem </code><code>-like</code> <code>"*2008 R2*"</code><code>} -Properties operatingsystem,ipv4address| select name, operatingsystem,ipv4address</code>

<code>foreach</code><code>(</code><code>$b</code> <code>in</code> <code>$a</code> <code>){</code>

<code>$ping</code><code>=</code><code>Test-Connection</code> <code>-ComputerName </code><code>$b</code><code>.Name -Count 1 -Quiet</code>

<code>if</code><code>(</code><code>$ping</code><code>){</code>

<code>$b</code><code>.Name</code>

<code>Invoke-Command</code> <code>-ComputerName </code><code>$b</code><code>.name {</code>

<code>if</code><code>(</code><code>$psv</code> <code>-lt</code> <code>4){</code>

<code>Write-Host</code> <code>"WMF4 is not installed, do you want restart the server to install? y/n"</code>

<code>#\\syd02\Syd_Transfer\yli\WMF4.bat</code>

<code>$install</code><code>=</code><code>read-host</code>

<code>switch</code><code>(</code><code>$install</code><code>)</code>

<code>{ </code><code>"y"</code><code>{ </code>

<code>    </code><code>write-host</code> <code>"The Server is rebooting"</code>

<code>    </code><code>#Restart-Computer -ComputerName $b.name -Force</code>

<code>    </code><code>}</code>

<code>  </code><code>"n"</code><code>{ </code><code>write-host</code> <code>"</code><code>"}</code>

<code>  </code><code>default {}</code>

<code>Write-Host ""</code>

<code>Write-Host "</code><code>---------------------------------------------"</code>

大概效果如下,第一个是服务器名字,然后输出.net 版本和PS的版本,如果PS低于4,那么询问是否需要重启服务器以便安装。

<a href="http://s3.51cto.com/wyfs02/M00/6F/F5/wKioL1Wu3EDQL18BAADfAuqFQ3w179.jpg" target="_blank"></a>

本文转自 beanxyz 51CTO博客,原文链接:http://blog.51cto.com/beanxyz/1676947,如需转载请自行联系原作者

继续阅读