Depuis System Center 2012 Configuration Manager SP1, Microsoft a introduit un module PowerShell permettant de faire des actions d’administration. Ceci est très pratique pour les administrateurs et peut être utilisé notamment pour faire de l’orchestration. Quand on veut faire de l’orchestration, le but n’est pas d’installer toutes les consoles du monde (SCCM, SCOM) pour pouvoir avoir accès aux cmdlets PowerShell. Pour cela, il est possible d’utiliser Remote PowerShell. On se connecte via WinRM pour exécuter des actions à distance sur une machine dédiée.
Pour cela, vous pouvez utiliser le script suivant :
$script:ErrorActionPreference = "Stop"
Set-StrictMode -Version Latest
$SCCMPrimaryServer = "<SERVERNAME>"
$session = $null
[hashtable]$output = @{"error" = $null; "success" = "success"}
Write-Verbose "Trying to open session on $SCCMPrimaryServer..."
try
{
#Try To create session
$session = New-PSSession -ComputerName $SCCMPrimaryServer -ConfigurationName Microsoft.PowerShell32;
Write-Verbose "Session opened"
}
catch
{
Write-Verbose "Error : Can't connect to $SCCMPrimaryServer";
$output.success = "error"
$output.error = "Error : Can't connect to $SCCMPrimaryServer";
}
#If The session was created
if($output.success-ne "error" -and $session -ne $null)
{
write-verbose "Invoking scriptblock into the session"
$output = Invoke-Command -Session $session -ArgumentList $SCCMPrimaryServer,$Arg1 -ScriptBlock {
#Initialize variables
[String]$SCCMPrimaryServer = $args[0]
[String]$Arg1 = $args[1] #Used for your Purpose
[hashtable]$output = @{"success" = "error"; "error" = $null}
Function Connect-SCCM
{
If (!(Get-Module ConfigurationManager)) {
[String]$SCCMInstall = ((Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\ConfigMgr10\Setup').'UI Installation Directory')
Import-Module ($SCCMInstall +'bin\ConfigurationManager.psd1') -Scope Global
}
Set-Location ((get-psdrive -PSProvider CMSite).Name+":")
}
# Connect to Primary Site
Try{
Connect-SCCM
$output.success = "success"
}
Catch {
$output.success = "error"
$output.error = "Error connecting SCCM"
}
If($output.success -ne "error")
{
try {
# DO the Work HERE
}
catch {
$output.success = "error"
$output.error += $_.Exception.Message
}
}
#Return the output outside of the session
Return $output
}
Write-verbose "Scriptblock executed, killing session"
#Delete the session
Remove-PSSession $session;
}
else
{
#If session is null then it couldn't be created
Write-Verbose "Error : Can't open session to $SCCMPrimaryServer";
$output.success = "error"
$output.error = "Error : Can't open session to $SCCMPrimaryServer";
}
Ceci fonctionnera dans certaines conditions. En effet, le paramétrage du drive PowerShell peut échouer. La ligne suivante est concernée :
Set-Location ((get-psdrive -PSProvider CMSite).Name+":")
J’ai trouvé un article sur le blog de l’équipe Microsoft Denmark Premier Field qui m’a permis de débloquer la situation. Pour cela, vous devez :
- Vous connecter sur la machine cible avec le compte de service utilisé pour exécuter le script en Remote PowerShell
- Ouvrir la console d’administration puis utiliser la fonction Connect via Windows PowerShell.
- La fenêtre PowerShell s’ouvre et le certificat n’ayant jamais été approuvé, vous demande de le valider. Vous pouvez alors sélectionner [A] pour Always Run.
- Ceci fonctionnera mais si vous voulez utiliser une méthode plus propre, vous pouvez sur cette même machine, naviguez dans le répertoire d’installation de la console\AdminUI\Bin.
- Identifiez le fichier ConfigurationManager.psd1 et ouvrez les propriétés.
- Sélectionnez le certificat et installez-le sur la machine dans le magasin Trusted Publishers.
Pour voir la procédure complète, vous pouvez lire l’article : Running Configuration Manager 2012 PowerShell scripts as a Service Account or Local System