Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Obs
Ansvarsfriskrivning: Scenarierna, frågeexempel och data som används i den här självstudien är fiktiva, kan innehålla fel, ineffektivitet och är endast avsedda för demonstrationssyften.
Lista över automatiseringsrelaterade tabeller
I följande tabell visas automatiseringsrelaterade tabeller som ofta används för rapportering och övervakning.
| Display name | Object name | Purpose |
|---|---|---|
| Flödeslogg | flowlog | Innehåller en mängd olika loggar, till exempel anpassade loggar, åtgärdsloggar för datorflöden V2, maskinkörningsköloggar, obevakade självläkande förfrågningar/svar, och arbetsköbearbetningsloggar etc. Data lagras i en elastisk Dataverse-tabell och beroende på loggtyp, kan konfigureras med sina egna inställningar för Time-to-Live (TTL) i Organisationstabell (FlowLogsTtlInMinutes och DesktopFlowQueueLogsTtlInMinutes), som definierar när poster ska tas bort automatiskt från tabellen. |
| Flödesdator | flowmachine | Innehåller maskin- och information relaterad till värdbaserade datorer. |
| Flödesdatorgrupp | flowmachinegroup | Innehåller maskingrupp- och information relaterad till värdbaserade datorgrupper. |
| Flödeskörning | flowrun | Innehåller körrelaterade molnflödesdata som start, slut, varaktighet, kontext för överordnat flöde osv. |
| Flödessession | flowsession | Innehåller körrelaterade datorflödesdata som start, varaktighet, status, maskin, robotkonto, kontext för överordnat flöde osv. |
| Process | arbetsflöde | Innehåller datorflöde och lösningsbaserade molnflöden (tillsammans med andra arbetsflödestyper). |
| Användare | systemuser | Representerar Dataverse-användaren. |
| Arbetskö | workqueue | Representerar en instans av en arbetsflödeskörning. |
| Arbetsköobjekt | workqueueitem | Innehåller information om varje körning av ett arbetsflöde. |
Förenklat tabellrelationsdiagram
Bilden visar endast relevanta tabellrelationer för automatisering.
Skapa din första fråga i Fabric
Följ dessa steg för att skapa en exempel-SQL-fråga på SQL Analytical Endpoint i Fabric för contoso_westus_accounts_payable sjöhus.
Öppna webbläsaren, gå till Microsoft Fabric-portal (https://powerbi.com) och loggar in med dina autentiseringsuppgifter.
Välj arbetsytan där ditt sjöhus finns och välj önskad SQL Analytical Endpoint (en undernod av ditt sjöhus).
I SQL Analytical Endpoint väljer du ny SQL-fråga för att öppna SQL-frågeredigeraren.
I SQL-frågeredigeraren anger du din SQL-fråga och väljer Kör. Följande exempelfråga hämtar alla datorflödeskörningar (flödessessioner) som är associerade med ett specifikt datorflöde och ett dator-ID som misslyckades under de senaste sju dagarna.
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;Här är en lista med tillgängliga statusorsaker (statuskod) för tabellen
Flow Sessions(datorflödeskörningar).Tillståndorsak Värde Pausat 1 Löpning 2 Väntar 3 Klar 4 Hoppades över 5 Uppehåll 6 Avbrutet 7 Misslyckad 8 Felaktigt 9 TimedOut 10 Avbruten 11 Har ignorerats 12 Granska frågeresultaten och se till att de uppfyller dina behov.
(Valfritt) Öppna en Live-fråga med resultat i Excel genom att markera SQL-frågan och välja öppna i Excel i utdataavsnittet. Detta genererar och laddar ned en Excel-fil med en Live-fråga till SQL Analytics-slutpunkten för ytterligare analys.
(Valfritt) Om du vill lagra SQL-frågan för senare användning väljer du Spara fråga.
Grundläggande flödesfrågor
Hämta molnflöden med deras ägarinformation
Den här frågan returnerar alla molnflöden med ägarinformation.
Obs
Endast molnflöden som är en del av en Dataverse-lösning är tillgängliga i 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)
Hämta datorflöde med ägarinformation
Frågan returnerar alla datorflöde med ägarinformation.
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)
Exempel på prestandarelaterad fråga
Den här frågan hämtar det minsta, medelvärdet (genomsnitt), det maximala värdet och standardavvikelsen för körningar för datorflödeskörningar (flödessessioner) för ett angivet datorflöde och körningarna som konverterats från millisekunder avrundas uppåt till närmaste sekund. Frågan grupperar resultaten efter dator-ID och inkluderar detaljer som maskinnamn, hanteringstyper, maximalt antal värddatorer, sessionskapacitet och senaste pulsslagsdatum från tabellerna Datorgrupp och Dator.
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;
Dator- och licenskapacitetsrelaterad fråga
Den här frågan identifierar dator- och licensrelaterade kapacitetsproblem för ett specifikt datorflöde för att optimera resursallokering och åtgärda prestandabegränsningar.
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;
Exempel på styrningsrelaterade frågor för datorflöden
Söka efter skript som innehåller klartextlösenord i anslutningar
Den här frågan söker efter alla datorflöden som använder anslutningssträngar för databasen (OLEDB) som har konfigurerats att använda ett klartextlösenord.
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=%');
Möjlig risk för SQL-injektion
Frågan identifierar datorflöden som innehåller skript som kan vara känsliga för SQL-injektion genom att söka efter användningen av database.executesqlstatement.execute inom flödesdefinitionerna. Tänk på ett scenario där istället för att direkt skriva SQL-koden i Åtgärden Kör SQL-uttryck, använder skriptet en inmatningsvariabel för Power Automate dator (till exempel %LetsDeleteAllGeneralLedgerEntriesFromDB%) tillhandahålls till skriptet under körning.
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%';
Avancerad användning av API-begäran
Den här frågan hämtar datorflöden som använder avancerade API-begäransmetoder, till exempel curl, Invoke-RestMethod och andra requests, för att identifiera anslutning till externa webbtjänster eller tjänster.
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%'
);
Användning av webbslutpunkter och URL-genvägar
Den här frågan identifierar datorflöde som innehåller skript som refererar till URL-förkortningar för att utvärdera potentiella risker med begränsad URL-användning.
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%'
);
Felhantering saknas i skript
Den här frågan söker efter datorflöden som saknar några felhanteringsmekanismer, såsom på block error eller on error, för att säkerställa robusthet och tillförlitlighet i skriptkörningen.
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%');
Styrningsrelaterade frågeexempel för V2-åtgärdsloggar
Obs
Innan du fortsätter med det här avsnittet bör du kontrollera att datorflödesloggar V2 har aktiverats i miljön och att du har befintliga datorflödekörningar.
Datorflödeskörningar med begränsad URL-åtkomst
Med den här frågan hittas webbtjänstanrop (åtgärden Starta webbtjänst) inom ett specifikt datorflöde under de senaste tre veckorna. Det här resultatet är användbart för att identifiera och analysera potentiellt misstänkta slutpunkter eller begränsade API-samtal.
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%'
);
Datorflödeskörningar med kryptografisk kod
Den här frågan skannar datorflödeskörningar efter PowerShell-skriptåtgärder som inkluderade kryptografisk kod under de senaste sju dagarna.
-- 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
Datorflödeskörningar med användning av professionell kod
Den här frågan är lite mer avancerad. Den identifierar och räknar unika datorflödeskörningar (flödessession) med kodningsdelar (till exempel VBScript, PowerShell, JavaScript, .NET eller Python) från de senaste sju dagarna och grupperar resultaten efter datorflöde.
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;
Fel- och prestandarelaterade frågor för V2-åtgärdsloggar
De tio översta åtgärderna i flödet för datorflöden misslyckas
Den här frågan returnerar de 10 främsta misslyckade åtgärderna efter antal fel under de senaste sju dagarna.
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;
De 10 främsta felkoderna med antal
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;