Scanner multi-ambiente per analizzare e monitorare Copilot Studio Agents in Microsoft Dataverse.
- Autenticazione Service Principal per scansioni automatizzate
- Scansione multi-ambiente con singolo comando
- Report CSV consolidato con tutti gli agent di tutti gli ambienti
- Analisi condivisione tramite PrincipalObjectAccess
- Rilevamento utenti e team con accesso
- Identificazione connettori utilizzati
- Statistiche per ambiente
.\1-Setup.ps1Lo script:
- Autentica interattivamente via browser (richiesto per operazioni PAC admin)
- Salva credenziali Service Principal in file criptato
- Lista tutti gli ambienti Power Platform
- Deploya application user con ruolo System Administrator in ogni ambiente
.\2-Scan-AllEnvironments.ps1Lo script:
- Carica credenziali Service Principal
- Connette ad ogni ambiente automaticamente
- Scansiona tutti gli agent Copilot Studio
- Genera report consolidati in cartella con timestamp
Tutti i report sono salvati in: ConsolidatedReport_YYYYMMDD_HHMMSS/
CSV compatibile Excel con inventario completo agent.
Colonne:
Environment- Nome ambienteEnvironmentId- GUID ambienteEnvironmentURL- URL organization DataverseAgentName- Nome agentAgentId- GUID botState- Stato agent (Active/Inactive)ComponentState- Stato componente (Published/Unpublished/Deleted)Language- Codice lingua agentAccessControlPolicy- Policy accesso (Any/Copilot readers/Group membership)CreatedOn- Data creazioneModifiedOn- Data ultima modificaPublishedOn- Data ultima pubblicazioneSecurityGroupCount- Numero security group assegnatiSharedWithSecurityGroups- Nomi security group (separati da punto e virgola)TotalUsers- Totale utenti con accessoTotalTeams- Totale team con accessoUsersList- Nomi utenti (separati da punto e virgola)TeamsList- Nomi team (separati da punto e virgola)ConnectorsCount- Numero connettori utilizzatiConnectorsList- Nomi connettori (separati da punto e virgola)LastUsed- Data ultimo utilizzoDaysSinceLastUse- Giorni dall'ultimo utilizzoIsShared- "Yes" se condivisoIsOrphaned- "Yes" se non condiviso con nessuno
EnvironmentSummary.csv- Statistiche per ambiente (conteggio agent, condivisi/orfani)DetailedReport.txt- Report testuale leggibileCompleteData.json- Dati completi in formato JSON
- PowerShell 5.1 (Windows PowerShell Desktop edition)
- Power Platform CLI (
pac) - Guida installazione - Azure AD Service Principal con:
- Application (client) ID
- Client secret
- Tenant ID
- Vai su Azure Portal → Azure Active Directory → App registrations
- Click New registration
- Inserisci nome (es. "Copilot Agent Scanner")
- Click Register
- Annota Application (client) ID e Tenant ID
- Vai su Certificates & secrets → New client secret
- Annota il client secret value (copialo immediatamente, non sarà più mostrato)
Imposta variabili ambiente con credenziali Service Principal:
# Imposta variabili ambiente (PowerShell)
$env:PP_APP_ID = "your-application-id-here"
$env:PP_CLIENT_SECRET = "your-client-secret-here"
$env:PP_TENANT_ID = "your-tenant-id-here"Nota: Queste sono variabili di sessione temporanee. Per renderle permanenti:
- Windows: Usa System Properties → Environment Variables
- PowerShell Profile: Aggiungi i comandi al tuo script
$PROFILE
.\1-Setup.ps1Lo script deploierà application user in tutti gli ambienti automaticamente.
┌─────────────────────────┐
│ 1-Setup.ps1 │
│ - Auth interattiva │
│ - Salva credenziali SP│
│ - Deploy app users │
└───────────┬─────────────┘
│ Crea sp-credentials.xml
↓
┌─────────────────────────┐
│ 2-Scan-AllEnvironments │
│ .ps1 │
│ - Carica credenziali │
│ - Scansiona ambienti │
│ - Genera report │
└───────────┬─────────────┘
│
↓
┌─────────────────────────┐
│ ConsolidatedReport_*/ │
│ - AllEnvironments_ │
│ Agents.csv │
│ - EnvironmentSummary │
│ .csv │
│ - JSON & TXT reports │
└─────────────────────────┘
Gli agent Copilot Studio NON usano:
appmoduleroles(come le Model-Driven Apps)- Security roles Bot/Copilot (sempre a 0 assignments)
La condivisione avviene tramite:
- PrincipalObjectAccess: tabella generica per condivisione oggetti
- Team auto-generati: pattern nome
{botid}_1 - teammembership: link team → utenti
- 0 = Any
- 1 = Copilot readers
- 2 = Group membership (usa
authorizedsecuritygroupids) - 3 = Any multi-tenant
I connettori sono identificati tramite:
- Analisi
botcomponent.data(componenti dell'agent) - Match con
connectionreference(tabella riferimenti connettori) - Estrazione tipo da logical name per connettori inline
Formato output:
Dataverse(connectionreference standard)github (inline)(connettore inline non pubblicato)
Se il browser non si apre durante pac auth create, usa device code flow:
pac auth create --deviceCodeQuesto mostra un codice da inserire manualmente in un browser (anche su altro dispositivo).
Vedi TROUBLESHOOTING.md per soluzioni dettagliate.
- L'application user deve esistere nell'ambiente
- L'application user deve avere ruolo System Administrator
- Assicurati che l'ambiente abbia un database Dataverse provisionato
Esegui .\1-Setup.ps1 prima per creare il file credenziali.
Installa Power Platform CLI:
# Usando dotnet tool
dotnet tool install --global Microsoft.PowerApps.CLI.Tool
# Oppure scarica installer da:
# https://aka.ms/PowerAppsCLIUsa PowerShell 5.1 Desktop, non PowerShell 7/Core.
Verifica che il Service Principal abbia ruolo System Administrator.
- Credenziali in
sp-credentials.xmlsono criptate usando Windows DPAPI - Credenziali criptate sono specifiche per macchina e utente
- Mai committare
sp-credentials.xmlin version control (già in.gitignore) - Service Principal ha accesso solo agli ambienti dove application user è deployato
-
Setup (
1-Setup.ps1):- Usa autenticazione interattiva per operazioni PAC admin
- Salva credenziali Service Principal per scanner
-
Scansione (
2-Scan-AllEnvironments.ps1):- Usa autenticazione Service Principal per connettersi a Dataverse
- Nessuna interazione utente richiesta
- Usa FetchXML queries via modulo
Microsoft.Xrm.Data.PowerShell - Query su entità bot (Copilot Studio Agents)
- Estrae condivisione da
PrincipalObjectAccess - Mappa principalid a team e utenti
- Estrae metadata: date creazione, modifica, pubblicazione, lingua, stato componente
Pattern corretto:
$result = Get-CrmRecordsByFetch -conn $conn -Fetch $fetchXml
$records = $result.CrmRecords # Array di recordNON iterare su $result.Keys (errore comune).
- Scansioni sequenziali per ambiente
- Tempo tipico: 5-15 secondi per ambiente
- Generazione output: < 1 secondo
- Cache connectionreference per ambiente per ridurre query
Questo tool è utile per governance e auditing di ambienti Power Platform su scala, permettendo di:
- Inventariare tutti gli agent Copilot Studio in tutti gli ambienti
- Identificare agent orfani (non condivisi con nessuno)
- Analizzare gruppi di sicurezza e accesso utenti per ogni agent
- Ottenere statistiche aggregate per ambiente
- Monitorare utilizzo agent nel tempo
- Identificare agent inattivi o inutilizzati
- Tracciare ciclo vita agent (date creazione, modifica, pubblicazione)
- Verificare conformità assicurando assegnazioni corrette
Marco Zamana
Uso interno