Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Note
Exclusion : les scénarios, les exemples de requête et les données utilisés dans ce didacticiel sont fictifs, peuvent contenir des erreurs et des inefficiences et sont destinés exclusivement à des fins de démonstration.
Liste des tables associées à l’automatisation
Le tableau suivant répertorie les tables liées à l’automatisation fréquemment utilisées pour la création de rapports et l’observabilité.
Display name | Object name | Finalité |
---|---|---|
Journal de flux | flowlog | Contient une grande variété de journaux, tels que les journaux personnalisés, les journaux d’action de flux de bureau V2, les journaux de file d’attente d’exécution de la machine, les demandes/réponses d’auto-réparation sans surveillance, les journaux de traitement de la file d’attente de travail, etc. Les données sont stockées dans une table élastique Dataverse et, selon le type de journal, peuvent être configurées avec leur propre paramètre de durée de vie (TTL) dans la table Organisation (FlowLogsTtlInMinutes et DesktopFlowQueueLogsTtlInMinutes), qui définit quand les enregistrements doivent être automatiquement supprimés de la table. |
Machine de flux | flowmachine | Contient des informations relatives à la machine et à la machine hébergée. |
Groupe de machines de flux | flowmachinegroup | Contient des informations relatives au groupe de machines et au groupe de machines hébergées. |
Flux d’exécution | flowrun | Contient des données relatives à l’exécution de flux de cloud, telles que le début, la fin, la durée, le contexte du flux parent, etc. |
Session de flux | flowsession | Contient des données relatives à l’exécution de flux de bureau, telles que le début, les durées, le statut, la machine, le compte de robot, le contexte du flux parent, etc. |
Process | workflow | Contient des flux de bureau et des flux de cloud basés sur des solutions (ainsi que d’autres types de workflow). |
User | systemuser | Représente l’utilisateur Dataverse. |
File d’attente de travail | workqueue | Représente une instance de l’exécution d’un workflow. |
Élément de la file d’attente de travail | workqueueitem | Contient des informations sur chaque exécution d’un workflow. |
Diagramme simplifié des relations de table
L’image montre uniquement les relations de table pertinentes pour l’automatisation.
Créer votre première requête dans Fabric
Suivez ces étapes pour créer un exemple de requête SQL sur le point de terminaison analytique SQL dans Fabric pour la lakehouse contoso_westus_accounts_payable
.
Ouvrez votre navigateur web, accédez au portail Microsoft Fabric (https://powerbi.com) et connectez-vous avec vos informations d’identification.
Sélectionnez l’espace de travail où se trouve votre lakehouse, puis sélectionnez le point de terminaison analytique SQL souhaité (un sous-nœud de votre lakehouse).
Dans le point de terminaison analytique SQL, sélectionnez Nouvelle requête SQL pour ouvrir l’éditeur de requête SQL.
Dans l’éditeur de requête SQL, entrez votre requête SQL et sélectionnez Exécuter. L’exemple de requête suivant récupère toutes les exécutions de flux de bureau (sessions de flux) associées à un flux de bureau spécifique et à un ID de machine qui a échoué au cours des sept derniers jours.
SELECT flowsessionid, statuscode, startedon, completedon, errorcode, errormessage, sessionusername, runexecutionduration, runduration, runwaitduration, context FROM flowsession WHERE regardingobjectid = '[specific_flow_id]' -- Replace with the actual flow ID AND machineid = '[specific_machine_guid]' -- Replace with the actual machine ID AND statuscode = 8 -- 'Failed' sessions AND createdon >= DATEADD(day, -7, GETDATE()) ORDER BY createdon DESC;
Voici une liste des raisons de statut disponibles (statuscode) pour la table
Flow Sessions
(exécutions de flux de bureau).Raison du statut active Suspendu 1 Exécution en cours 2 En attente 3 Succès 4 Ignorée 5 Suspendu 6 Annulé 7 Échoué 8 Erreur 9 TimedOut 10 Abandonnée 11 Ignoré 12 Examinez les résultats de la requête pour vous assurer qu’ils répondent à vos besoins.
(Facultatif) Ouvrez une requête en direct avec les résultats dans Excel en mettant en surbrillance la requête SQL et en sélectionnant Ouvrir dans Excel dans la section de sortie de la requête. Cela génère et télécharge un fichier Excel avec une requête en direct sur le point de terminaison SQL Analytics pour une analyse plus approfondie.
(Facultatif) Pour stocker la requête SQL en vue d’une utilisation ultérieure, sélectionnez Enregistrer la requête.
Requêtes de flux de base
Récupérer les flux de cloud avec leurs informations de propriétaire
Cette requête renvoie tous les flux de cloud avec leurs informations de propriétaire.
Nonte
Seuls les flux de cloud faisant partie d’une solution Dataverse sont disponibles dans Fabric.
SELECT
w.name AS 'Cloud flow',
w.workflowid AS 'Cloud flow Id',
w.createdon AS 'Created on',
w.modifiedon AS 'Last modified on',
w.clientdata AS 'Script',
w.ownerid AS 'Owner Id',
s.fullname AS 'Owner name',
s.internalemailaddress AS 'Owner email'
FROM
workflow w
JOIN
systemuser s ON w.ownerid = s.systemuserid
WHERE
w.category = 5; -- Only consider solution-cloud flows (category 5)
Récupérer les flux de bureau avec leurs informations de propriétaire
Cette requête renvoie tous les flux de bureau avec leurs informations de propriétaire.
SELECT
w.name AS 'Desktop flow',
w.workflowid AS 'Desktop flow Id',
w.createdon AS 'Created on',
w.modifiedon AS 'Last modified on',
w.definition AS 'Script',
w.ownerid AS 'Owner Id',
s.fullname AS 'Owner name',
s.internalemailaddress AS 'Owner email'
FROM
workflow w
JOIN
systemuser s ON w.ownerid = s.systemuserid
WHERE
w.category = 6; -- Only consider desktop flows (category 6)
Exemple de requête liée aux performances
Cette requête récupère l’écart minimal, moyen, maximal et standard des temps d’exécution pour les exécutions de flux de bureau (sessions de flux) d’un flux de bureau spécifié, les temps d'exécution étant convertis de millisecondes arrondis à la seconde entière la plus proche. La requête regroupe les résultats par ID de machine et inclut des détails tels que les noms des machines, les types de gestion, le nombre maximal de machines hébergées, la capacité de la session et la date de la dernière activité des tables Groupe de machines et Machines.
SELECT
f.machineid,
fm.name AS machine_name,
CASE
WHEN mg.managementtype = 0 THEN 'Regular Machine (Group)'
ELSE 'Hosted Machine (Group)'
END AS managementtype,
mg.maxmanagedmachinecount AS maxmanagedmachinecount,
fm.lastheartbeatdate AS last_heartbeat_date,
fm.sessioncapacity AS 'Max Parallel Sessions',
CEILING(MIN(f.runduration) / 1000.0) AS min_runtime,
CEILING(AVG(f.runduration) / 1000.0) AS mean_runtime,
CEILING(MAX(f.runduration) / 1000.0) AS max_runtime,
CEILING(STDEV(f.runduration) / 1000.0) AS stdev_runtime
FROM
flowsession f
JOIN
flowmachinegroup mg ON f.machinegroupid = mg.flowmachinegroupid
JOIN
flowmachine fm ON f.machinegroupid = fm.flowmachinegroupid
WHERE
f.regardingobjectid = '[specific_flow_id]' -- Replace with the actual flow ID
GROUP BY
f.machineid, fm.name, mg.managementtype, mg.maxmanagedmachinecount, fm.lastheartbeatdate, fm.sessioncapacity
ORDER BY
mean_runtime DESC;
Requête liée à la capacité de machine et de licence
Cette requête identifie les problèmes de capacité liés à la machine et aux licences pour un flux de bureau spécifique afin d’optimiser l’allocation des ressources et de résoudre les contraintes de performances.
SELECT
f.machineid,
fm.name AS machine_name,
CASE
WHEN mg.managementtype = 0 THEN 'Regular Machine (Group)'
ELSE 'Hosted Machine (Group)'
END AS managementtype,
mg.maxmanagedmachinecount AS maxmanagedmachinecount,
fm.lastheartbeatdate AS last_heartbeat_date,
fm.sessioncapacity AS 'Max Parallel Sessions',
fm.overcapacitysince,
CASE
WHEN fm.overcapacitysince IS NOT NULL THEN 'Over Capacity'
ELSE 'Within Capacity'
END AS capacity_status
FROM
flowsession f
JOIN
flowmachinegroup mg ON f.machinegroupid = mg.flowmachinegroupid
JOIN
flowmachine fm ON f.machinegroupid = fm.flowmachinegroupid
WHERE
f.regardingobjectid = '[specific_flow_id]' -- Replace with the actual flow ID
GROUP BY
f.machineid, fm.name, mg.managementtype, mg.maxmanagedmachinecount, fm.lastheartbeatdate, fm.sessioncapacity, fm.overcapacitysince
ORDER BY
capacity_status DESC, fm.lastheartbeatdate DESC;
Exemples de requêtes liées à la gouvernance pour les flux de bureau
Rechercher des scripts qui incluent des mots de passe en texte brut dans les connexions
Cette requête recherche tous les flux de bureau qui utilisent des chaînes de connexion de base de données (OLEDB) configurées pour utiliser un mot de passe en texte brut.
SELECT
w.name AS 'Desktop flow',
w.workflowid AS 'Desktop flow Id',
w.createdon AS 'Created on',
w.modifiedon AS 'Last modified on',
w.definition AS 'Script',
w.ownerid AS 'Owner Id',
s.fullname AS 'Owner name',
s.internalemailaddress AS 'Owner email'
FROM
workflow w
JOIN
systemuser s ON w.ownerid = s.systemuserid
WHERE
w.category = 6
AND w.definition IS NOT NULL
AND (LOWER(w.definition) LIKE '%;password=%');
Risque potentiel d’injection SQL
La requête détecte les flux de bureau contenant des scripts potentiellement vulnérables pour l’injection SQL en recherchant l’utilisation de database.executesqlstatement.execute
dans les définitions de flux. Prenons un scénario où, au lieu d’écrire directement le code SQL dans l’action Exécuter l’instruction SQL, le script utilise une variable d'entrée Power Automate bureau (par exemple, %LetsDeleteAllGeneralLedgerEntriesFromDB%) fournie au script pendant l’exécution.
SELECT
w.name AS 'Desktop flow',
w.workflowid AS 'Desktop flow Id',
w.createdon AS 'Created on',
w.modifiedon AS 'Last modified on',
w.definition AS 'Script',
w.ownerid AS 'Owner Id',
s.fullname AS 'Owner name',
s.internalemailaddress AS 'Owner email'
FROM
workflow w
JOIN
systemuser s ON w.ownerid = s.systemuserid
WHERE
w.category = 6
AND w.definition IS NOT NULL
AND LOWER(w.definition) LIKE '%database.executesqlstatement.execute%';
Utilisation de requête d’API avancée
Cette requête récupère les flux de bureau qui utilisent des méthodes de requête d’API avancées, telles que curl
, Invoke-RestMethod
et d’autres requests
pour identifier la connectivité à des services ou des services web externes.
SELECT
w.name AS 'Desktop flow',
w.workflowid AS 'Desktop flow Id',
w.createdon AS 'Created on',
w.modifiedon AS 'Last modified on',
w.definition AS 'Script',
w.ownerid AS 'Owner Id',
s.fullname AS 'Owner name',
s.internalemailaddress AS 'Owner email'
FROM
workflow w
JOIN
systemuser s ON w.ownerid = s.systemuserid
WHERE
w.category = 6
AND w.definition IS NOT NULL
AND (
LOWER(w.definition) LIKE '%curl%' OR
LOWER(w.definition) LIKE '%invoke-restmethod%' OR
LOWER(w.definition) LIKE '%invoke-webrequest%' OR
LOWER(w.definition) LIKE '%httpclient%' OR
LOWER(w.definition) LIKE '%requests.get%' OR
LOWER(w.definition) LIKE '%requests.post%' OR
LOWER(w.definition) LIKE '%fetch%' OR
LOWER(w.definition) LIKE '%axios%' OR
LOWER(w.definition) LIKE '%.ajax%'
);
Utilisation des points de terminaison Web et des raccourcis d’URL
Cette requête détecte les flux de bureau contenant des scripts qui référencent des raccourcisseurs d’URL pour évaluer les risques potentiels d’utilisation restreinte des URL.
SELECT
w.name AS 'Desktop flow',
w.workflowid AS 'Desktop flow Id',
w.createdon AS 'Created on',
w.modifiedon AS 'Last modified on',
w.definition AS 'Script',
w.ownerid AS 'Owner Id',
s.fullname AS 'Owner name',
s.internalemailaddress AS 'Owner email'
FROM
workflow w
JOIN
systemuser s ON w.ownerid = s.systemuserid
WHERE
w.category = 6
AND w.definition IS NOT NULL
AND (
LOWER(w.definition) LIKE '%bit.ly%' OR
LOWER(w.definition) LIKE '%linkedin.com%' OR
LOWER(w.definition) LIKE '%aka.ms%' OR
LOWER(w.definition) LIKE '%tinyurl.com%' OR
LOWER(w.definition) LIKE '%goo.gl%' OR
LOWER(w.definition) LIKE '%t.co%' OR
LOWER(w.definition) LIKE '%fb.me%' OR
LOWER(w.definition) LIKE '%is.gd%' OR
LOWER(w.definition) LIKE '%buff.ly%'
);
Absence de gestion des erreurs dans les scripts
Cette requête recherche des flux de bureau qui ne disposent pas de mécanismes de gestion des erreurs, par exemple block error
ou on error
, afin de garantir la robustesse et la fiabilité de l’exécution des scripts.
SELECT
w.name AS 'Desktop flow',
w.workflowid AS 'Desktop flow Id',
w.createdon AS 'Created on',
w.modifiedon AS 'Last modified on',
w.definition AS 'Script',
w.ownerid AS 'Owner Id',
s.fullname AS 'Owner name',
s.internalemailaddress AS 'Owner email'
FROM
workflow w
JOIN
systemuser s ON w.ownerid = s.systemuserid
WHERE
w.category = 6
AND w.definition IS NOT NULL
AND NOT (LOWER(w.definition) LIKE '%on block error%' OR LOWER(w.definition) LIKE '%on error%');
Exemples de requêtes liées à la gouvernance pour les journaux d’actions V2
Nonte
Avant de continuer avec cette section, assurez-vous que les Journaux de flux de bureau V2 ont été activés dans votre environnement et que vous avez des exécutions de flux de bureau existantes.
Exécutions de flux de bureau avec un accès restreint aux URL
Cette requête recherche les appels de service web (action Appeler le service web) dans un flux de bureau spécifique au cours des trois dernières semaines. Ce résultat est utile pour identifier et analyser les points de terminaison potentiellement suspects ou les appels d’API restreints.
SELECT
JSON_VALUE(f.data, '$.name') AS ActionName,
f.data AS 'Action log',
f.parentobjectid AS 'Parent object id',
f.createdon AS 'Log created on',
w.name AS 'Desktop flow',
w.workflowid AS 'Desktop flow Id',
w.createdon AS 'Created on',
w.modifiedon AS 'Last modified on',
w.definition AS 'Script',
w.ownerid AS 'Owner Id',
s.fullname AS 'Owner name',
s.internalemailaddress AS 'Owner email'
FROM
[flowlog] f
JOIN flowsession fs ON f.parentobjectid = fs.flowsessionid
JOIN workflow w ON fs.regardingobjectid = w.workflowid
JOIN systemuser s ON w.ownerid = s.systemuserid
WHERE
w.workflowid = '[specific_flow_id]' -- Replace with the actual flow ID
AND f.createdon >= DATEADD(day, -21, GETDATE())
AND JSON_VALUE(f.data, '$.name') = 'Invoke web service'
AND (
f.data LIKE '%contoso-default.crm.dynamics.com/api%'
OR f.data LIKE '%api.second-restricted-url.net%'
OR f.data LIKE '%api.third-restricted-url.de%'
OR f.data LIKE '%api.phishing-example.com%'
);
Exécutions de flux de bureau avec code cryptographique
Cette requête analyse les exécutions de flux de bureau à la recherche d’actions de script PowerShell qui comprenaient du code cryptographique au cours des sept derniers jours.
-- Queries actions logs named 'Run PowerShell script' that contain code that that uses cryptographic libraries
-- and terms such as "AES", "RSA", "encryption", or "decryption," which may indicate risky operations
SELECT top(1)
JSON_VALUE(data, '$.name') AS ActionName,
JSON_VALUE(data, '$.inputs') AS Inputs,
JSON_VALUE(data, '$.outputs') AS Outputs
FROM
[flowlog]
WHERE
JSON_VALUE(data, '$.name') = 'Run PowerShell script'
AND createdon >= DATEADD(day, -7, GETDATE())
AND (
JSON_VALUE(data, '$.inputs') LIKE '%AES%'
OR JSON_VALUE(data, '$.inputs') LIKE '%RSA%'
OR JSON_VALUE(data, '$.inputs') LIKE '%encryption%'
OR JSON_VALUE(data, '$.inputs') LIKE '%decryption%'
)
ORDER BY
ActionName
Exécutions de flux de bureau avec utilisation de pro-code
Cette requête est un peu plus avancée. Il identifie et comptabilise les exécutions de flux de bureau distinctes (sessions de flux) avec des parties de codage professionnel (telles que VBScript, PowerShell, JavaScript, .NET ou Python) au cours des sept derniers jours, et regroupe les résultats par flux de bureau.
WITH ProCodingSessions AS (
SELECT
fs.flowsessionid,
f.data AS 'Action log',
f.parentobjectid AS 'Parent object id',
f.createdon AS 'Log created on',
w.name AS 'Desktop flow',
w.workflowid AS 'Desktop flow Id',
w.createdon AS 'Created on',
w.modifiedon AS 'Last modified on',
w.definition AS 'Script',
w.ownerid AS 'Owner Id',
s.fullname AS 'Owner name',
s.internalemailaddress AS 'Owner email'
FROM [flowlog] f
JOIN flowsession fs ON f.parentobjectid = fs.flowsessionid
JOIN workflow w ON fs.regardingobjectid = w.workflowid
JOIN systemuser s ON w.ownerid = s.systemuserid
WHERE f.createdon >= DATEADD(day, -7, GETDATE())
AND (
LOWER(w.definition) LIKE '%runvbscript%' OR
LOWER(w.definition) LIKE '%runpowershellscript%' OR
LOWER(w.definition) LIKE '%runjavascript%' OR
LOWER(w.definition) LIKE '%rundotnetscript%' OR
LOWER(w.definition) LIKE '%runpythonscript%'
)
),
FlowCounts AS (
SELECT
p.[Desktop flow],
p.[Desktop flow Id],
p.[Created on],
p.[Last modified on],
p.[Script],
p.[Owner Id],
p.[Owner name],
p.[Owner email],
COUNT(DISTINCT p.flowsessionid) AS ProCodingSessionCount
FROM ProCodingSessions p
GROUP BY
p.[Desktop flow],
p.[Desktop flow Id],
p.[Created on],
p.[Last modified on],
p.[Script],
p.[Owner Id],
p.[Owner name],
p.[Owner email]
)
SELECT
f.[Desktop flow],
f.[Desktop flow Id],
f.[Created on],
f.[Last modified on],
f.[Script],
f.[Owner Id],
f.[Owner name],
f.[Owner email],
f.ProCodingSessionCount AS 'Runs with pro-code'
FROM FlowCounts f
ORDER BY f.ProCodingSessionCount DESC;
Requêtes liées aux erreurs et aux performances pour les journaux d’actions V2
Top 10 des actions de flux de bureau défaillantes
Cette requête renvoie les 10 actions ayant échoué le plus en fonction du nombre d’erreurs au cours des sept derniers jours.
SELECT TOP(10)
JSON_VALUE(data, '$.name') AS ActionName,
SUM(CASE WHEN JSON_VALUE(data, '$.status') = 'Failed' THEN 1 ELSE 0 END) AS ErrorCount
FROM [flowlog]
WHERE createdon >= DATEADD(day, -7, GETDATE())
GROUP BY JSON_VALUE(data, '$.name')
HAVING SUM(CASE WHEN JSON_VALUE(data, '$.status') = 'Failed' THEN 1 ELSE 0 END) > 0
ORDER BY ErrorCount DESC;
10 principaux codes d’erreur avec le nombre
SELECT TOP(10)
JSON_VALUE(data, '$.errorCode') AS ErrorCode,
COUNT(*) AS OccurrenceCount
FROM [flowlog]
WHERE createdon >= DATEADD(day, -7, GETDATE())
AND JSON_VALUE(data, '$.status') = 'Failed'
GROUP BY JSON_VALUE(data, '$.errorCode')
ORDER BY OccurrenceCount DESC;