Como posso instalar o .NET 4.5.2 via DSC do PowerShell?

15

Eu posso instalar o .NET Framework 4.5 no Windows Server 2012 R2 usando o PowerShell DSC através do recurso WindowsFeature e do recurso NET-Framework-45-Core. Minha pergunta é: como eu uso o PowerShell DSC para garantir que o .NET 4.5.2 esteja instalado?

Mark
fonte
Você acabou usando o DSC para isso, ou alguma outra coisa?
Steven Liekens
Chocolatey tem um instalador para o 4.5.2, que também é baseado no PowerShell. Você já investigou usando DSC com Chocolatey? chocolatey.org/packages/DotNet4.5.2
Steven Liekens

Respostas:

12

Não tenho certeza se isso ainda é exigido pelo OP, mas tive o mesmo desafio recentemente e encontrei muitos problemas com o próprio instalador, ao tentar usar apenas o recurso de pacote em um 2012 R2 Server. Acabou tendo que escrever um recurso de script e usar o instalador da web como o pacote completo não conseguiu descompactar com um erro muito genérico.

De qualquer forma, aqui está um recurso de script de trabalho que acabei com:

Configuration Net452Install
{
    node "localhost"
    {

        LocalConfigurationManager
        {
            RebootNodeIfNeeded = $true
        }

        Script Install_Net_4.5.2
        {
            SetScript = {
                $SourceURI = "https://download.microsoft.com/download/B/4/1/B4119C11-0423-477B-80EE-7A474314B347/NDP452-KB2901954-Web.exe"
                $FileName = $SourceURI.Split('/')[-1]
                $BinPath = Join-Path $env:SystemRoot -ChildPath "Temp\$FileName"

                if (!(Test-Path $BinPath))
                {
                    Invoke-Webrequest -Uri $SourceURI -OutFile $BinPath
                }

                write-verbose "Installing .Net 4.5.2 from $BinPath"
                write-verbose "Executing $binpath /q /norestart"
                Sleep 5
                Start-Process -FilePath $BinPath -ArgumentList "/q /norestart" -Wait -NoNewWindow            
                Sleep 5
                Write-Verbose "Setting DSCMachineStatus to reboot server after DSC run is completed"
                $global:DSCMachineStatus = 1
            }

            TestScript = {
                [int]$NetBuildVersion = 379893

                if (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full' | %{$_ -match 'Release'})
                {
                    [int]$CurrentRelease = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full').Release
                    if ($CurrentRelease -lt $NetBuildVersion)
                    {
                        Write-Verbose "Current .Net build version is less than 4.5.2 ($CurrentRelease)"
                        return $false
                    }
                    else
                    {
                        Write-Verbose "Current .Net build version is the same as or higher than 4.5.2 ($CurrentRelease)"
                        return $true
                    }
                }
                else
                {
                    Write-Verbose ".Net build version not recognised"
                    return $false
                }
            }

            GetScript = {
                if (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full' | %{$_ -match 'Release'})
                {
                    $NetBuildVersion =  (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full').Release
                    return $NetBuildVersion
                }
                else
                {
                    Write-Verbose ".Net build version not recognised"
                    return ".Net 4.5.2 not found"
                }
            }
        }
    }
}

Net452Install -OutputPath $env:SystemDrive:\DSCconfig
Set-DscLocalConfigurationManager -ComputerName localhost -Path $env:SystemDrive\DSCconfig -Verbose
Start-DscConfiguration -ComputerName localhost -Path $env:SystemDrive:\DSCconfig -Verbose -Wait -Force
leshkin
fonte
Ótima resposta, esta abordagem também funciona para .net 4.6.1. Eu tentei uma variedade de integrações DSC existentes (chocolatey, cDotNetInstaller, etc ...) e todos falharam com o instalador 4.6.1. Este é o primeiro que funcionou. Kudos
swannee
Acordado; boa resposta. Eu quero mencionar isso também funciona através do Chef e do dsc_script recurso.
Jason Capriotti
Eu também confirmou isso funciona com .net 4.7, com NetBuildVersion = 461310 e agarrando download.microsoft.com/download/A/E/A/…
JohnnyFun
2

De acordo com este artigo da Microsoft Technet , o nome do recurso a ser instalado deve ser um do Get-WindowsFeature resultado do comando. Assim, se o .NET 4.5.2 não aparecer na lista, você não pode garantir que esteja instalado via DSC.

Nome Indica o nome da função ou recurso que você deseja garantir   é adicionado ou removido. Isso é o mesmo que a propriedade Name do   Cmdlet Get-WindowsFeature, e não o nome de exibição da função ou   característica.

Então eu acho que você terá que instalar a versão principal via DCS (4.5) e, em seguida, descobrir a melhor solução para atualizá-lo para 4.5.2.

Ob1lan
fonte
Parece um grande descuido. O novo PowerShell DSC pode instalar um software tão novo quanto dois anos e meio de idade!
Mark
1
Não é um descuido. O tempo de execução do .NET 4.5.2 é não um recurso do Windows, por isso não pode ser instalado usando o recurso WindowsFeature. Está disponível através do Windows Update ou como um download separado. O script terá que baixar e executar o instalador apropriado.
Panagiotis Kanavos