通过组策略或SCCM在Windows 7计算机上安装Powershell 3.0或4.0

我正在尝试使用Powershell 3.0或4.0来更新Active Directory中的某个OU中的所有Windows 7计算机。 我想要使​​用组策略或SCCM 2012,并希望将其推送,而不是可选的用户下载和安装。 我发现的一个问题是.Net的要求。 有没有办法打包安装程序,以便它安装所需的.Net框架,如果它尚未安装?

您可以在SCCM 2012中做什么是使用应用程序而不是软件包。

在您的实例中,首先创build.NET Framework应用程序,然后创buildPowershell应用程序。 创buildPowerShell应用程序时,请将您创build的名为.NET Framework的应用程序的依赖项设置为自动安装。

在部署PowerShell应用程序时,它将检查工作站是否安装了.NET Framework。 如果安装了,它会继续安装PowerShell; 如果不是,它将首先安装.NET Framework。

注意:请确保您为.NET应用程序(和PowerShell)设置检测方法,以便知道如何检查它是否已安装。

我用这个.NET 4:

设置types:registryconfiguration单元HKLM键:SOFTWARE \ Microsoft \ NET Framework安装\ NDP \ v4 \完整值:整数“此registry设置必须存在于目标系统上以指示此应用程序的存在”被选中。

至于推送到客户端,请确保部署方法设置为必需,不可用。

我没有使用这两个来安装PowerShell 4,但想出了一个脚本来做到这一点。 你可以得到这个想法,并使用适用于你的环境的零碎。

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