[英]Is possible to execute Powershell Azure CMDlets from web application?
[英]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個屬性,其中一個AdditionalProperties
是Dictionary<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
}
假設您對此對象感興趣Id
、 displayName
和mail
,您可以使用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
"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.