[SCCM] Considérations de bon aloi sur la migration de SCCM 2012 vers la current branch

Avec la sortie de la current branch de SCCM il est temps de se poser la question de la mise à niveau ou de la mise à jour vers cette nouvelle version.

La première question à se poser est la suivante : Mise à jour ou migration ?

La mise à jour « in-place » est le moyen le plus simple et rapide de faire évoluer l’infra SCCM, pour qu’elle soit possible votre infrastructure doit être dans les versions suivantes :

  • SCCM 2012 SP1
  • SCCM 2012 SP2
  • SCCM 2012 R2
  • SCCM 2012 R2 SP1

Le processus est très simple puisqu’il suffit d’exécuter le setup de SCCM CB sur le plus haut site de votre hiérarchie, les autres rôles de serveurs suivront et les clients se mettront à jour via la fonctionnalité de mise à jour automatique.

Vous aurez également la possibilité de mettre à niveau votre SQL vers 2014 si le cœur vous en dit par la suite.

Pour certains la migration sera la meilleure voie à prendre pour les raisons suivantes :

  • SCCM est installé sur un OS vieillissant (2008 R2 par exemple)
  • C’est toujours une bonne occasion de refaire du ménage et de partir sur une base neuve

Dans ce cas deux options :

  • Vous sauvegardez votre SCCM source et éteignez le serveur. Vous installez un nouveau serveur avec le même nom et même version de produits (SQL et SCCM), vous restaurez et vous mettez à jour SCCM.
  • Vous utilisez la migration

La première option permet de récupérer tous les objets très rapidement, vous n’aurez pas non plus à vous préoccuper de la reprise des clients ou des ouvertures de flux. Par contre vous récupérerez un historique dont vous auriez peut-être préféré vous débarrasser.

La seconde option passe par le chemin classique de migration « side by side » qui à été introduit avec SCCM 2012. Nous allons ici nous pencher un peu plus sur quelques détails au sujet de cette procédure.

Il existe une différence au niveau des types de job de migration, en effet désormais les jobs de type « Objet » incluent les collections et les déploiements il n’est donc désormais plus nécessaire de faire un job de type objet et un de type migration.

En ce qui concerne les pièges à éviter :

  • Les images de boot ont une fâcheuse tendance à planter à case des pilotes. Prévoyez soit d’épurer les pilotes au préalable soit créez de nouvelles images de boot vide que vous assignez à vos séquences de taches.
  • Pensez à modifier l’étape « Setup Windows and config Mgr » dans les séquences de taches.
  • Les rôles de sécurité et les stratégies anti malware ne sont pas migrés. Mais vous pouvez faire des imports / exports entre vos infras SCCM
  • La migration des objets liés aux updates nécessite que vous ayez synchronisé les mêmes produits et catégories que dans le SCCM source
  • Le job de migration des updates peut durer très longtemps

Pour la bascule des clients, vous devrez au préalable vider de leur frontières les groupes de frontières du site source et remplir comme il se doit eux du site cible.

Ensuite vous aurez deux choix pour faire basculer les clients :

  • Réassigner le client et attendre que le client se mette à niveau via la fonctionnalité de mise à jour automatique
  • Faire une réinstallation du client auquel cas vous faites la réassignation et la mise à niveau en même temps

La première option peut se faire via un script poussé par GPO :

on error resume next

set oSCCMClient = CreateObject (« Microsoft.SMS.client »)

If Err.number <> 0 Then

End If

oSCCMClient.SetassignedSite « XXX »,0

set oSCCMClient = nothing

Ou via une extension de console comme celle-ci.

La seconde option se fera selon votre manière habituelle d’installer des clients mais reste à réserver à des réseaux de bonne qualité étant donné le trafic simultané que cela pourrait engendrer.

Un nouveau serveur SCCM implique généralement un changement des sources voici un script powershell qui modifie les sources de la plupart des types d’objets dans SCCM :

Un nouveau serveur SCCM implique généralement de nouvelles sources pour votre contenu. Voici donc un script qui vous permettra de changer les sources de la plupart des types d’objets SCCM :

Import-Module ((Split-Path
-Path
$env:SMS_ADMIN_UI_PATH
-Parent) +
‘\ConfigurationManager.psd1’)

$siteCode
=
« XXX »

$SourceShare
=
« \\oldserver\sources« 

$Destshare
=
« \\newserver\sources« 

Set-Location ($SiteCode
+
‘:’)

Write-Host
« ********************************************************* »

Write-Host
« Migrating Applications : »

$apps
=
Get-CMApplication

foreach ($app
in
$apps)

{

    write-host
«  »

    write-host
« Migrating : »
$app.LocalizedDisplayName

    $DeploymentTypes
=
Get-CMDeploymentType
-ApplicationName
$app.LocalizedDisplayName

    $count
=
0

    foreach ($DeploymentType
in
$DeploymentTypes)

    {

        Write-Host
 »    Deployment type « 
$DeploymentType.LocalizedDisplayName

        $DeploymentTypeSDMXML
=
[XML]$DeploymentType.SDMPackageXML

        $DeploymentTypeCleanPath
=
$DeploymentTypeSDMXML.AppMgmtDigest.DeploymentType.Installer.Contents.Content.Location[$count]

        IF($DeploymentTypeCleanPath
-eq
«  »)

        {

            $DeploymentTypeCleanPath
=
$DeploymentTypeSDMXML.AppMgmtDigest.DeploymentType.Installer.Contents.Content.Location

        }

        IF($DeploymentTypeCleanPath
-eq
« \ »)

        {

            $DeploymentTypeCleanPath
=
$DeploymentTypeSDMXML.AppMgmtDigest.DeploymentType.Installer.Contents.Content.Location

        }

        #Write-Host  »    Actual Path : » $DeploymentTypeCleanPath

        $count
=
$count
+
1

        if ($DeploymentTypeCleanPath
-match
[regex]::Escape($Destshare))

        {

                Write-Host
 »    Already migrated »

        }

        else

        {

            Write-Host
 »    Moving from : »
$DeploymentTypeCleanPath

            $DeploymentTypeNewPath
=
$DeploymentTypeCleanPath
-replace
[regex]::Escape($SourceShare),
« $Destshare« 

            Write-Host
 »    To : »
$DeploymentTypeNewPath

            Set-CMDeploymentType
–ApplicationName
$app.LocalizedDisplayName –DeploymentTypeName $DeploymentType.LocalizedDisplayName –MsiOrScriptInstaller
–ContentLocation
« $DeploymentTypeNewPath« 

        }

    }

}

write-host
«  »

write-host
«  »

Write-Host
« ********************************************************* »

Write-Host
« Migrating Packages : »

$packages
=
get-cmpackage

ForEach ($Package
in
$packages)

 {

    write-host
«  »

    Write-Host
« Migrating : »
$Package.Name

    if ($Package.PkgSourcePath -match
[regex]::Escape($Destshare))

        {

                Write-Host
 »    Already migrated »

        }

        else

        {

            if ($Package.PkgSourcePath -match
[regex]::Escape($Sourceshare))

            {

                Write-Host
« Moving from : »
$Package.PkgSourcePath

                $PackageNewPath
=
$Package.PkgSourcePath -replace
[regex]::Escape($SourceShare),
« $Destshare« 

                Write-Host
« To : »
$PackageNewPath

                Set-CMPackage
-Name
$Package.Name -Path $PackageNewPath

            }

            else

            {

                Write-Host
« Actual Source : »
$Package.PkgSourcePath « doesn’t match specified source »

            }

        }

}

write-host
«  »

Write-Host
« ********************************************************* »

Write-Host
« Migrating Drivers »

$drivers
=
get-CMdriver

foreach ($driver
in
$drivers)

{

    write-host
«  »

    Write-Host
« Migrating : »
$Driver.LocalizedDisplayName

    if ($Driver.ContentSourcePath -match
[regex]::Escape($Destshare))

    {

            Write-Host
 »    Already migrated »

    }

    else

    {

        if ($Driver.ContentSourcePath -match
[regex]::Escape($Sourceshare))

        {

            Write-Host
« Moving from : »
$Driver.ContentSourcePath

            $DriverNewPath
=
$Driver.ContentSourcePath -replace
[regex]::Escape($SourceShare),
« $Destshare« 

            Write-Host
« To : »
$DriverNewPath

            Set-CMDriver
-Id
$Driver.CI_ID -DriverSource $DriverNewPath

        }

        else

        {

            Write-Host
« Actual Source : »
$Driver.ContentSourcePath « doesn’t match specified source »

        }

    }

}

write-host
«  »

Write-Host
« ********************************************************* »

Write-Host
« Migrating Drivers Packages »

$DriverPackages
=
get-CMDriverPackage

foreach ($driverPackage
in
$DriverPackages)

{

    write-host
«  »

    Write-Host
« Migrating : »
$driverPackage.Name

    if ($driverPackage.PkgSourcePath -match
[regex]::Escape($Destshare))

    {

            Write-Host
 »    Already migrated »

    }

    else

    {

        if ($driverPackage.PkgSourcePath -match
[regex]::Escape($Sourceshare))

        {

            Write-Host
« Moving from : »
$driverPackage.PkgSourcePath

            $DriverPackageNewPath
=
$driverPackage.PkgSourcePath -replace
[regex]::Escape($SourceShare),
« $Destshare« 

            Write-Host
« To : »
$DriverPackageNewPath

            Set-CMDriverPackage
-Id
$driverPackage.PackageID -DriverPackageSource $DriverPackageNewPath

        }

        else

        {

            Write-Host
« Actual Source : »
$driverPackage.PkgSourcePath « doesn’t match specified source »

        }

    }

}

write-host
«  »

Write-Host
« ********************************************************* »

Write-Host
« Migrating Operating System Images »

$OperatingSystemImages
=
Get-CMOperatingSystemImage

foreach ($OperatingSystemImage
in
$OperatingSystemImages)

{

    write-host
«  »

    Write-Host
« Migrating : »
$OperatingSystemImage.Name

    if ($OperatingSystemImage.PkgSourcePath -match
[regex]::Escape($Destshare))

    {

            Write-Host
 »    Already migrated »

    }

    else

    {

        if ($OperatingSystemImage.PkgSourcePath -match
[regex]::Escape($Sourceshare))

        {

            Write-Host
« Moving from : »
$OperatingSystemImage.PkgSourcePath

            $OperatingSystemImageNewPath
=
$OperatingSystemImage.PkgSourcePath -replace
[regex]::Escape($SourceShare),
« $Destshare« 

            Write-Host
« To : »
$OperatingSystemImageNewPath

            Set-CMOperatingSystemImage
-Id
$OperatingSystemImage.PackageID -Path $OperatingSystemImageNewPath

        }

        else

        {

            Write-Host
« Actual Source : »
$OperatingSystemImage.PkgSourcePath « doesn’t match specified source »

        }

    }

}

Laisser un commentaire

Choisissez une méthode de connexion pour poster votre commentaire:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s