PowerShell – Intune-tenantin AutoPilotin laitelistaus

Yksinkertainen AutoPilotin laitteiden listauksen tekeminen

Hieman teknisempää kikkaretta tällä kertaa. Intune on yleisesti oikein mukava ja toimiva laitos, mutta siitä on hienoisen vaikeaa saada välillä dataa irti GUI:n kautta.

Esimerkiksi täyden AutoPilotin laitelistauksen arvioiminen ja konfigurointi voi usein olla haastavaa, ja tässä käännytään herkästi partnerien sovellusten puoleen.

Lopulta datan kaivaminen on kuitenkin nykyisen Graph API:n kautta helpottunut:
Use the Microsoft Graph API – Microsoft Graph | Microsoft Docs

Graph API:n kautta kaikenkarvaisen kiinnostavan datan kaivaminen Intunesta onnistuu mukavasti paikallisen tietokoneen, PowerShellin ja sen soveltuvien moduulien kautta.

Jos esimerkiksi yritys haluaa nimetä kaikki laitteensa juoksevalla numerolla, voi Intunesta löytyä tämä tieto nopeastikin. Tässä on yksi pienoinen caveat.
GUI ei näytä AutoPilotin alla olevia laitteita, jotka odottavat käyttäjän enrollausta. Tai niiden nimiä.

Eli jos yritykseen tulee lyhyellä aikavälillä muutama rekry ja laitteet laitetaan AutoPilottiin manuaalisesti .csv -tiedostoista tai automaattisesti laitetoimittajan järjestelmän kautta, niin voi kahdelle tietokoneelle potentiaalisesti tulla sama device name, kun laitteita nimetään UI:n kautta. Tähän siis ei ole ennalta mitään mukavaa keinoa (laitteiden “Display Name” -arvon määrittelyyn siis). Se pitää tehdä joko GUI:n kautta yksitellen jokaiselle laitteelle, PowerShellin kautta tai vasta jälkeenpäin. Jälkeenpäin laitelistaus näyttää kuitenkin lähinnä anaaliselta sarjanumerosekamelskalta jos nimeämistä ei tehdä ennalta.

Toki, jos nimi randomisoidaan suoraan AutoPilotin Enrollmentin aikana, (Device Name Template) ei tätä ongelmaa pitäisi edes ilmetä. Pidän kuitenkin valitettavasti järjestyksestä (edes jossain määrin) ja juokseva numero tietokoneilla kuuluu ns. “pet peeve” -asioihini.
Tästä suivaantuneena väänsikin siis seuraavanlaisen PowerShellin turauksen.

Intune - AutoPilot -laitelistaus

# Intune Device display name Export script
# Close down Powershell to connect to a new customer tenant
# Compiled by Tuukka Tanner @ Acsion.fi

#Defines  the required module variables
$AP_module = “WindowsAutoPilotIntune”
$Intune_module = “Microsoft.Graph.Intune”

#Installs the required module if missing (AutoPilot)
if (Get-Module -ListAvailable -Name $AP_module) {
    Write-Host “Module $AP_module exists”
else {
    Write-Host “Module $AP_module does not exist”
    Write-Host “Installing module $AP_module
    Install-Module $AP_module

}

#Installs the required Module if missing (Graph.Intune)
if (Get-Module -ListAvailable -Name $Intune_module) {
    Write-Host “Module $Intune_module exists”
else {
    Write-Host “Module $Intune_module does not exist”
    Write-Host “Installing module $Intune_module
    Install-Module $Intune_module

}

#Imports the required modules (Graph.Intune and AutoPilotIntune)
Import-Module $AP_module
Import-module $Intune_module

#Connects to MSGraph api
Connect-MSGraph | Out-Null

#Gets the device info to Powershell
get-autopilotdevice -expand | Select-Object Displayname, serialnumber, id, model `
Sort-Object -property “displayname”

#Imports the data to .csv file
$devicelist = get-autopilotdevice -expand | Select-Object Displayname, serialnumber, id, model `
Sort-Object -property “displayname”
$folderpath = Read-Host “Enter a folder Path to save the output file ‘Intune_Device_List.csv’ to”
$devicelist | Out-File -FilePath $folderpath\Intune_device_list.csv

Avataanpa hieman mitä ym. kikkare tekee.

Eli ihan alussa määritetään kaksi moduulia, jotka ovat vaadittuja näiden Graph API -kyselyiden tekemiseen. Ihan vain variable -tietoihin, eli skriptin sisälle arvoihin. Laiska kun olen, niin en jaksa manuaalisesti monta kertaa näitä arvoja kirjoittaa skriptiin.

Kyseessä on siis kohta:

#Defines  the required module variables
$AP_module = “WindowsAutoPilotIntune”
$Intune_module = “Microsoft.Graph.Intune”

 

Seuraavaksi yksinkertainen if/else -rakenne tarkistaa ovatko kyseiset moduulit olemassa ym. powershellin sessiossa, tai käyttäjällä saatavilla:

#Installs the required module if missing (AutoPilot)
if (Get-Module -ListAvailable -Name $AP_module) {
    Write-Host “Module $AP_module exists”
else {
    Write-Host “Module $AP_module does not exist”
    Write-Host “Installing module $AP_module
    Install-Module $AP_module
}
#Installs the required Module if missing (Graph.Intune)
if (Get-Module -ListAvailable -Name $Intune_module) {
    Write-Host “Module $Intune_module exists”
else {
    Write-Host “Module $Intune_module does not exist”
    Write-Host “Installing module $Intune_module
    Install-Module $Intune_module
}

 

Kun tarkistus ja/tai lataus on tehty, otetaan kyseiset modulit vielä varmuuden vuoksi päälle importin kautta, jos latausta ei tarvitse suorittaa tai ne on jo ladattu aiemmin:

#Imports the required modules (Graph.Intune and AutoPilotIntune)
Import-Module $AP_module
Import-module $Intune_module

 

Tässä vaiheessa päästään vasta skriptin ns. “suorittavaan” osaan, eli se miksi varten tämä kikkare tehtiin. Ym. asiat olivat vain vaatimuksia että nämä arvot saadaan edes ulos.

Seuraava vaatimus onkin sitten vähintään Intune Administrator -tasoinen tunnus, jotta nämä Graph API:n tiedot voidaan ladata ulos. En nyt juuri mene takuuseen, pitääkö Graph API callit vielä erikseen sallia / Admin Consentata Azuren puolella (Enterprise Applications). Jos vaaditaan, niin sitten tämä pitää vielä tehdä esivalmisteluna. Alla lisätietoa asiasta:

How to use Azure AD to access Intune APIs in Microsoft Graph – Microsoft Intune | Microsoft Docs

Mutta, jatketaan sillä oletuksella, että oikeudet ja tunnus on järjestetty käyttöönne.

Prosessi jatkuu sillä, että skripti yhdistää itsensä määriteltyyn tenanttiin, josta tiedot haetaan. Määritys tapahtuu täysin käyttäjätunnuksen kautta, eli O365:n tunnusten kautta. “Connect-MSGraph” -siis pompauttaa esiin normaalin O365:n kirjautumisikkunan, jonka kautta soveltuva tunnus ilmoitetaan PowerShellille:

#Connects to MSGraph api
Connect-MSGraph | Out-Null

 

Kun tämä yhdistäminen on tehty, päästään viimein siihen kohtaan, jossa aktuaalista dataa haetaan.

#Gets the device info to Powershell
get-autopilotdevice -expand | Select-Object Displayname, serialnumber, id, model `
Sort-Object -property “displayname”

 

Do diin, eli tässä käytetään Microsoftin PowerShellin “AutoPilot” -moduulin osaa “get-autopilotdevice” -kohtaa. Hauskuus tässä on se, että “Display Name” -arvo tulee näkyviin vasta -expand -kohdan kautta. Ja tässäkin on toinen hassunhauska piirre. Arvo ei näy kuin vasta 1-2 AutoPilotin synkronoinnin jälkeen. Näissä taasen on 15 minuutin viive, jolloin synkronointeja voidaan ajaa. Kyseessä on Microsoftin taustajärjestelmän asetus, jota ei voida muuttaa.

Noh, nimeäminen on siis tämän kautta PowerShellissä hieman haastavaa. Mutta tähänkin olen pyöräyttänyt powershellin kikkareen toimimaan vieressä. Sen kautta vaikka sadan laitteen juoksevan numeron pohjalta tehtävä nimeäminen onnistuu. Mutta ei siitä tässä enempää.

Tässä kohtaa data saadaan jo auki-olevaan PowerShell -ikkunaan. Siinä sen pläräys on kuitenkin hieman vaivalloista, jos laitteita on enemmän kuin viisi kappaletta:

Yllä olevasta kuvasta on blokattu laitetietoja pois, mutta ainakin tämä antaa kuvan miltä näkymä potentiaalisesti näyttää.

Jos tämä on ainoa tarve, niin muuta skriptissä ei tarvitsekaan sitten määritellä.
Lisätietoa WindowsAutoPilotIntune -moduulin sisällöstä löytyy seuraavan linkin alta:
PowerShell Gallery | WindowsAutoPilotIntune.psm1 5.0 

Jos kuitenkin halutaan esimerkiksi juoksen numeron määrittelyn tarkistuksia tulille, niin ne selviävät esimerkiksi hyvinkin yksinkertaisesti seuraavalla skriptillä kun yhteys on tulilla:

#Gets the device info to Powershell
$AutoPilotDeviceList = get-autopilotdevice -expand `
Select-Object Displayname, serialnumber, id, model  | Sort-Object -property “displayname”
$AutoPilotDeviceList | Select-Object -Last 5 | Out-GridView

 

Tämä yksinkertainen variantti tulostaa viimeisimmät viisi nimettyä laitetta PowerShellin “Out-Gridview” -näkymään. Eli erilliseen ikkunaan. Se voi aueta muiden ikkunoiden alle tietokoneella, mutta näkyy PowerShellin aliprosessina Windowsissa.

Tässä näkymässä tietoja voidaan nopeasti jaotella ja filteröidä (toimii itse asiassa todella hyvin tuo filteröinti, testatkaa!).

Ja sitten vielä itse skriptissäkin oleva Wanha kunnon .csv -export!

#Imports the data to .csv file
$devicelist = get-autopilotdevice -expand | Select-Object Displayname, serialnumber, id, model `
Sort-Object -property “displayname”
$folderpath = Read-Host “Enter a folder Path to save the output file ‘Intune_Device_List.csv’ to”
$devicelist | Out-File -FilePath $folderpath\Intune_device_list.csv

 

Tällä listaus saadaan .csv -muotoiseen tiedostoon, joka voidaan sitten tallentaa haluttuun lokaatioon tietokoneella.

Tämä toiminnallisuus on hyödyllisimmillään, jos “select-object” -lauseke jätetään kokonaisuudessaan pois ja kaikki AutoPilotin data tulostitaan .csv -tiedostoon.
Eli kun halutaan kattava laitelistaus ja laitetieto kasaan. Samalla myös selviää hyvin, mitä kaikkia attribuutteja AutoPilot pitää Graph APIn alla piilossa.

Eiköhän tämä riitä tälle kertaa.

Paskaa spagettiskriptiä pukkaa, mutta ainakin se toimii (jollain asteella)!

PS. Emme ota mitään vastuuta näistä turauksista, käyttäkää omalla vastuulla yms. yms. öms.