【问题标题】:Getting to extension attributes of Azure user via PowerShell通过 PowerShell 获取 Azure 用户的扩展属性
【发布时间】:2020-10-08 22:16:25
【问题描述】:

我正在尝试访问通过 AADC (Azure AD Connect) 从本地同步到目标租户的 Azure 用户扩展属性。作为预读 -> 好文章在这里:https://www.xtseminars.co.uk/post/azure-ad-schema-and-directory-extensions.

问题是这些扩展可能会或不会填充到目标用户对象上。因此,假设通过单个 REST API 调用 (https://graph.microsoft.com/beta/users?$select=id,extension_c16821412f864d419a92205ad4820f0c_something&$top=5) 我得到以下响应:

$json = '{
    "value": [
        {
            "id": "91c0b90e-4ed0-4c69-8b96-b67c07bbb061"
        },
        {
            "id": "fdcd34dc-e7ab-4045-881d-0fee024c2b55",
            "extension_c16821412f864d419a92205ad4820f0c_something": "INXXXXXX213423"
        },
        {
            "id": "90ebc867-6a67-4cf0-a5d9-e4c07c9d3905"
        },
        {
            "id": "80134f5f-892f-4800-9087-924a0c69b7f1"
        },
        {
            "id": "36fae4de-c685-4da5-9458-e165d99fe670"
        }
    ]
}'

问题是 - 如何很好地记下“可选”定义的属性? 如下仅给出 id:

PS> ($json | ConvertFrom-Json).value

id
--
91c0b90e-4ed0-4c69-8b96-b67c07bbb061
fdcd34dc-e7ab-4045-881d-0fee024c2b55
90ebc867-6a67-4cf0-a5d9-e4c07c9d3905
80134f5f-892f-4800-9087-924a0c69b7f1
36fae4de-c685-4da5-9458-e165d99fe670

或者一般来说 - 它甚至可以使用 ConvertFrom-JSON() 吗?

【问题讨论】:

  • 您期望的输出格式是什么?
  • 可能是具有所有属性的新 PSobject - 这真的没关系。问题是 - 是否期望 Convertfrom-json() 修剪在返回的 JSON 响应的每个实例上不可见的属性?

标签: azure powershell rest


【解决方案1】:

好的,似乎在阅读了这篇好文章后 - Understanding NewtonSoft in PowerShell 能够使用 newtonsoft.json 模块找出解决方案

PS > Import-Module newtonsoft.json
PS >
PS > $json = '{
>> "value": [
>>         {
>>             "id": "91c0b90e-4ed0-4c69-8b96-b67c07bbb061"
>>         },
>>         {
>>             "id": "fdcd34dc-e7ab-4045-881d-0fee024c2b55",
>>             "extension_somedata": "XXXXXX213423"
>>         },
>>         {
>>             "id": "90ebc867-6a67-4cf0-a5d9-e4c07c9d3905"
>>         },
>>         {
>>             "id": "80134f5f-892f-4800-9087-924a0c69b7f1"
>>         },
>>         {
>>             "id": "36fae4de-c685-4da5-9458-e165d99fe670"
>>         }
>>     ]
>> }'
PS >
PS >
PS > $u = ($json |ConvertFrom-JsonNewtonsoft).value
PS > $u

Name                           Value
----                           -----
id                             91c0b90e-4ed0-4c69-8b96-b67c07bbb061
id                             fdcd34dc-e7ab-4045-881d-0fee024c2b55
extension_somedata             XXXXXX213423
id                             90ebc867-6a67-4cf0-a5d9-e4c07c9d3905
id                             80134f5f-892f-4800-9087-924a0c69b7f1
id                             36fae4de-c685-4da5-9458-e165d99fe670


PS > $allRows = @()
PS > foreach($o in $u){
>> $lineObject = New-Object PSObject
>>             add-member -inputobject $lineObject -membertype noteproperty -name "id" -value $o.id
>>             add-member -inputobject $lineObject -membertype noteproperty -name "extension_somedata" -value $o.extension_somedata
>> $allRows+=$lineObject
>> }
PS >
PS > $allRows

id                                   extension_somedata
--                                   ------------------
91c0b90e-4ed0-4c69-8b96-b67c07bbb061
fdcd34dc-e7ab-4045-881d-0fee024c2b55 XXXXXX213423
90ebc867-6a67-4cf0-a5d9-e4c07c9d3905
80134f5f-892f-4800-9087-924a0c69b7f1
36fae4de-c685-4da5-9458-e165d99fe670

【讨论】:

    【解决方案2】:

    是的,您不应该需要另一个模块,因为 ConvertFrom-JSON 本身就可以,但需要一个附加参数 -AsHashtable

    ConvertFrom-JSON cmdlet 存在一些限制,-AsHashtable 有助于克服其中一些限制。引用文档:

    • 如果 JSON 包含一个包含仅大小写不同的键的列表。如果没有开关,这些键将被视为相同的键,并且 因此只有最后一个会被使用。
    • 如果 JSON 包含一个为空字符串的键。如果没有开关,cmdlet 会抛出错误,因为 PSCustomObject 确实 不允许这样做,但哈希表可以。一个示例用例,其中 这可能发生在 project.lock.json 文件中。
    • 对于某些数据结构,哈希表的处理速度更快。

    请注意,此开关是在 PowerShell 6.0 中引入的。

    将此应用于您指定的相同示例:

    PS > $json = '{
    >>     "value": [
    >>         {
    >>             "id": "91c0b90e-4ed0-4c69-8b96-b67c07bbb061"
    >>         },
    >>         {
    >>             "id": "fdcd34dc-e7ab-4045-881d-0fee024c2b55",
    >>             "extension_somedata": "INXXXXXX213423"
    >>         },
    >>         {
    >>             "id": "90ebc867-6a67-4cf0-a5d9-e4c07c9d3905"
    >>         },
    >>         {
    >>             "id": "80134f5f-892f-4800-9087-924a0c69b7f1"
    >>         },
    >>         {
    >>             "id": "36fae4de-c685-4da5-9458-e165d99fe670"
    >>         }
    >>     ]
    >> }'
    PS >
    PS > $u = ($json | ConvertFrom-Json -AsHashtable).value
    PS >
    PS > $u
    
    Name                           Value
    ----                           -----
    id                             91c0b90e-4ed0-4c69-8b96-b67c07bbb061
    id                             fdcd34dc-e7ab-4045-881d-0fee024c2b55
    extension_somedata             INXXXXXX213423
    id                             90ebc867-6a67-4cf0-a5d9-e4c07c9d3905
    id                             80134f5f-892f-4800-9087-924a0c69b7f1
    id                             36fae4de-c685-4da5-9458-e165d99fe670
    
    PS > $allRows = @()
    PS >
    PS > foreach($o in $u){
    >>     $lineObject = New-Object PSObject
    >>     Add-Member -InputObject $lineObject -MemberType NoteProperty -Name "id" -Value $o.id
    >>     Add-Member -InputObject $lineObject -MemberType NoteProperty -Name "extension_somedata" -Value $o.extension_somedata
    >>     $allRows+=$lineObject
    >> }
    PS >
    PS > $allRows
    
    id                                   extension_somedata
    --                                   ------------------
    91c0b90e-4ed0-4c69-8b96-b67c07bbb061
    fdcd34dc-e7ab-4045-881d-0fee024c2b55 INXXXXXX213423
    90ebc867-6a67-4cf0-a5d9-e4c07c9d3905
    80134f5f-892f-4800-9087-924a0c69b7f1
    36fae4de-c685-4da5-9458-e165d99fe670
    

    参考资料:

    【讨论】:

    • 你好巴尔加维。确实 - 在后期发现相同, AsHashTable 提供相同的结果,但我不必使用外部模块。不过真的很感谢上面!
    • @PeterS。谢谢! :) 请 mark the response 如果它有帮助,那么它可以使社区中其他有类似问题的人受益。
    猜你喜欢
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 2021-01-26
    • 2023-03-26
    • 1970-01-01
    相关资源
    最近更新 更多