Le blog technique

Toutes les astuces #tech des collaborateurs de PI Services.

#openblogPI

Retrouvez les articles à la une

Active Directory – Comment installer un module PowerShell sans connexion internet ?

Pour limiter la surface d’attaque d’un système d’information, il est courant que les serveurs n’aient pas de connexions internet. C’est un problème pour l’installation de modules PowerShell via la commande Install-Module qui va utiliser une URL internet pour télécharger ses sources. Comment peut-on alors faire pour récupérer ces précieux modules ?

 

Les messages d’erreurs type lorsque le serveur n’est pas autorisé à récupérer un module depuis internet

Message d’erreur type pour Install-Module

 

Message d’erreur type pour Get-PSRepository

 

On peut essayer de réinitialiser les paramètres par défaut du répertoire PowerShell avec la commande Register-PSRepository – Default mais une nouvelle saisie de Get-Repository démontre que rien n’a été changé.

 

Il existe également d’autre paramètres pour la commande Register-PSRepository qui nous permettent par exemple de spécifier nous-mêmes les URL de repository PowerShell mais quel que soient les paramètres entrés sans connexion internet la connexion ne sera jamais établie.

 

Sauvegarder le module PowerShell depuis un ordinateur avec une connexion internet

La commande Save-Module permet de sauvegarder un module PowerShell dans un dossier défini.

Un dossier du module téléchargé est alors dans le dossier spécifié.

Le dossier du module PowerShell doit être ensuite copié sur le serveur qui n’a pas de connexion internet. Le dossier cible doit être celui par défaut pour l’installation de module PowerShell ou s’il a été changé ce dernier.

 

Pour trouver les répertoires de modules PowerShell la variable d’environnement $env:PSModulePath peut être utilisé.

 

Habituellement, il est préférable que le module soit disponible à l’ensemble des utilisateur du serveur, le dossier C:\Program Files\WindowsPowerShell\Modules va donc être utilisé comme cible pour la copie du module PowerShell.

 

La commande Import-Module peut ensuite être utilisée pour chargé le nouveau module dans une session PowerShell. 

Intune : Résoudre les problèmes OOBE Autopilot

Description du problème

L’ordinateur démarre le déploiement Autopilot mais dans l’étape de configuration « Compte », cet écran s’affiche :


Au lieu de cet écran :


–> Si l’utilisateur final choisit « Configurer pour un usage personnel », il sera invité à créer un compte local/compte personnel Microsoft, au lieu d’utiliser son compte Entreprise
–> Par conséquent, l’ordinateur ne rejoindra pas Azure AD et ne sera pas inscrit à Intune

Résultats de troubleshooting

Collectez les journaux de diagnostic de l’ordinateur en exécutant la commande cmd ci-dessous localement (en tant qu’administrateur) :
« MDMDiagnosticsTool.exe -area Autopilot -cab C:\temp\Autopilot.cab »
Une fois généré, ouvrez le fichier compressé et recherchez « microsoft-windows-moderndeployment-diagnostics-provider-autopilot.evtx »
Dans ce journal d’observateur d’événements, vous devriez trouver les événements d’information et d’avertissement ci-dessous :

– Information event ID 153 :

– Warning event ID 100 :

Suite à cet article Microsoft, ces ID d’événement sont expliqués comme suit :

Troubleshoot Autopilot OOBE issues

Conclusion

Selon le troubleshooting, le problème décrit est lié à une erreur temporaire lorsque l’appareil essaie ou attend le téléchargement d’un profil de déploiement Autopilot.

Cette erreur temporaire peut être le résultat de :

– Problème de filtrage de connexion Internet

– Un profil Autopilot qui n’est toujours pas attribué à l’appareil :

  • Le Hash de l’appareil est correctement importé mais l’adhésion au groupe dynamique pour l’attribution du profil Autopilot est toujours en cours (nous pouvons attendre environ une heure après l’import du csv contenant le Hash et avant de commencer le déploiement de l’appareil, pour nous assurer que tout est bien configuré du côté Intune Autopilot)
  • Le Hash de l’ordinateur n’a pas été correctement importé dans Intune, colonne Group Tag manquante par exemple

Power BI Report Server – Script – Export de dashboards en PBIX

Le script ci-dessous prend en paramètre un fichier contenant une liste de dashboard a exporter au format pbix.

 

<pre class="wp-block-syntaxhighlighter-code">#####################################################################
###### PwBI_Export_Dashboards.ps1 - EXPORT DE RAPPORTS EN PBIX ######
#####################################################################


<# 

    .SYNOPSIS 
        CONNEXION A L'API SQL POWERBI REPORTING SERVICES ET EXPORT DE UN OU PLUSIEURS DASHBOARD
 

    .PARAMETER  
        webServiceUrl : Url Racine du serveur de rapport
        CatalogUrl : Url du catalogue des items
        DashboardListFile : Fichier des noms de dashboard a exporter
        BackupFolder : Dossier d'export des dashboards
        LogFolder : Chemin du dossier où creer le log du script

 
    .EXAMPLE 
        .\PwBI_Export_Dashboards.ps1 -webServiceUrl "http://MyServer/Reports"  -DashboardListFile ".\PwBI_Export_Dashboards_List.txt" -BackupFolder ".\BACKUP" -LogFolder ".\BACKUP" 
     
#>


[CmdletBinding()]
param(
[Parameter(Mandatory,HelpMessage="Url Racine du serveur de rapport")]
[string]$webServiceUrl,

[Parameter(Mandatory=$false,HelpMessage="Url du catalogue des items")]
[string]$CatalogUrl = "$webServiceUrl/api/v2.0/CatalogItems",


[Parameter(Mandatory,
HelpMessage="Fichier des noms de dashboard a exporter")]
[ValidateScript({
if( -Not ($_ | Test-Path) ){
                throw "File does not exist"
            }
            return $true 
})]
[string]$DashboardListFile,

[Parameter(Mandatory,HelpMessage="Dossier d'export des dashboards")]
[string]$BackupFolder,

[Parameter(Mandatory,HelpMessage="Chemin du dossier où creer le log du script")]
[string]$LogFolder = "D:\Indicateurs_Securité"

)




# GET DASHBOARD LIST CONTENT
[array]$DashboardList = Get-Content -Path $DashboardListFile



# SCRIPT NAME
$ScriptName = "PwBI_Export_Dashboards.ps1"

# LogName = ScriptName without extension
$Log = $ScriptName.Split('.')[0]

# GET CREDENTIALS TO CONNECT TO REPORT SERVER
$cred = $(Get-Credential -Credential "$env:USERDOMAIN\$env:USERNAME")



function Write-Log 
{ 
    <# 
    .SYNOPSIS 
        This function creates or appends a line to a log file. 
 
    .PARAMETER  Message 
        The message parameter is the log message you'd like to record to the log file. 
 
    .EXAMPLE 
        PS C:\> Write-Log -Message 'Value1' 
        This example shows how to call the Write-Log function with named parameters. 
    #> 
    [CmdletBinding()] 
    param ( 
        [Parameter(Mandatory)] 
        [string]$Message,
        [Parameter(Mandatory)] 
        [string]$LogPath, 
        [Parameter(Mandatory)] 
        [string]$LogName
        
    ) 
     
    try 
    { 
        $DateTime = Get-Date -Format ‘MM-dd-yy HH:mm:ss’ 
        Add-Content -Value "$DateTime - $Message" -Path "$LogPath\$LogName.log" 
    } 
    catch 
    { 
        Write-Error $_.Exception.Message 
    } 
} 




# TABLEAU DES CATALOG ITEMS
$Message = "Recuperation du catalogue des items..."
write-host $Message
Write-Log -Message $Message -LogPath $LogFolder -LogName $Log


            try
            {
            $CatalogItems = Invoke-RestMethod -Uri $CatalogUrl -ContentType 'application/json' -UseDefaultCredentials -Method get
            }
            catch
            {
            $Message = "Error during query of Catalog Items"
            Write-Log -Message "$Message - $($Error[0].Exception)" -LogPath $LogFolder -LogName $Log
            Write-Host -F Yellow $Message
            exit 1
            }



# COMPARAISON DE $CatalogItems ET $ReportList POUR DETERMINER LA LISTE DES DASHBOARDS A EXPORTER

$FoundReport = $CatalogItems.value | Where-Object {$_.name -in $DashboardList}

if (!($FoundReport))
{
$Message = "The required Dashboards have not been found in the catalog of the report server - END OF SCRIPT"
write-host -f Yellow $Message
Write-Log -Message $Message -LogPath $LogFolder -LogName $Log
Exit 1
}



# EXPORT DES DASHBOARDS
try
{

    foreach ($Report in $FoundReport)
    {
    $url = "$CatalogUrl($($Report.Id))/Content/`$value"
    Invoke-WebRequest -UseDefaultCredentials -Uri $url -OutFile "$BackupFolder\$($Report.name).pbix"
    }

}
catch
{
$Message = "KO - The required Dashboards have not been found in the catalog of the report server - END OF SCRIPT"
write-host -f Yellow $Message
Write-Log -Message $Message -LogPath $LogFolder -LogName $Log
Exit 1
}


$Message = "OK - The required Dashboards have been Exported to $BackupFolder - END OF SCRIPT"
write-host -f Green $Message
Write-Log -Message $Message -LogPath $LogFolder -LogName $Log
Exit 0



</pre>