PageSourceSearch

https://erpl.io/assets/js/1b1968c7.f40ab349.js

js erpl.io collected 2026-09-25 20:05:24 UTC 3,159 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunkerpl_docusaurus=self.webpackChunkerpl_docusaurus||[]).push([[1032],{24714:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>d,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"erpl-web/m365/entra-id","title":"Entra ID (Azure AD)","description":"Query users and sign-in logs from Entra ID via Microsoft Graph and DuckDB.","source":"@site/docs/erpl-web/m365/entra-id.md","sourceDirName":"erpl-web/m365","slug":"/erpl-web/m365/entra-id","permalink":"/docs/erpl-web/m365/entra-id","draft":false,"unlisted":false,"editUrl":"https://github.com/datazoode/erpl-landingpage/tree/main/docs/erpl-web/m365/entra-id.md","tags":[],"version":"current","sidebarPosition":7,"frontMatter":{"sidebar_position":7,"title":"Entra ID (Azure AD)","description":"Query users and sign-in logs from Entra ID via Microsoft Graph and DuckDB.","keywords":["erpl-web","entra id","azure ad","graph","sign-in logs","duckdb"]},"sidebar":"docs","previous":{"title":"Microsoft Planner","permalink":"/docs/erpl-web/m365/planner"},"next":{"title":"Microsoft Dynamics 365","permalink":"/docs/erpl-web/dyn365/"}}');var t=n(74848),i=n(28453);const a={sidebar_position:7,title:"Entra ID (Azure AD)",description:"Query users and sign-in logs from Entra ID via Microsoft Graph and DuckDB.",keywords:["erpl-web","entra id","azure ad","graph","sign-in logs","duckdb"]},o="Entra ID",d={},c=[{value:"Users",id:"users",level:2},{value:"Sign-in logs",id:"sign-in-logs",level:2}];function l(e){const r={code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(r.header,{children:(0,t.jsx)(r.h1,{id:"entra-id",children:"Entra ID"})}),"\n",(0,t.jsx)(r.p,{children:"Microsoft renamed Azure AD to Entra ID; ERPL-Web exposes its directory data through Microsoft Graph."}),"\n",(0,t.jsx)(r.h2,{id:"users",children:"Users"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-sql",children:"SELECT id, displayName, mail, userPrincipalName, department\nFROM graph_users()\nWHERE department = 'Finance';\n"})}),"\n",(0,t.jsx)(r.h2,{id:"sign-in-logs",children:"Sign-in logs"}),"\n",(0,t.jsx)(r.p,{children:"Useful for audit and security analytics:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-sql",children:"SELECT userPrincipalName, ipAddress, status, createdDateTime\nFROM graph_user_signin_logs()\nWHERE createdDateTime > now() - INTERVAL '24 hours'\n  AND status.errorCode != 0;\n"})}),"\n",(0,t.jsx)(r.p,{children:"Both functions support predicate pushdown where the Graph API permits it."})]})}function u(e={}){const{wrapper:r}={...(0,i.R)(),...e.components};return r?(0,t.jsx)(r,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},28453:(e,r,n)=>{n.d(r,{R:()=>a,x:()=>o});var s=n(96540);const t={},i=s.createContext(t);function a(e){const r=s.useContext(i);return s.useMemo(function(){return"function"==typeof e?e(r):{...r,...e}},[r,e])}function o(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),s.createElement(i.Provider,{value:r},e.children)}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.