ActiveDirectoryのOUの1つにあるすべてのWindows7マシンをPowershell3.0または4.0で更新しようとしています。グループポリシーまたはSCCM 2012のいずれかを使用し、ユーザーがダウンロードしてインストールするためのオプションではなく、プッシュすることを希望します。私が見つけた問題は、.Net要件です。インストーラーがまだインストールされていない場合に必要な.Netフレームワークをインストールするようにインストーラーをパッケージ化する方法はありますか?
SCCM 2012でできることは、パッケージの代わりにアプリケーションを使用することです。
インスタンスでは、最初に.NET Frameworkアプリケーションを作成し、次にPowershellアプリケーションを作成します。 PowerShellアプリケーションを作成するときは、自動インストールをオンにして、作成した.NETFrameworkというアプリケーションの依存関係を設定します。
PowerShellアプリケーションを展開すると、ワークステーションに.NETFrameworkがインストールされているかどうかが確認されます。インストールされている場合は、PowerShellのインストールが続行されます。そうでない場合は、最初に.NETFrameworkをインストールします。
注:.NETアプリケーション(およびPowerShell)の検出方法を設定して、インストールされているかどうかを確認する方法を認識できるようにしてください。
私はこれを.NET4に使用します。
設定タイプ:レジストリハイブ:HKLMキー:SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full値:整数「このアプリケーションの存在を示すには、このレジストリ設定がターゲットシステムに存在する必要があります」がチェックされます。
クライアントへのプッシュについては、展開方法が[必須]、[使用不可]に設定されていることを確認してください。
これらのいずれもPowerShell4のインストールには使用していませんが、そのためのスクリプトを考え出しました。あなたはアイデアを得て、あなたの環境に適用される断片を使うことができます。
REM Script to upgrade to .net 4.5 & Windows Management Framework 4 (incl. Powershell 4) on Win7 SP1
SETLOCAL ENABLEEXTENSIONS
SET SOURCE=Install_PowerShell4
SET DESTINATION=\\myserver\logs\Inventory\OnDemand\WMF4
SET exeDOTNET45="\\myserver\Packages\Microsoft Dot Net\4.5\dotnetfx45_full_x86_x64.exe" /quiet /norestart
SET exeWMFx64=\\myserver\Packages\WMF4\Windows6.1-KB2819745-x64-MultiPkg.msu /quiet /norestart
SET exeWMFx32=\\myserver\Packages\WMF4\Windows6.1-KB2819745-x86-MultiPkg.msu /quiet /norestart
REM Set Exclusions
REG QUERY HKLM\SOFTWARE\EUDE /V DoNotUpgradeToDotNet45
IF %ERRORLEVEL% EQU 0 GOTO :TAG_EXCEPTION_NET45
REG QUERY HKLM\SOFTWARE\EUDE /V DoNotUpgradeToPowerShell4
IF %ERRORLEVEL% EQU 0 GOTO :TAG_EXCEPTION_PS4
:CONTINUE
:CHECK_FailED
REM If failed before, do not retry.
IF EXIST "%DESTINATION%\Fail_DotNet_%COMPUTERNAME%.txt" GOTO :END
IF EXIST "%DESTINATION%\%COMPUTERNAME%_Has_PowerShell4.txt" GOTO :END
IF EXIST "%DESTINATION%\Success_PowerShell4_%COMPUTERNAME%.txt" GOTO :END
:Check_For_DotNet4.5
REG QUERY "hklm\software\Microsoft\net framework setup\ndp\v4\Full" /v Release
If %ERRORLEVEL% EQU 0 GOTO :Has_DotNet45
REM Does not have .net 4.5, need remediation
:Install_DotNet4.5
REM http://msdn.Microsoft.com/en-us/library/ee390831.aspx for return codes
cmd /c %exeDOTNET45%
If %ERRORLEVEL% EQU 0 GOTO :DOTNET45_SUCCESS
If %ERRORLEVEL% EQU 1640 GOTO :DOTNET45_SUCCESS
If %ERRORLEVEL% EQU 3010 GOTO :DOTNET45_SUCCESS
REM GOTO :DOTNET45_Fail
:DOTNET45_Fail
IF NOT EXIST "%DESTINATION%\Fail_DotNet45_%COMPUTERNAME%.txt" ECHO. >"%DESTINATION%\Fail_DotNet45_%COMPUTERNAME%.txt"
GOTO :END
:DOTNET45_SUCCESS
IF NOT EXIST "%DESTINATION%\Success_DotNet45_%COMPUTERNAME%.txt" ECHO. >"%DESTINATION%\Success_DotNet45_%COMPUTERNAME%.txt"
GOTO :Check_For_PowerShell4
:Has_DotNet45
REM IF NOT EXIST "%DESTINATION%\%COMPUTERNAME%_HasDotNet45.txt" ECHO. >"%DESTINATION%\%COMPUTERNAME%_HasDotNet45.txt"
REM GOTO :Check_For_PowerShell4
:Check_For_PowerShell4
REG QUERY hklm\software\Microsoft\powershell\3\PowerShellEngine /v PowerShellVersion |findstr "4"
IF %ERRORLEVEL% EQU 0 GOTO :Has_PowerShell4
REM Check if we have installed it but waiting for reboot
IF EXIST "%DESTINATION%\SuccessPendingReboot_PowerShell4_%COMPUTERNAME%.txt" GOTO :END
:Check_Architecture
if /i "%processor_architecture%"=="x86" (
IF NOT DEFINED PROCESSOR_ARCHITEW6432 (
cmd /c %windir%\System32\wusa.exe %exeWMFx32%
) ELSE (
cmd /c %windir%\System32\wusa.exe %exeWMFx64%
)
) else (
cmd /c %windir%\System32\wusa.exe %exeWMFx64%
)
If %ERRORLEVEL% EQU 0 GOTO :PowerShell4_SUCCESS
If %ERRORLEVEL% EQU 1640 GOTO :PowerShell4_SUCCESS
If %ERRORLEVEL% EQU 3010 GOTO :PowerShell4_SUCCESS
REM GOTO :PowerShell4_Fail
:PowerShell4_Fail
IF NOT EXIST "%DESTINATION%\Fail_PowerShell4_%COMPUTERNAME%.txt" ECHO %ERRORLEVEL% >"%DESTINATION%\Fail_PowerShell4_%COMPUTERNAME%.txt"
GOTO :END
:PowerShell4_SUCCESS
IF NOT EXIST "%DESTINATION%\SuccessPendingReboot_PowerShell4_%COMPUTERNAME%.txt" ECHO. >"%DESTINATION%\SuccessPendingReboot_PowerShell4_%COMPUTERNAME%.txt"
IF EXIST "%DESTINATION%\Fail_PowerShell4_%COMPUTERNAME%.txt" del /f /q "%DESTINATION%\Fail_PowerShell4_%COMPUTERNAME%.txt"
GOTO :END
:Has_PowerShell4
REM IF EXIST "%DESTINATION%\SuccessPendingReboot_PowerShell4_%COMPUTERNAME%.txt" (
IF EXIST "%DESTINATION%\Fail_PowerShell4_%COMPUTERNAME%.txt" del /f /q "%DESTINATION%\Fail_PowerShell4_%COMPUTERNAME%.txt"
IF EXIST "%DESTINATION%\WindowsUpdateStopped_%COMPUTERNAME%.txt" del /f /q "%DESTINATION%\WindowsUpdateStopped_%COMPUTERNAME%.txt"
del /f /q "%DESTINATION%\SuccessPendingReboot_PowerShell4_%COMPUTERNAME%.txt"
ECHO. >"%DESTINATION%\Success_PowerShell4_%COMPUTERNAME%.txt"
REM ) ELSE (
REM ECHO. >"%DESTINATION%\%COMPUTERNAME%_Has_PowerShell4.txt"
REM )
GOTO :END
:TAG_EXCEPTION_NET45
IF NOT EXIST "%DESTINATION%\DoNotUpgradeToDotNet45_%COMPUTERNAME%.txt" (
eventcreate /L "APPLICATION" /T Information /SO "%SOURCE%" /id 779 /d "Tagged with DoNotUpgradeToDotNet45"
ECHO. >"%DESTINATION%\DoNotUpgradeToDotNet45_%COMPUTERNAME%.txt"
)
GOTO :END
:TAG_EXCEPTION_PS4
IF NOT EXIST "%DESTINATION%\DoNotUpgradeToPowerShell4_%COMPUTERNAME%.txt" (
eventcreate /L "APPLICATION" /T Information /SO "%SOURCE%" /id 779 /d "Tagged with DoNotUpgradeToPowerShell4"
ECHO. >"%DESTINATION%\DoNotUpgradeToPowerShell4_%COMPUTERNAME%.txt"
)
GOTO :END
:WindowsUpdateStopped
IF NOT EXIST "%DESTINATION%\WindowsUpdateStopped_%COMPUTERNAME%.txt" (
ECHO. >"%DESTINATION%\WindowsUpdateStopped_%COMPUTERNAME%.txt"
)
GOTO :END
:END
ENDLOCAL
Exit /b