Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Notatka
Zastrzeżenie: Scenariusze, przykłady zapytań i dane użyte w tym samouczku są fikcyjne, mogą zawierać błędy, niewydajności i są przeznaczone wyłącznie do celów demonstracyjnych.
Lista tabel związanych z automatyzacją
W poniższej tabeli wymieniono tabele związane z automatyzacją, często używane do raportowania i wglądu.
Display name | Object name | Purpose |
---|---|---|
Dziennik przepływu | flowlog | Zawiera szeroką gamę dzienników, takich jak dzienniki niestandardowe, dzienniki akcji przepływu pulpitu V2, dzienniki kolejek uruchomień maszyn, nienadzorowane żądania/odpowiedzi samonaprawy oraz dzienniki przetwarzania kolejki pracy itp. Dane są przechowywane w tabeli Elastic Dataverse , i w zależności od typu dziennika można je skonfigurować z własnymustawieniem czasu wygaśnięcia (TTL) w tabeli Organizacji ( FlowLogsTtlInMinutes iDesktopFlowQueueLogsTtlInMinutes ), które określa, kiedy rekordy mają być automatycznie usuwane z tabeli. |
Maszyna przepływu | flowmachine | Zawiera informacje związane z maszyną i maszyną hostowaną. |
Grupa maszyn przepływu | flowmachinegroup | Zawiera informacje związane z grupą maszyn i grupą maszyn hostowanych. |
Przebieg przepływu | flowrun | Zawiera dane związane z uruchomieniem przepływu w chmurze, takie jak rozpoczęcie, zakończenie, trwanie, kontekst przepływu nadrzędnego itp. |
Sesja przepływu | flowsession | Zawiera dane związane z uruchomieniem przepływu pulpitu, takie jak rozpoczęcie, trwania, status, maszyna, konto roagenta, kontekst przepływu nadrzędnego itp. |
Proces | workflow | Zawiera przepływy pulpitu i przepływy w chmurze oparte na rozwiązaniach (wraz z innymi typami przepływów pracy). |
Użytkownik | systemuser | Reprezentuje Dataverse użytkownika. |
Kolejka pracy | workqueue | Reprezentuje wystąpienie wykonania przepływu pracy. |
Element kolejki pracy | workqueueitem | Zawiera informacje o każdym uruchomieniu przepływu pracy. |
Uproszczony diagram relacji między tabelami
Na ilustracji przedstawiono tylko odpowiednie relacje między tabelami na potrzeby automatyzacji.
Tworzenie swojej pierwszej aplikacji w Fabric
Wykonaj następujące kroki, aby utworzyć przykładowe zapytanie SQL w analitycznym punkcie końcowym SQL w usłudze Fabric dla contoso_westus_accounts_payable
Lakehouse.
W przeglądarce przejdź do Microsoft Fabric (https://powerbi.com) i zaloguj się przy użyciu swoich poświadczeń.
Wybierz obszar roboczy, w którym znajduje się magazyn lakehouse, a następnie wybierz żądany analityczny punkt końcowy SQL (węzeł podrzędny magazynu lakehouse).
W analitycznym punkcie końcowym SQL wybierz pozycję Nowe zapytanie SQL, aby otworzyć edytor zapytań SQL.
W edytorze zapytań SQL wprowadź zapytanie SQL i wybierz pozycję Uruchom. Poniższe przykładowe zapytanie pobiera wszystkie przebiegi przepływu pulpitu (sesje przepływu) skojarzone z określonym przepływem pulpitu i identyfikatorem komputera, które nie powiodły się w ciągu ostatnich siedmiu dni.
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;
Oto lista dostępnych przyczyn stanu (kod stanu) dla
Flow Sessions
(przebiegi przepływu pulpitu) tabeli.Przyczyna stanu Wartość Wstrzymana 1 Bieganie 2 Oczekiwanie 3 Zakończone pomyślnie 100 Pominięty 5 Zawieszona 6 Anulowane 7 Zakończone niepowodzeniem 8 Zakończono błędem 9 TimedOut 10 Przerwana 11 Zignorowane 12 Przejrzyj wyniki zapytania, aby upewnić się, że spełniają Twoje potrzeby.
(Opcjonalnie) Otwórz zapytanie na żywo z wynikami w programie Excel, zaznaczając zapytanie SQL i wybierając pozycję Otwórz w programie Excel w sekcji danych wyjściowych zapytania. Spowoduje to wygenerowanie i pobranie pliku programu Excel z zapytaniem na żywo do punktu końcowego SQL Analytics w celu dalszej analizy.
(Opcjonalnie) Aby zapisać zapytanie SQL do użycia w przyszłości, kliknij Zapisz zapytanie.
Podstawowe zapytania dotyczące przepływu
Pobieranie przepływów w chmurze z informacjami o właścicielu
To zapytanie zwraca wszystkie przepływy w chmurze wraz z informacjami o właścicielu.
Notatka
W Fabric dostępne są tylko przepływy w chmurze, które są częścią Dataverse rozwiązania.
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)
Pobieranie przepływów pulpitu z informacjami o właścicielu
To zapytanie zwraca wszystkie przepływy pulpitu wraz z informacjami o właścicielu.
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)
Przykład zapytania związanego z wydajnością
To zapytanie pobiera minimalną, średnią, maksymalną i odchylenie standardowe czasów wykonania dla przebiegów przepływów pulpitu (sesji przepływu) określonego przepływu pulpitu, przy czym czasy wykonania są konwertowane z milisekund zaokrąglonych w górę do najbliższej pełnej sekundy. Zapytanie grupuje wyniki według identyfikatorów maszyn i zawiera szczegółowe informacje, takie jak nazwy maszyn, typy zarządzania, maksymalna liczba hostowanych maszyn, pojemność sesji i data ostatniego sygnału z tabel grupy maszyn i maszyn.
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;
Zapytanie związane z pojemnością komputera i licencjonowania
To zapytanie identyfikuje problemy z pojemnością komputera i licencjonowania dla określonego przepływu pulpitu, aby pomóc w optymalizacji alokacji zasobów i rozwiązaniu problemów z ograniczeniami wydajności.
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;
Przykłady zapytań związanych z zarządzaniem dla przepływów pulpitu
Znajdowanie skryptów, które zawierają hasła w postaci zwykłego tekstu w połączeniach
To zapytanie znajduje wszystkie przepływy pulpitu używające parametrów połączenia z bazą danych (OLEDB), które są skonfigurowane do używania hasła w postaci zwykłego tekstu.
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=%');
Potencjalne ryzyko wstrzyknięcia SQL
Zapytanie wykrywa przepływy pulpitu zawierające skrypty potencjalnie podatne na wstrzyknięcie kodu SQL, wyszukując użycie database.executesqlstatement.execute
[brakujący termin] w definicjach przepływów. Rozważmy scenariusz, w którym zamiast bezpośrednio pisać kod SQL w akcji 'Wykonaj instrukcję SQL', skrypt używa zmiennej wejściowej na pulpicie Power Automate (na przykład, %LetsDeleteAllGeneralLedgerEntriesFromDB%) podanej skryptowi w czasie wykonywania.
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%';
Użycie żądania API
To zapytanie pobiera przepływy pulpitu, które korzystają z zaawansowanych metod żądań interfejsu API, takich jak curl
i Invoke-RestMethod
inne requests
, w celu identyfikowania łączności z zewnętrznymi usługami sieci Web lub usługami.
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%'
);
Użycie internetowych punktów końcowych i skrótów URL
To zapytanie wykrywa przepływy pulpitu zawierające skrypty, które odwołują się do skracaczy adresów URL, aby ocenić potencjalne ryzyko użycia ograniczonych adresów 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%'
);
Brakująca obsługa błędów w skryptach
To zapytanie wyszukuje przepływy pulpitu, które nie mają żadnych mechanizmów obsługi błędów, takich jak on block error
lub on error
, w celu zapewnienia niezawodności wykonywania skryptów.
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%');
Przykłady zapytań związanych z zarządzaniem dla dzienników akcji V2
Notatka
Zanim przejdziesz do tej sekcji, upewnij się, że dzienniki przepływu pulpitu w wersji 2 zostały włączone w środowisku i że masz istniejące przebiegi przepływu pulpitu.
Przebiegi przepływu pulpitu z ograniczonym dostępem do adresów URL
To zapytanie znajduje wywołania usługi sieci Web (akcja Wywołaj usługę sieci Web) w określonym przepływie pulpitu w ciągu ostatnich trzech tygodni. Ten wynik jest przydatny do identyfikowania i analizowania potencjalnie podejrzanych punktów końcowych lub ograniczonych wywołań interfejsu API.
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%'
);
Problemy z kodem kryptograficznym
To zapytanie skanuje przepływy pulpitu w poszukiwaniu akcji skryptów PowerShell, które zawierały kod kryptograficzny w ciągu ostatnich siedmiu dni.
-- 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
Przepływ pulpitu z kodem
To zapytanie jest nieco bardziej zaawansowane. Identyfikuje i zlicza odrębne przebiegi przepływu pulpitu (Sesje Flow) z częściami kodu napisanymi w profesjonalnych językach programowania (takimi jak VBScript, PowerShell, JavaScript, .NET lub Python) z ostatnich siedmiu dni, a następnie grupuje wyniki według przepływu pulpitu.
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;
Zapytania związane z błędami i wydajnością dla dzienników akcji w wersji 2
10 najczęstszych akcji przepływu pulpitu, które zakończyły się niepowodzeniem
To zapytanie zwraca 10 akcji najczęściej zakończonych niepowodzeniem według liczby błędów w ciągu ostatnich siedmiu dni.
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 najpopularniejszych kodów błędów z ilością wystąpień
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;