簡體   English   中英

可以使用 Microsoft Graph PowerShell cmdlet 從 AdditionalProperties 字典中提取信息嗎?

[英]Possible to pull info from AdditionalProperties dictionary with Microsoft Graph PowerShell cmdlets?

我正在嘗試使用 PowerShell Graph cmdlet 而不是 Azure AD 模塊 cmdlet。 使用 Azure AD 模塊,我可以這樣做:

# This is what I want:
get-azureadgroupmember -objectid $GroupID | select-object -property displayname, `
    mail, userprincipalname, objectid

DisplayName     Mail                        UserPrincipalName  ObjectId
-----------     ----                        -----------------  --------
John Smith      John.Smith@example.org      jsmith@example.org 4bae8291-6ec3-192b-32ce-dd21869ef784
(...)


# All of these properties are directly accessible in the returned objects:
$res = get-azureadgroupmember -objectid $GroupID
$res[0] | fl -prop *
# Shows long list of directly accessible properties

我試圖找出與 PowerShell Graph 的等價物:

$res = get-mggroupmember -groupid $GroupID
$res[0] | fl -prop *
# Only properties are DeletedDateTime, Id, and AdditionalProperties

# Want to do something like this, but it doesn't work:
get-mggroupmember -groupid $GroupID | select-object -property id, `
    additionalproperties['displayName'], additionalproperties['mail'], `
    additionalproperties['userPrincipalName']

# This works, but is there a better option???
get-mggroupmember -groupid $GroupID | foreach-object { `
        "{0},{1},{2},{3}" -f $_.id, $_.additionalproperties['displayName'], `
        $_.additionalproperties['mail'], $_.additionalproperties['userPrincipalName']
    }

AdditionalProperties 是一個字典 (IDictionary),其中包含顯示名稱、郵件和用戶主體名稱。 我的想法是可能有更好的方法來做到這一點或獲取信息。

get-mggroupmember 中有一些我不清楚的有趣參數,包括“-expandproperty”和“-property”。 我試過玩這些,但沒有任何運氣。 我想知道是否有辦法使用這些來做我想做的事。

建議?

給定以下$object ,3個屬性,其中一個AdditionalPropertiesDictionary<TKey,TValue>

$dict = [Collections.Generic.Dictionary[object, object]]::new()
$dict.Add('displayName', 'placeholder')
$dict.Add('mail', 'placeholder')
$dict.Add('userPrincipalName', 'placeholder')

$object = [pscustomobject]@{
    DeletedDateTime = 'placeholder'
    Id = 'placeholder'
    AdditionalProperties = $dict
}

假設您對此對象感興趣IddisplayNamemail ,您可以使用Select-Object計算屬性

$object | Select-Object @(
    'Id'
    @{
        N = 'displayName'
        E = { $_.additionalProperties['displayName'] }
    }
    @{
        N = 'mail'
        E = { $_.additionalProperties['mail'] }
    }
)

但是,一旦您需要從對象中選擇更多屬性值,這就會變得混亂,在這種情況下,帶有循環的PSCustomObject會派上用場:

$object | ForEach-Object {
    [pscustomobject]@{
        Id          = $_.Id
        displayName = $_.additionalProperties['displayName']
        mail        = $_.additionalProperties['mail']
    }
}

兩種選擇都會輸出相同的“扁平化”對象,可以毫無問題地轉換為 Csv:

  • 作為對象
Id          displayName mail
--          ----------- ----
placeholder placeholder placeholder
  • 作為 CSV
"Id","displayName","mail"
"placeholder","placeholder","placeholder"

從這個意義上說,您可以使用上述技術之一構造一個對象數組,例如:

Get-MgGroupMember -GroupId $GroupID | ForEach-Object {
    [pscustomobject]@{
        Id                = $_.id
        displayName       = $_.additionalproperties['displayName']
        mail              = $_.additionalproperties['mail']
        userPrincipalName = $_.additionalproperties['userPrincipalName']
    }
}

如果您正在尋找一種編程方式來展平對象,您可以從使用此示例開始,但重要的是要注意,這只能處理屬性僅嵌套一次的對象,換句話說,它無法處理遞歸:

$newObject = [ordered]@{}
foreach($property in $object.PSObject.Properties) {
    if($property.Value -is [Collections.IDictionary]) {
        foreach($addproperty in $property.Value.GetEnumerator()) {
            $newObject[$addproperty.Key] = $addproperty.Value
        }
        continue
    }
    $newObject[$property.Name] = $property.Value
}
[pscustomobject] $newObject

這樣的輸出將成為一個像這樣的扁平對象,它也可以毫無問題地轉換為 Csv:

DeletedDateTime   : placeholder
Id                : placeholder
displayName       : placeholder
mail              : placeholder
userPrincipalName : placeholder

還值得注意的是,上面的示例沒有處理可能的鍵沖突,如果有 2 個或多個具有相同名稱的屬性,則其中一個會覆蓋其他屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM