Obtener datos: Active Directory

Un usuario Pregunto ✅

Brian_M

Hola,

Estoy intentando consultar el directorio activo como fuente de datos. Solo tengo Azure AD con mi «company1.onmicrosoft.com» automático y mi dominio personalizado «company1.uk»

Estoy usando el siguiente «Obtener datos»

  1. Obtener datos> Active Directory

Intenté ingresar ambos dominios y ninguno parece ser reconocido «dominio no reconocido»

No se puede conectar: ​​encontramos un error al intentar conectarnos. Detalles: «Active Directory: no se pudo encontrar el dominio de Active Directory ‘empresa1.uk'».

Mis preguntas son:

1. ¿Puedo consultar Azure Active Directory con Power BI?

2. ¿Cómo debo ingresar correctamente a mi dominio de directorio activo?

3. ¿Qué credencial debo utilizar? ¿Será la cuenta de Microsoft utilizada en el Portal de Azure (a diferencia de mi cuenta de trabajo de O365)?

Muchas gracias por su ayuda

Greg_Deckler

Probaría la API gráfica: https://msdn.microsoft.com/en-us/library/azure/ad/graph/api/api-catalog

Brian_M

Siguiendo el ejemplo de @ Greg_Deckler, busqué y encontré una publicación que resolví un problema de copiar y pegar, además de crear una función adicional y parametrizar el lote para tratar de salvar a la gente futura en algún momento.

Lo vincularé a la publicación que me llevó a esta solución. Gracias a @curth por la solución y a @Evogelpohl por la pregunta original.

Mi primera función llama a los usuarios de mi dominio con MyDomain como parámetro de entrada; le pedirá sus credenciales de Azure AD (NB: mi cuenta de trabajo funcionó para mí ya que tengo derechos de administrador, no necesitaba usar las credenciales de administrador de Azure Portal o Cualquier cosa como eso)

(MyDomain as text) =>

let

    Source = Json.Document(Web.Contents("https://graph.windows.net/" & MyDomain & "/users?api-version=1.6")),
    value = Source[value],
    ConvertedtoTable = Table.FromList(value, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    ExpandedColumn1 = Table.ExpandRecordColumn(ConvertedtoTable, "Column1", {"userPrincipalName", "userType"}),
    GetUserDetails = Table.AddColumn(ExpandedColumn1, "UserDetails", each if [userType] = "Member" then try fnGetUserDetails([userPrincipalName],MyDomain) otherwise null else null),
    ExpandUserDetails = Table.ExpandTableColumn(GetUserDetails, "UserDetails", {"City", "Country", "Department", "Name", "Email", "Postal Code", "State", "Street Address"}, {"Custom.City", "Custom.Country", "Custom.Department", "Custom.Name", "Custom.Email", "Custom.Postal Code", "Custom.State", "Custom.Street Address"})
in

    ExpandUserDetails

Mi primera función llama a una segunda función fnGetUserDetails que toma el userPrincipalName para todos los usuarios de tipo ‘Miembro’ (y no invitado) y devuelve los detalles del usuario. FnGetUserDetails es el siguiente:

let

  FNLookupAD = (EmailAddress as text,MyDomain as text) =>

    let

      Source = Json.Document(Web.Contents("https://graph.windows.net/" & MyDomain & "/users?api-version=1.5", [
      Query = [#"$filter"="proxyAddresses/any(c:c eq 'smtp:" & EmailAddress & "')"]])),
      value = Source[value],
    #"Converted to Table" = Table.FromList(value, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"Expanded Column1" = Table.ExpandRecordColumn(#"Converted to Table", "Column1", {"odata.type", "objectType", "objectId", "deletionTimestamp", "accountEnabled", "assignedLicenses", "assignedPlans", "city", "companyName", "country", "creationType", "department", "dirSyncEnabled", "displayName", "facsimileTelephoneNumber", "givenName", "immutableId", "jobTitle", "lastDirSyncTime", "mail", "mailNickname", "mobile", "onPremisesSecurityIdentifier", "otherMails", "passwordPolicies", "passwordProfile", "physicalDeliveryOfficeName", "postalCode", "preferredLanguage", "provisionedPlans", "provisioningErrors", "proxyAddresses", "sipProxyAddress", "state", "streetAddress", "surname", "telephoneNumber", "thumbnailPhoto@odata.mediaContentType", "usageLocation", "userPrincipalName", "userType"}, {"Column1.odata.type", "Column1.objectType", "Column1.objectId", "Column1.deletionTimestamp", "Column1.accountEnabled", "Column1.assignedLicenses", "Column1.assignedPlans", "Column1.city", "Column1.companyName", "Column1.country", "Column1.creationType", "Column1.department", "Column1.dirSyncEnabled", "Column1.displayName", "Column1.facsimileTelephoneNumber", "Column1.givenName", "Column1.immutableId", "Column1.jobTitle", "Column1.lastDirSyncTime", "Column1.mail", "Column1.mailNickname", "Column1.mobile", "Column1.onPremisesSecurityIdentifier", "Column1.otherMails", "Column1.passwordPolicies", "Column1.passwordProfile", "Column1.physicalDeliveryOfficeName", "Column1.postalCode", "Column1.preferredLanguage", "Column1.provisionedPlans", "Column1.provisioningErrors", "Column1.proxyAddresses", "Column1.sipProxyAddress", "Column1.state", "Column1.streetAddress", "Column1.surname", "Column1.telephoneNumber", "Column1.thumbnailPhoto@odata.mediaContentType", "Column1.usageLocation", "Column1.userPrincipalName", "Column1.userType"}),
    #"Removed Columns" = Table.RemoveColumns(#"Expanded Column1",{"Column1.odata.type", "Column1.objectType", "Column1.objectId", "Column1.deletionTimestamp"}),
    #"Renamed Columns" = Table.RenameColumns(#"Removed Columns",{{"Column1.accountEnabled", "Account Enabled"}}),
    #"Removed Columns1" = Table.RemoveColumns(#"Renamed Columns",{"Column1.assignedLicenses", "Column1.assignedPlans"}),
    #"Renamed Columns1" = Table.RenameColumns(#"Removed Columns1",{{"Column1.city", "City"}, {"Column1.companyName", "OA-FA"}, {"Column1.country", "Country"}}),
    #"Removed Columns2" = Table.RemoveColumns(#"Renamed Columns1",{"Column1.creationType"}),
    #"Renamed Columns2" = Table.RenameColumns(#"Removed Columns2",{{"Column1.department", "Department"}}),
    #"Removed Columns3" = Table.RemoveColumns(#"Renamed Columns2",{"Column1.dirSyncEnabled"}),
    #"Renamed Columns3" = Table.RenameColumns(#"Removed Columns3",{{"Column1.displayName", "Name"}}),
    #"Removed Columns4" = Table.RemoveColumns(#"Renamed Columns3",{"Column1.facsimileTelephoneNumber", "Column1.givenName", "Column1.immutableId"}),
    #"Renamed Columns4" = Table.RenameColumns(#"Removed Columns4",{{"Column1.jobTitle", "Title"}}),
    #"Removed Columns5" = Table.RemoveColumns(#"Renamed Columns4",{"Column1.lastDirSyncTime"}),
    #"Renamed Columns5" = Table.RenameColumns(#"Removed Columns5",{{"Column1.mail", "Email"}}),
    #"Removed Columns6" = Table.RemoveColumns(#"Renamed Columns5",{"Column1.mailNickname", "Column1.mobile", "Column1.onPremisesSecurityIdentifier"}),
    #"Expanded Column1.otherMails" = Table.ExpandListColumn(#"Removed Columns6", "Column1.otherMails"),
    #"Removed Columns7" = Table.RemoveColumns(#"Expanded Column1.otherMails",{"Column1.otherMails", "Column1.passwordPolicies", "Column1.passwordProfile", "Column1.physicalDeliveryOfficeName"}),
    #"Renamed Columns6" = Table.RenameColumns(#"Removed Columns7",{{"Column1.postalCode", "Postal Code"}}),
    #"Removed Columns8" = Table.RemoveColumns(#"Renamed Columns6",{"Column1.preferredLanguage", "Column1.provisionedPlans", "Column1.provisioningErrors"}),
    #"Expanded Column1.proxyAddresses" = Table.ExpandListColumn(#"Removed Columns8", "Column1.proxyAddresses"),
    #"Removed Columns9" = Table.RemoveColumns(#"Expanded Column1.proxyAddresses",{"Column1.sipProxyAddress"}),
    #"Renamed Columns7" = Table.RenameColumns(#"Removed Columns9",{{"Column1.state", "State"}, {"Column1.streetAddress", "Street Address"}}),
    #"Removed Columns10" = Table.RemoveColumns(#"Renamed Columns7",{"Column1.surname", "Column1.telephoneNumber", "Column1.thumbnailPhoto@odata.mediaContentType", "Column1.usageLocation", "Column1.userPrincipalName", "Column1.userType"}),
    #"Removed Duplicates" = Table.Distinct(#"Removed Columns10", {"Name"})
in
    #"Removed Duplicates"
in
    FNLookupAD

Gracias a todos por vuestra ayuda. Aquí hay un enlace a la publicación original de @ Evogelpohl

Brian_M

Siguiendo el ejemplo de @ Greg_Deckler, busqué y encontré una publicación que resolví un problema de copiar y pegar, además de crear una función adicional y parametrizar el lote para tratar de salvar a la gente futura en algún momento.

Lo vincularé a la publicación que me llevó a esta solución. Gracias a @curth por la solución y a @Evogelpohl por la pregunta original.

Mi primera función llama a los usuarios de mi dominio con MyDomain como parámetro de entrada; le pedirá sus credenciales de Azure AD (NB: mi cuenta de trabajo funcionó para mí ya que tengo derechos de administrador, no necesitaba usar las credenciales de administrador de Azure Portal o Cualquier cosa como eso)

(MyDomain as text) =>

let

    Source = Json.Document(Web.Contents("https://graph.windows.net/" & MyDomain & "/users?api-version=1.6")),
    value = Source[value],
    ConvertedtoTable = Table.FromList(value, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    ExpandedColumn1 = Table.ExpandRecordColumn(ConvertedtoTable, "Column1", {"userPrincipalName", "userType"}),
    GetUserDetails = Table.AddColumn(ExpandedColumn1, "UserDetails", each if [userType] = "Member" then try fnGetUserDetails([userPrincipalName],MyDomain) otherwise null else null),
    ExpandUserDetails = Table.ExpandTableColumn(GetUserDetails, "UserDetails", {"City", "Country", "Department", "Name", "Email", "Postal Code", "State", "Street Address"}, {"Custom.City", "Custom.Country", "Custom.Department", "Custom.Name", "Custom.Email", "Custom.Postal Code", "Custom.State", "Custom.Street Address"})
in

    ExpandUserDetails

Mi primera función llama a una segunda función fnGetUserDetails que toma el userPrincipalName para todos los usuarios de tipo ‘Miembro’ (y no invitado) y devuelve los detalles del usuario. FnGetUserDetails es el siguiente:

let

  FNLookupAD = (EmailAddress as text,MyDomain as text) =>

    let

      Source = Json.Document(Web.Contents("https://graph.windows.net/" & MyDomain & "/users?api-version=1.5", [
      Query = [#"$filter"="proxyAddresses/any(c:c eq 'smtp:" & EmailAddress & "')"]])),
      value = Source[value],
    #"Converted to Table" = Table.FromList(value, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"Expanded Column1" = Table.ExpandRecordColumn(#"Converted to Table", "Column1", {"odata.type", "objectType", "objectId", "deletionTimestamp", "accountEnabled", "assignedLicenses", "assignedPlans", "city", "companyName", "country", "creationType", "department", "dirSyncEnabled", "displayName", "facsimileTelephoneNumber", "givenName", "immutableId", "jobTitle", "lastDirSyncTime", "mail", "mailNickname", "mobile", "onPremisesSecurityIdentifier", "otherMails", "passwordPolicies", "passwordProfile", "physicalDeliveryOfficeName", "postalCode", "preferredLanguage", "provisionedPlans", "provisioningErrors", "proxyAddresses", "sipProxyAddress", "state", "streetAddress", "surname", "telephoneNumber", "thumbnailPhoto@odata.mediaContentType", "usageLocation", "userPrincipalName", "userType"}, {"Column1.odata.type", "Column1.objectType", "Column1.objectId", "Column1.deletionTimestamp", "Column1.accountEnabled", "Column1.assignedLicenses", "Column1.assignedPlans", "Column1.city", "Column1.companyName", "Column1.country", "Column1.creationType", "Column1.department", "Column1.dirSyncEnabled", "Column1.displayName", "Column1.facsimileTelephoneNumber", "Column1.givenName", "Column1.immutableId", "Column1.jobTitle", "Column1.lastDirSyncTime", "Column1.mail", "Column1.mailNickname", "Column1.mobile", "Column1.onPremisesSecurityIdentifier", "Column1.otherMails", "Column1.passwordPolicies", "Column1.passwordProfile", "Column1.physicalDeliveryOfficeName", "Column1.postalCode", "Column1.preferredLanguage", "Column1.provisionedPlans", "Column1.provisioningErrors", "Column1.proxyAddresses", "Column1.sipProxyAddress", "Column1.state", "Column1.streetAddress", "Column1.surname", "Column1.telephoneNumber", "Column1.thumbnailPhoto@odata.mediaContentType", "Column1.usageLocation", "Column1.userPrincipalName", "Column1.userType"}),
    #"Removed Columns" = Table.RemoveColumns(#"Expanded Column1",{"Column1.odata.type", "Column1.objectType", "Column1.objectId", "Column1.deletionTimestamp"}),
    #"Renamed Columns" = Table.RenameColumns(#"Removed Columns",{{"Column1.accountEnabled", "Account Enabled"}}),
    #"Removed Columns1" = Table.RemoveColumns(#"Renamed Columns",{"Column1.assignedLicenses", "Column1.assignedPlans"}),
    #"Renamed Columns1" = Table.RenameColumns(#"Removed Columns1",{{"Column1.city", "City"}, {"Column1.companyName", "OA-FA"}, {"Column1.country", "Country"}}),
    #"Removed Columns2" = Table.RemoveColumns(#"Renamed Columns1",{"Column1.creationType"}),
    #"Renamed Columns2" = Table.RenameColumns(#"Removed Columns2",{{"Column1.department", "Department"}}),
    #"Removed Columns3" = Table.RemoveColumns(#"Renamed Columns2",{"Column1.dirSyncEnabled"}),
    #"Renamed Columns3" = Table.RenameColumns(#"Removed Columns3",{{"Column1.displayName", "Name"}}),
    #"Removed Columns4" = Table.RemoveColumns(#"Renamed Columns3",{"Column1.facsimileTelephoneNumber", "Column1.givenName", "Column1.immutableId"}),
    #"Renamed Columns4" = Table.RenameColumns(#"Removed Columns4",{{"Column1.jobTitle", "Title"}}),
    #"Removed Columns5" = Table.RemoveColumns(#"Renamed Columns4",{"Column1.lastDirSyncTime"}),
    #"Renamed Columns5" = Table.RenameColumns(#"Removed Columns5",{{"Column1.mail", "Email"}}),
    #"Removed Columns6" = Table.RemoveColumns(#"Renamed Columns5",{"Column1.mailNickname", "Column1.mobile", "Column1.onPremisesSecurityIdentifier"}),
    #"Expanded Column1.otherMails" = Table.ExpandListColumn(#"Removed Columns6", "Column1.otherMails"),
    #"Removed Columns7" = Table.RemoveColumns(#"Expanded Column1.otherMails",{"Column1.otherMails", "Column1.passwordPolicies", "Column1.passwordProfile", "Column1.physicalDeliveryOfficeName"}),
    #"Renamed Columns6" = Table.RenameColumns(#"Removed Columns7",{{"Column1.postalCode", "Postal Code"}}),
    #"Removed Columns8" = Table.RemoveColumns(#"Renamed Columns6",{"Column1.preferredLanguage", "Column1.provisionedPlans", "Column1.provisioningErrors"}),
    #"Expanded Column1.proxyAddresses" = Table.ExpandListColumn(#"Removed Columns8", "Column1.proxyAddresses"),
    #"Removed Columns9" = Table.RemoveColumns(#"Expanded Column1.proxyAddresses",{"Column1.sipProxyAddress"}),
    #"Renamed Columns7" = Table.RenameColumns(#"Removed Columns9",{{"Column1.state", "State"}, {"Column1.streetAddress", "Street Address"}}),
    #"Removed Columns10" = Table.RemoveColumns(#"Renamed Columns7",{"Column1.surname", "Column1.telephoneNumber", "Column1.thumbnailPhoto@odata.mediaContentType", "Column1.usageLocation", "Column1.userPrincipalName", "Column1.userType"}),
    #"Removed Duplicates" = Table.Distinct(#"Removed Columns10", {"Name"})
in
    #"Removed Duplicates"
in
    FNLookupAD

Gracias a todos por vuestra ayuda. Aquí hay un enlace a la publicación original de @ Evogelpohl

no_one_but_me

En respuesta a Brian_M

Hola chicos,

He usado la misma consulta para obtener los detalles del usuario, pero eso solo carga los 100 detalles principales del usuario. No sé por qué.

¿Me puede ayudar con esto?

no_one_but_me

En respuesta a Brian_M

¿Puedo obtener la estructura jerárquica del Active Directory de power bi con la ayuda de este código?

Si es así, por favor ayúdame

Gracias por adelantado

no_one_but_me

En respuesta a no_one_but_me

Por favor amablemente ayude con esto

o si puedo obtener la información de «informes a» de la consulta anterior

joseabarriga

En respuesta a Brian_M

Hola Brian:

¿Hay alguna forma de obtener el correo electrónico del usuario registrado y pasarlo a su ¿Función fnGetUserDetails? Con DAX, usando

Nombre de usuario o USERPRINCIPALNAME (), puede tener el correo electrónico registrado del usuario pero no sé cómo pasar este valor como parámetro a su fnGetUserDetails en lugar de escribirlo.
¿Alguna idea?

joseabarriga

En respuesta a joseabarriga

Bueno, encontré la respuesta a mi pregunta: si desea obtener toda la información de AAD del usuario registrado, use la interfaz gráfica:

https://graph.windows.net/{domain}/yo? api-version = 1.6

Aquí puede encontrar más información https://docs.microsoft.com/en-us/graph/api/user-get?view=graph-rest-1.0&tabs=http. Lamentablemente, como de costumbre, aunque dice que está actualizado, no lo es. Es la versión 1.0

Johanno

En respuesta a joseabarriga

Hola, gracias a @Brian_M por su completa respuesta. Si copio y pego esto, funciona recopilando datos de AD de la persona ingresada como parámetro en Power Query. Pero, ¿cómo se obtiene información para el usuario que ha iniciado sesión actualmente? Veo que @joseabarriga ha resuelto esto e intenté entender la información en el enlace pero me atasco.

Quiero:

1. Obtenga una lista de todos los usuarios de AD con correo electrónico, ciudad y departamento

o de esto no se puede hacer:

2. Obtenga el correo electrónico, la ciudad y el departamento solo del usuario que inició sesión

¡Gracias de antemano!

joseabarriga

En respuesta a Johanno

@Johanno

Lo que hice fue usar la API REST de Microsoft Graph descrita en https://docs.microsoft.com/en-us/graph/api/user-get?view=graph-rest-1.0&tabs=http .

Si desea todos los datos de todos los usuarios de su dominio, el comando es:

https://graph.windows.net/ /users?api-version=1.6

Porque solo el usuario registrado será

https://graph.windows.net/ /me?api-version=1.6

Para probarlo, sugerí usar PostMan

https://docs.microsoft.com/en-us/graph/use-postman?context=graph%2Fapi%2Fbeta&view=graph-rest-beta

Finalmente, tenga en cuenta que hay dos API con los mismos resultados que son Azure AD Graph y Microsoft Graph (solo eso) … eche un vistazo a https://docs.microsoft.com/en-us/graph/migrate -azure-ad-graph-resource-difference

DebbieE

En respuesta a joseabarriga

esto para mí significa que Active Directory en Obtener datos es realmente engañoso porque no funciona. es ese el caso?

¿Porque tengo el mismo problema y no quiero usar Graph porque debería poder usar el conector como se indica en Power BI?

Sin embargo, utilicé el dominio principal que encontré en Azure Active Directory. solía

compname.onmicrosoft.com

Y no funcionó. se deshizo de onmicrosoft.com …. y todavía no funcionó. Si este conector no funciona, seguramente debería quitarse. Si funciona, ¿qué estoy haciendo mal?

benswift

En respuesta a Brian_M

Hola @Brian_M,

Estoy tratando de conectarme a AAD desde Power BI Desktop, pero espero que esto se pueda hacer a través de la interfaz de usuario del escritorio, ya que no tengo experiencia en hacer llamadas a la API Graph.

Recibo el mismo mensaje en el que aparecía «No se pudo encontrar el dominio x del directorio activo» (donde x es el dominio de onmicrosoft que se le proporciona cuando Power BI es lo único que está ejecutando fuera de AAD). (Ver adjunto.) He probado otros dominios que tenemos, pero definitivamente no se encuentra el que espero que funcione.

¿Alguna sugerencia?

Gracias,

Ben

jhaller

En respuesta a benswift

Hola,

Estoy buscando lo mismo, es decir, obtener datos de Azure AD. Para las necesidades comerciales, he creado un informe con datos de nuestra herramienta de planificación de horas. Una gran ventaja sería poder crear un filtro en los departamentos. Como esta noción de departamentos ya existe en AAD, me gustaría usar los datos de AAD para evitar tener una tabla estática en mi informe que necesitaría actualizaciones cada vez que una persona se va o se une a nosotros.
¿Tiene alguna información sobre cómo obtener datos de AAD y almacenarlos en un almacén de datos?

Gracias,
Julien.

TePe

En respuesta a jhaller

Hola,

¿Resolviste de alguna manera este problema? Estoy buscando exportar usuarios, grupos y sus membresías para algún escenario de seguridad personalizado.

La solución podría ser una combinación del código M proporcionado anteriormente junto con los flujos de datos que almacenan los datos en formato de texto en las carpetas CDM como parte de su lago de datos. Para mí eso sería perfecto …

Gracias,

Thomas

Greg_Deckler

Probaría la API gráfica: https://msdn.microsoft.com/en-us/library/azure/ad/graph/api/api-catalog

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *