
原创内容
No.705
Power BI | Active Directory的妙用
继续上一节的话题,我们来聊聊知识是怎么表示的~

图片由海艺AI绘制
Active Directory ,作为Power BI自带支持的一种数据源,大家应该都见过这个玩意:

刚好最近有一个需求(主要我懒,手动处理太麻烦了)就花了大半天时间捣鼓了一下这个东西,怎么说呢,难度主要集中在多维数组看得我眼晕。
官方一点的术语来表述的话:
Active Directory(AD)是微软开发的一种目录服务,它是Windows Server操作系统的一部分,用于管理网络上的用户、计算机、组和其他资源。Active Directory提供了一个集中的数据库,用于存储有关网络对象的信息,并允许管理员管理这些对象的访问权限和属性。
说得俗一点,这玩意就是微软管理员平台对应的数据。对于微软的企业级服务来说,管理员可以集中管理用户的账户、密码、网络资源、设备、权限、身份认证等等东西。
为了方便管理权限,Active Directory中可以创建一些用户组,然后在进行授权的时候,对整个组进行授权。我们一般把这种用户组就简称为AD组。
我遇到的现实的业务场景就是权限配置规则有调整我要核对用户组中用户名单,对名单进行调整,并且我需要检查大几十个AD组的用户名单,工作量还是比较大的。于是我就想到了直接用Power BI来访问调取用户名单+访问数据库获取用户名单进行比对。
数据获取本身挺简单的,但是数据复杂,一个非常大的多维数组(而且嵌套了很多层),且名字命名让人一言难尽,找我想要的信息在那里我找了很久,最后还是调教AI协助才找到了我想要的信息的为止。
具体的案例不方便给操作截图,但是不影响我给一个power query的代码出来:
let
Source = ActiveDirectory.Domains("YourDomainHere"),
MyDomainName = Source{[Domain="YourDomainHere"]}[#"Object Categories"],
group = MyDomainName{[Category="group"]}[Objects],
#"Expanded securityPrincipal" = Table.ExpandRecordColumn(group, "securityPrincipal", {"sAMAccountName"}, {"securityPrincipal.sAMAccountName"}),
#"Filtered Rows" = Table.SelectRows(#"Expanded securityPrincipal", each [securityPrincipal.sAMAccountName] = "YourGroupName"),
#"Filtered Rows_Group" = #"Filtered Rows"{[securityPrincipal.sAMAccountName= "YourGroupName"]}[group],
MembersList = #"Filtered Rows_Group"[member],
TableFromList = Table.FromList(MembersList, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
#"Expand Column" = Table.ExpandRecordColumn(TableFromList, "Column1", {"sAMAccountName", "displayName", "userPrincipalName", "department"}, {"sAMAccountName", "displayName", "userPrincipalName", "department"}),
#"Sorted Rows" = Table.Sort(#"Expand Column",{{"sAMAccountName", Order.Ascending}})
in
#"Sorted Rows"这段pq能够实现的功能是:根据AD组的名称获取AD组内的用户列表。
其中几个地方需要需要说明的地方我用文本再写一遍:
Source= ActiveDirectory.Domains("YourDomainHere"),
MyDomainName=Source{[Domain="YourDomainHere"]}[#"Object Categories"],
第一处domain的信息,当你使用的是公司账户,且有权限访问Active Directory 的时候,这个信息会根据你在desktop上登录的信息自动带出来。

第二个domin的信息是有列表供选择,如果不知道选哪个,可以在azure portal中随便查一个用户的信息看看页面上显示得是啥。
#"Filtered Rows" = Table.SelectRows(#"Expanded securityPrincipal",each [securityPrincipal.sAMAccountName] = "YourGroupName"),
#"Filtered Rows_Group" = #"Filtered Rows"{[securityPrincipal.sAMAccountName= "YourGroupName"]}[group],
这里的group name需要替换成要查询的AD组的名称,是的要写两遍,两遍是一样的。除此以外,这一段query就没有其他需要修改的地方了。所有的难度完全集中在Expand Column的时候不知道应该expand哪个column才对。