天天看點

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,如需轉載請自行聯系原作者

繼續閱讀