Defender XDR with PowerShell 7: Advanced Hunting from the Command Line
I have worked in IT for about 20 years. A lot of that was MSP operations. Today I work as an M365 cloud admin. I kept writing the same scripts. So I cleaned them up and shared them on GitHub. This toolkit is for Microso
I have worked in IT for about 20 years. A lot of that was MSP operations. Today I work as an M365 cloud admin.
I kept writing the same scripts. So I cleaned them up and shared them on GitHub. This toolkit is for Microsoft Defender XDR. It uses PowerShell 7 and the Microsoft Graph security API, including runHuntingQuery.
Repo: defender-xdr-powershell-toolkit
The problem it solves
The Defender portal is great for one incident. It is less great for reports, trends or running the same hunt every week.
You also want to know which devices are not onboarded to Defender for Endpoint. Gaps there are blind spots.
These scripts pull that data to CSV so you can track it.
Highlight scripts
Invoke-AdvancedHuntingQuery.ps1
Runs an advanced hunting KQL query and exports the results. The repo has a small KQL library, like encoded PowerShell, password spray and new forwarding rules.
./Invoke-AdvancedHuntingQuery.ps1 -QueryFile ../../hunting/queries/encoded-powershell.kql
./Invoke-AdvancedHuntingQuery.ps1 -Query 'DeviceInfo | summarize count() by OSPlatform' -PassThru
Get-MDEOnboardingStatus.ps1
Compares Intune Windows devices with Defender for Endpoint. It shows devices that are not onboarded.
./Get-MDEOnboardingStatus.ps1
Get-DefenderIncidentReport.ps1
Exports incidents with alert counts for a time window.
./Get-DefenderIncidentReport.ps1 -Days 30
Other scripts cover alert reports, device risk, Secure Score and setting incident status. Sample KQL is a starting point, so tune it first.
How the scripts are built
- PowerShell 7.4 or later.
- Comment-based help on every script. Run
Get-Help ./script.ps1 -Full. - Reports export to CSV.
- Change scripts support
-WhatIfand-Confirm. - Certificate (app-only) or interactive sign-in.
- No secrets in the repo. Examples use
contoso.comand placeholder GUIDs.
Please test in a dev or test tenant first. Read each script before you run it.
My usual workflow
I start with the reports. They are read-only and safe. I open the CSV in Excel and look for anything odd.
Then I pick one fix. I run the change script with -WhatIf and read the output. If it looks right, I run it again for real.
For jobs I repeat, I use a certificate and schedule the script. That way nobody has to remember to run it.
Getting started
Clone the repo:
git clone https://github.com/anthonybuhnerkemper/defender-xdr-powershell-toolkit.git
cd defender-xdr-powershell-toolkit
Every toolkit ships the same Connect-M365Admin script. Dot-source it, then connect.
# Interactive sign-in
. ./scripts/Connect/Connect-M365Admin.ps1
Connect-M365Admin -Service Graph -Interactive -ClientId 00000000-0000-0000-0000-000000000000
# Or app-only with a certificate
$env:M365_TENANT_ID = '00000000-0000-0000-0000-000000000000'
$env:M365_CLIENT_ID = '00000000-0000-0000-0000-000000000000'
$env:M365_CERT_THUMBPRINT = '0000000000000000000000000000000000000000'
Connect-M365Admin -Service Graph
Run a report, check the CSV, then call Disconnect-M365Admin when you are done. The README lists the modules and roles each script needs.
More toolkits
I have nine more free toolkits that use the same pattern: graph-powershell7-admin-toolkit, entra-id-powershell-toolkit, exchange-online-powershell-toolkit, sharepoint-online-powershell-toolkit, onedrive-powershell-toolkit, teams-powershell-toolkit, intune-powershell-toolkit, sentinel-kql-toolkit, purview-compliance-toolkit.
You can find them all on my GitHub profile.
Feedback welcome
Issues, ideas and pull requests are welcome. What would you add? Tell me in the comments.
Originally published by Dev.to Security. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.