Das PowerShell Modul IntuneDeviceInventory ermöglicht es dir benutzerdefinierte Felder zu Intune Geräte-Objekten hinzuzufügen. Zusätzlich beinhaltete es einige handliche und unterstützenden Befehle, um Mehrfachaktionen wie beispielsweise einen Sync oder Reboot anzustossen.
Das Modul inklusive dazugehörigem UI habe ich in Zusammenarbeit mit Jannik Reinhard entwickelt. Falls du Feedback zum Modul / Tool hast, freuen wir uns über einen Kommentar oder auch Kontakt via Social Media.
Table of Contents
Modul installieren
Das Modul habe ich in der PowerShell Gallery (IntuneDeviceInventory) veröffentlicht. Du kannst es darum ganz einfach bei dir via PowerShell installieren. Dazu gibst du folgenden Befehl ein:
Install-Module -Name IntuneDeviceInventory
Codesprache: Power Shell (powershell)
Funktionen
Das Modul kann grob in drei Funktionsgruppen unterteilt werden, Funktionen zur Verwaltung der benutzerdefinierten Felder, Funktionen für Massenaktionen und unterstützende Funktionen.
Authentifizierung
Du hast bei der Authentifizierung zwei Möglichkeiten. Entweder du meldest dich mit einem Intune Administrator an, oder verwendest eine Azure App Authentifizierung.
Benutzer Authentifizierung
Bei der Benutzerauthentifizierung musst du lediglich den Connect befehlt aufrufen und anschliessend deine Credentials eingeben.
Connect-IDI
App Authentifizierung
Für die Authtifizierung via App musst du zunächst eine App Registireung im Azure AD durchführen. Diese benötigt folgende Berechtigungen:
- DeviceManagementManagedDevices.PrivilegedOperations.All
- DeviceManagementManagedDevices.ReadWrite.All
- Group.Read.All
- GroupMember.Read.All
- Organization.Read.All
- User.Read.All
Die Registrierung kannst du entweder manuell im Azure oder Entra Portal (Applications > App registration) durchfügen oder über die Funktion New-IDIApp
. Mit dem Parameter -Save
wird die Verbindung in deinem AppData mit deinem User verschlüsselt abgelegt.
Falls bereits ein App besteht und du einfach ein neues Secret Estellene möchtest, verwende zusätzlich den Parameter -Force
.
# Creates a new App and shows connection details
New-IDIApp
# Creates a new App and saves the details encrypted in the users AppData:
## ("C:\Users\%username%\AppData\Local\IntuneDeviceInventory\AppConnection\TenantId.connection")
New-IDIApp -Save
Codesprache: Power Shell (powershell)
Auch wenn du die App Registration via PowerShell machst, musst du am Schluss noch den "Admin consent" geben. Dazu wird dir nach erfolgreicher Erstellung die URL ausgegeben. Nach erfolgreichem Erteilen werden die Status grün.

Zur Verbindung mit einer abgespeicherten App Verbindung rufst du am einfachsten den Befehl Import-IDIAppConnection -Select
auf. Damit werdend dir alle gespeicherten Verbindungen angezeigt und du kannst dich mit einem Klick verbinden.
Alternativ kannst du auch folgenden Befehl mit den entsprechenden App Parametern verwenden:
Save-IDIAppConnection -ClientId $ClientId -TenantId $TenantId -ClientSecret $ClientSecret
Codesprache: Power Shell (powershell)
Verwaltung der benutzerdefinierten Felder
Die Verwaltung der benutzerdefinierten Felder funktioniert am besten via UI, mehr dazu weiter unten.
Natürlich kannst du die Felder auch via PowerShell erstellen und abfüllen, dazu zeige ich dir ein Beispiel im Demovideo.
Das sind die Funktionen dazu:
- Add-IDIProperty
- Get-IDIDevice
- Set-IDIDevice
Backup & Restore
Während der Präsentation unseres Tools, hat Michael die Idee gebracht, auch eine "Backup & Restore" Funktion einzubauen. Dies für den Fall, dass sich in Zukunft etwas in Intune verändern sollte.
... und das haben wir natürlich gemacht. 😉
Mit der Funktion kannst du ganz einfach alle benutzerdefinierten Felder in ein JSON speichern und entweder bei deinem Teant oder aber auch in einen anderen importieren.
Der Restore in einen anderen Tenant ist dazu gedacht, falls du einen "Tenant zu Tenant" Migration durchführen musst. Dann hast du die Möglichkeit, das Backup nicht anhand der Device-ID einzuspielen, sondern anhand der Seriennummer. (Parameter -serial
)

Massenaktionen
Da es im Intune Portal nicht sehr praktikabel ist eine Aktion schnell für mehrere Geräte durchzuführen, habe ich die Massenaktionen eingebaut umso Aktionen, Geräte oder Gruppenbasiert, sowie für alle Geräte durchzuführen.
Aktuell sind das diese Funktionen, welche wiederum in Minor und Major eingeteilt werden, könne.
Die Minor Funktionen machen nur ein Update oder Restart des Geräts, bei den Major Funktionen ist das Gerät nach dem Absenden des Befehls nicht mehr nutzbar.
- Invoke-IDIDeviceBitLockerRotation
- Invoke-IDIDeviceDefenderScan
- Invoke-IDIDeviceDefenderSignatures
- Invoke-IDIDeviceRestart
- Invoke-IDIDeviceSync
- Invoke-IDIDeviceDelete
- Invoke-IDIDeviceRetire
- Invoke-IDIDeviceWipe
Alle "Invoke"-Funktionen kannst du mit den folgenden Parametern aufrufen:
Parameter | Beschreibung |
---|---|
-IDIDevice | Gib ein Gerät an, dass du mit Get-IDIDevice ausgelesen hast. |
-Group | Mitglieder einer Gruppe |
-User | UPN eines spezifischen Users. Aktion wird für alle seine Geräte ausgeführt. |
-deviceName | Spezifischen Gerätenamen. |
-id | Intune Device ID |
-azureADDeviceId | Azure AD Device ID (Wird für die Verarbeitung der Gruppenmitglieder verwendet) |
-All | Triggert die Aktion für alle Intune Geräte. |
-Grid | Zeigt dir eine "Grid View" an, in welcher du ein oder mehrere Geräte anklicken/auswählen kannst. |
-Verbose | Diesen Parameter kannst du zusätzlich zu einem anderen angeben, um die Verarbeitung jedes Gerätes angezeigt zu bekommen. Das ist besonders bei vielen Geräten hilfreich. |
Hier ein Beispiel in der Anwendung des Verbos Parameters:

Und hier eine Major Funktion. Diese werden erst nach einer Bestätigung oder mit dem Parameter -Force
ausgeführt.


Unterstützende Funktionen
Alle weiteren Funktionen findest du im Repository und beinhalten einen Beschrieb im Header. Mit diesen solltest du aber nichts machen müssen. Sie werden von den anderen Funktionen oder dem UI aufgerufen.
Dieser Post geht bei den Funktionen nicht in die Details. Genauere Beschreibungen und mehr Beispiele findest du im Projekt Repository auf GitHub oder im Demovideo weiter unten.
Ich habe das "Notes" Feld bereits abgefüllt! Was nun?
Keine Angst, auch wenn du das Notes Feld bereits mit einer Information abgefüllt hast, kannst du das Modul verwenden. Dazu gibt es die Funktion ConvertTo-IDINotes
.
Mit dieser kannst du die Notizen für ein bestimmtes Gerät oder auch gleich alle in ein JSON und somit kompatibel mit dem IntuneDeviceInventory konvertieren.
Wenn du nicht sicher bist, ob deine Notizfelder kompatibel sind, führe einfach die Funktion Get-IDIDevice -All
aus. Damit werden alle Geräte inklusive Notizen ausgelesen und geprüft. Ist ein Feld nicht kompatibel, wird gleich ein Fehler ausgegeben.
Alle Geräte konvertierst du mit dem Befehl ConvertTo-IDINotes -All
.
Alle Geräte, die bereits kompatibel sind, werden dabei mit einer Warnung übersprungen.

UI zum Modul
Das Verwalten der benutzerdefinierten Felder ist via Terminal nicht immer ganz einfach und praktikabel. Um die Features noch einfacher nutzen zu können, hat Jannik Reinhard und ich zusätzlich ein UI zum Modul entwickelt. Dieses findest du ebenfalls im GitHub Repository.
Hier ein kleiner Ausschnitt des UI, mehr Infos findest du über den Button oben "UI Introduction".

Demo IntuneDeviceInventory (Terminal)
Im nachstehenden Video zeige ich dir, wie du mit dem Modul starten kannst und was die Basis Befehle sind. Weitere Beispiele findest du in meinem GitHub Repository.
Code Beispiele
Hier sind die Beispiele aus dem Demovideo:
#Installing IDI
Install-Module -Name IntuneDeviceInventory
# Creates a new App and shows connection details
## login with the Admin required (Application administrator, Application developer or Cloud application administrator)
New-IDIApp
# Creates a new App and saves the details encrypted in the users AppData:
## ("C:\Users\%username%\AppData\Local\IntuneDeviceInventory\AppConnection\TenantId.connection")
New-IDIApp -Save
# Creates a new App and saves the details encrypted in the users AppData
# -Force creates a new secret if the app already exists
New-IDIApp -Save -Force
# Lists all aviable/saved connections
Import-IDIAppConnection -All
# Authentication with a saved Azure App
Import-IDIAppConnection -TenantId your.domain.com
# Authentication with a saved Azure App (if you have multiple and want to select)
Import-IDIAppConnection -Select
# Convert existing device notes
ConvertTo-IDINotes -All -PropertyName "purchase date"
# Ge all devices
Get-IDIDevices -All
# Add property
Add-IDIProperty -PropertyName "Monitor"
# Select a device to edit a property
$Device2edit = $IDIDevices_all | Out-GridView -OutputMode Single
# Set device Property
$Device2edit.Monitor = 'Samsung Odyssey G9'
# Update device in Intune with changes
Set-IDIDevice -IDIDevice $Device2edit
# Bulk commands
## Trigger sync for all devices
Invoke-IDIDeviceSync -All
## Trigger reboot for devices in Group "DEV-WIN-Pilot"
Invoke-IDIDeviceRestart -Group "DEV-WIN-Pilot"
## Trigger reboot for devices, selected in GridView
Invoke-IDIDeviceRestart -Grid
## Trigger Defender Signatures update for specific device
Invoke-IDIDeviceDefenderSignatures -deviceName 'dev-w11-1'
Codesprache: Power Shell (powershell)
Good stuff. AAD Extension Attributes? Adding a GUI for that would be awesome!
Thanks for the idea of the extension Attributes.
The GUI will come later this week.
Hi, very nice script. Thank you for sharing!
I was also wondering if by 'custom fields' you mean using AAD extension attributes
(as shown here: https://learningbydoing.cloud/blog/getting-started-with-azuread-extension-attributes/ )
or something else?
If those are attributes, would it be possible to specify data field type (dataType)?
Thanks!
No in this module the notes field of each device is used. Currently there is no support for data data types, all works as stings.
Love this. I love the idea of bulk actions.
Is bulk delete possible?
I'm working on a tenant to tenant migration, and need to delete devices from old tenant after an OS re-install so that it gets picked up in the new tenant.
Thank you!
Thanks for your feedback!
Not yet, so far, I only implement noncritical actions. But will add the more critical ones in an update.
Looks Great however won't show any devices. Wondering if it isn't handling the number of devices, we have in our tenant we have close to 35,000 devices in total.
Hi Ben, wow 35k is a lot. I tested it up to 5k. Those 5k took around 5 minutes to initialize.
Did you try to use the
-verbose
parameter?In addition, I try to implement a progress parameter to show what's happening.
Does the group have to be a specific type of group? When i run (Invoke-IDIDeviceRestart -Group "Test-IPADRebootgroup" -verbose) it shows 2 members found then the next line is "WARNING: No device was found with the specified search criteria." I am not sure what i am missing.
Thank you for this information!
Hi Chris, this can happen if one of the devices is not in Intune anymore. The case the group memberships are checked via the azure AD Devices id which are present for some time after deletion.
Thanks for the quick response, I am able to run the command directly to the device based on the ID and confirmed it worked. The command i am using is (Invoke-IDIDeviceRestart -AzureADDeviceID "*Azure ID of Ipad*".
I am currently working on a powershell script to import a csv of all the IDs but doing it based on group would be much easier.
Thank you,
Hi Floran,m
I was trying to run your powershell scripts (intune-inventory-discovered-apps.ps1 & Get-intune-apps.ps1), it is prompting for Admin consent stating "Unverified" publisher. its stating "Only accespt if you trust he publisher", can you please give me overview of requested permissions to run above scripts?
Regards,
Ravikant
Hi Florian,
Thanks for this handy Powershell Module. I found it easy to use while dealing with some bulk operation within Intune.
However, I could not find relevant function / command to interact with Autopilot machines.
I mean updating a Group Tag for a given Autopilot machine/s.
Thank You
Yes, currently the module only has support for the Intune device objects, not the autopilot object.
But thanks for the idea, I'll check and try to add this in a future release.