venerdì 15 luglio 2022

Google Drive API e Powershell: deploy del browser Chrome tramite script

Hi Guys,

oggi vorrei condividere con voi uno script Powershell per ambienti Windows che forse può tornarvi utile nel caso in cui doveste trovarvi nella scomoda situazione di dover deployare il browser Google Chrome sui client della vostra rete locale. Il file per l'installazione da utilizzare si trova ovviamente sul servizio Google Drive.

Lo script, attraverso le API messe a disposizione da Google, si collegherà al Drive e scaricherà il file di setup del browser Chrome e farà partire l'installazione.


Step 1 Creazione di un progetto su Google

Accedete con la vostra utenza google alla pagina dedicata: https://console.cloud.google.com/apis e creiamo un nuovo progetto APi:


E poi diamo un nome al progetto, per esempio Demo:

Step 2 Attivazione APi

A questo punto siamo sulla Dashboard del progetto e possiamo procedere ad attivare le APi di Gdrive andando nell'apposita sezione, come illustrato nella immagine di seguito:


e cliccare sul link "Abilita Api e servizi"


e dalla libreria scegliamo "Google Drive Api" come nelle immagini di seguito:


procediamo cliccando su "Abilita"



Dalla schermata successiva clicchiamo prima su "Credenziali" nel menu a sinistra e poi su "Crea credenziali":

 e poi "ID client OAuth" dal menu a tendina che si apre:



ed andiamo a selezionare come Tipo di Applicazione, Applicazione Web, opzionalmente potete specificare un nome per il client ed aggiungiamo la seguente url per i reindirizzamenti autorizzati: https://developers.google.com/oauthplayground



Una volta cliccato su "CREA" si apre un popup con il Client ID e Client Secret (c'è anche la possibilità di scaricare il file JSON) che potrete usare per configurare le vostre applicazioni.

Se durante la procedura, il sistema dovesse chiedervelo, provvedete a configurare il consenso OAuth per uso esterno:


e provvedete ad inserire nome ed email (per il suporto) dell'applicazione. C'è anche la possibilità di configurare un dominio ma al momento non ci interessa.

Step 3 Configurazione APi

All'url https://developers.google.com/oauthplayground/ andiamo a configurare il servizio appena creato cliccando sull'ingranaggio in alto a dx, spuntando l'opzione "Usa le tue credenziali" ed inserendo il codice ClientID e il codice ClientSecret, generato precedentemente.



Dal menu presente a destra invece scrolliamo fino a Drive API v3 e selezionando la prima Url e cliccando su "Authorize APis"


A questo punto possiamo procedere a con lo script per il download del file da Gdrive

Step 4 Lo script

Lo script sviluppato, controlla se Chrome è già installato, se non viene rilevato, lo script effettua un check sull'architettura del sistema ed in base a quest'ultima scarica l'installer del browser Google Chrome in versione 32 o 64 bit. Ricordatevi che prima di lanciare lo script dovrete caricare i file sul drive ed estrarne l'ID da utilizzare per la configurazione all'interno dello script.

#CHROME SETUP OK CON GDRIVE API
Set-ExecutionPolicy -Scope Process -ExecutionPolicy RemoteSigned
# Imposto i parametri Google Auth: RefreshToken, ClientID, and ClientSecret
$params = @{
    Uri = 'https://accounts.google.com/o/oauth2/token'
    Body = @(
        "refresh_token=INSERIRE REFRESH TOKEN", 
        "client_id=INSERIRE CLIENTID", 
        "client_secret=INSERIRE CLIENT SECRET", 
        "grant_type=refresh_token"
    ) -join '&'
    Method = 'Post'
    ContentType = 'application/x-www-form-urlencoded'
}
$accessToken = (Invoke-RestMethod @params).access_token

# Setta gli headers di autenticazione
$headers = @{
    "Authorization" = "Bearer $accessToken"
    "Content-type" = "application/json"
}

$Path = "$env:TEMP"
$OSVersion=(Get-WmiObject Win32_OperatingSystem).OSArchitecture
$OS1= "32*"
$OS2= "64*"
$software = "chrome.exe";
$installed = (Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\App*Paths\* | Where { $_.PSChildName -eq $software }) -ne $null

If(-Not $installed) {
        if ( $OSVersion -like $OS2 ){ #Microsoft Windows 7-10-11 for 64 bit
             write "Chrome non è installato, procedo con il download"
             write "Architettura del sistema Operativo rilevato $OS2"
             #$Installer = "googlechromestandaloneenterprise64.msi"

             #Download file 64 bit
             write "Download in corso del file di installazione..."
 
      # Settare l'ID del file da scaricare. Per ottenere il fileID cliccare con il tasto destro sul file da scaricare e selezionare 'Ottieni Link condivisibile' e selezionare la stringa alfanumerica all'interno dell'url.
      $fileId = "INSERIRE ID FILE"
      
      # Ottieni i metadata
      $fileMetadata = Invoke-RestMethod -Uri "https://www.googleapis.com/drive/v3/files/$fileId" -Headers $headers
      
      # Imposto il path dove verrà scaricato il file (solo il path)
      $destinationPath = "$Path"
      $exportFileName = "$destinationPath\$($fileMetadata.name)"
      #Scarica il file
      Invoke-RestMethod -Uri "https://www.googleapis.com/drive/v3/files/${fileId}?alt=media" -Method Get -OutFile $exportFileName -Headers $headers

             #Imposto un tempo di attesa per consentire il download
             Start-Sleep -Seconds 60
             
             #Controllo se il file scaricato esiste               
             $TestPath=Test-Path -Path $exportFileName -PathType Leaf               
             if ($TestPath -eq $true){

                 #Avvio l'installazione con i parametri ricevuti
                 write "Avvio l'installazione..."
                 MsiExec.exe /i $exportFileName /qn
                 Start-Sleep -Seconds 60

                 #Elimino i file scaricati
                 Remove-Item $exportFileName

                 #Controllo la versione appena installata
                 $Check_Chrome=(Get-Item (Get-ItemProperty -ErrorAction Ignore -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\App*Paths\chrome.exe").'(Default)').VersionInfo
                 $ChromeVersion = $Check_Chrome.ProductVersion
                 write "Chrome è stato aggiornato all'ultima versione $ChromeVersion"
                 } else {
                 #se l file non è presente termina lo script
                 write "Errore di download, provare a rilanciare lo script"
             }
        } else { #Microsoft Windows 7-10-11 for 32 bit
             write "Chrome non è installato, procedo con il download"
             write "Architettura del sistema Operativo rilevato $OS1"
             #$Installer = "googlechromestandaloneenterprise.msi"

             #Download file 32 bit
             write "Download in corso del file di installazione..."
 
# Settare l'ID del file da scaricare. Per ottenere il fileID cliccare con il tasto destro sul file da scaricare e selezionare 'Ottieni Link condivisibile' e selezionare la stringa alfanumerica all'interno dell'url.
$fileId = "INSERIRE ID FILE"

# Ottieni i metadata
$fileMetadata = Invoke-RestMethod -Uri "https://www.googleapis.com/drive/v3/files/$fileId" -Headers $headers

# Imposto il path dove verrà scaricato il file (solo il path)
$destinationPath = "$Path"
$exportFileName = "$destinationPath\$($fileMetadata.name)"
#Scarica il file
Invoke-RestMethod -Uri "https://www.googleapis.com/drive/v3/files/${fileId}?alt=media" -Method Get -OutFile $exportFileName -Headers $headers  

             #Imposto un tempo di attesa per consentire il download
             Start-Sleep -Seconds 60

             #Controllo se il file scaricato esiste               
             $TestPath=Test-Path -Path $exportFileName -PathType Leaf               
             if ($TestPath -eq $true) {

                 #Se il file è presente avvio l'installazione con i parametri ricevuti
                 write "Avvio l'installazione..."
                 MsiExec.exe /i $exportFileName /qn
                 Start-Sleep -Seconds 60

                 #Elimino i file scaricati ::: 
                 Remove-Item $exportFileName

                 #Controllo la versione appena installata
                 $Check_Chrome=(Get-Item (Get-ItemProperty -ErrorAction Ignore -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\App*Paths\chrome.exe").'(Default)').VersionInfo
                 $ChromeVersion = $Check_Chrome.ProductVersion
                 write "Chrome è stato aggiornato all'ultima versione $ChromeVersion"
                 } else {
                 #se l file non è presente termina lo script
                 write "Errore di download, provare a rilanciare lo script"
                }
        }
  } else {
        $Check_Chrome=(Get-Item (Get-ItemProperty -ErrorAction Ignore -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\App*Paths\chrome.exe").'(Default)').VersionInfo
        $ChromeVersion = $Check_Chrome.ProductVersion
        write "'$software' è già aggiornato all'ultima versione $ChromeVersion"
}

That's all!

Fatemi sapere che ne pensate nei commenti. Bye!

Nessun commento:

Posta un commento