今天早上接了個郵件,需要在所有的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,如需轉載請自行聯系原作者