Okta API 的 Powershell 脚本,用于将单个组添加到多个应用程序
Powershell Script for Okta API to add single group to Multiple Apps
我有一个名为 Group1 的群组,我有大约 50-60 个包含相同名称的类似应用程序,例如“ABC-423”、“ABC-4242”等
我想要的是通过使用 Okta API 和 Powershell (API - https://github.com/gabrielsroka/OktaAPI.psm1) 将这个单个组 (Group-1) 添加到这个不同的应用程序“ABC*”
这是我到目前为止写的代码
#Purpose of Code : We want to Add Group named GRPS1 to Okta Apps that's name contains ABC
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
# [1] Connect to Okta. Do this before making any other calls. - done
Connect-Okta "<redacted>" "https://yourorg.oktapreview.com"
$url = "https://yourorg.oktapreview.com"
$appdata = @()
$groupid = "00gtx2yruqKg9diIJ0h7" #00gtx2yruqKg9diIJ0h7 => GRPS1
$group = 0
$i=0
$j=0
#Function to Get all Active OKTA Application List
function Get-AllActiveApps($url)
{
# [2] Now we want to Store JSON data from $appdata to Powershell Object - done
$appdata = @(Invoke-Method GET "/api/v1/apps?status eq 'Active'")
foreach($i in $appdata[0].label)
{
# [3.1] Use a For loop to get one by one application object checked with name contaning ABC
if ($i -like '*ABC*')
{
# [3.2] Assign Group to all apps that's name contains ABC
$appnumber = $appdata[0][$j].id
Add-OktaAppGroup($appnumber,$groupid,$group)
}
else
{
}
$j++
}
}
Get-AllActiveApps($url)
问题出在函数 Add-OktaAppGroup($appnumber,$groupid,$group) 中,因为循环将所有应用程序 ID 作为一个数组传递,并且该函数一次只能处理一个组 ID
谁能帮忙解决这个问题?
你的 Get-AllActiveApps
功能几乎没用。在取出所有与获取所有活动应用程序的任务无关的部分后,我们将剩下
function Get-AllActiveApps
{
Invoke-Method GET '/api/v1/apps?filter=status eq "Active"'
}
并且该函数已经存在于 OktaAPI.psm1
中,以更好的形式存在:
function Get-OktaApps($filter, $limit = 20, $expand, $url = "/api/v1/apps?filter=$filter&limit=$limit&expand=$expand&q=$q", $q)
{
# ...
}
所以让我们用 -filter
参数来代替它。
你的任务的其余部分(过滤更多,并为每个项目做一些事情)是 PowerShell 101。你不需要任何自定义函数或循环,一个管道就足够了:
Connect-Okta -baseUrl "https://yourorg.oktapreview.com" -token "<redacted>"
# using a hash for group IDs allows easy reference in the rest of the code
$groups = @{
GRPS1 = "00gtx2yruqKg9diIJ0h7"
}
$activeApps = Get-OktaApps -filter 'status eq "ACTIVE"' -limit 200
$activeApps.objects | Where-Object label -like '*ABC*' | Where-Object {
$appGroups = Get-OktaAppGroups -appid $_.id -limit 200
$appGroups.objects.id -notcontains $groups.GRPS1
} | ForEach-Object {
Add-OktaAppGroup -appid $_.id -groupid $groups.GRPS1
}
备注
- 您不需要设置
[Net.ServicePointManager]::SecurityProtocol
,Connect-Okta
已经设置好了。
- 当您获得应用列表时,应用组不属于 the API response,这就是第二个
Where-Object
为每个应用获取应用组的原因。
$appGroups.objects.id
将是所有返回的 groups 的 ID 数组。 -notcontains $groups.GRPS1
产生 $true
或 $false
,视情况而定。这将是 Where-Object
的过滤条件,即 “组 ID 列表不包含该特定 ID 的所有应用程序”。
- 许多 Okta API 响应是 paged。根据 API 文档,每页 200 个对象似乎是上限。注意对象比这更多的情况。阅读
OktaAPI.psm1
的文档以了解如何处理这些情况,因为上面的代码没有。
- 您或许应该添加一些调试输出。阅读
Write-Debug
和 $DebugPreference
全局变量。
请注意,Okta 应用程序 API 可以让您使用 -q
参数按名称搜索,例如
Get-OktaApps -q "ABC-"
它将 return 最多 200 个应用程序;你可以分页查看更多。
见https://developer.okta.com/docs/reference/api/apps/#list-applications
我有一个名为 Group1 的群组,我有大约 50-60 个包含相同名称的类似应用程序,例如“ABC-423”、“ABC-4242”等
我想要的是通过使用 Okta API 和 Powershell (API - https://github.com/gabrielsroka/OktaAPI.psm1) 将这个单个组 (Group-1) 添加到这个不同的应用程序“ABC*”
这是我到目前为止写的代码
#Purpose of Code : We want to Add Group named GRPS1 to Okta Apps that's name contains ABC
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
# [1] Connect to Okta. Do this before making any other calls. - done
Connect-Okta "<redacted>" "https://yourorg.oktapreview.com"
$url = "https://yourorg.oktapreview.com"
$appdata = @()
$groupid = "00gtx2yruqKg9diIJ0h7" #00gtx2yruqKg9diIJ0h7 => GRPS1
$group = 0
$i=0
$j=0
#Function to Get all Active OKTA Application List
function Get-AllActiveApps($url)
{
# [2] Now we want to Store JSON data from $appdata to Powershell Object - done
$appdata = @(Invoke-Method GET "/api/v1/apps?status eq 'Active'")
foreach($i in $appdata[0].label)
{
# [3.1] Use a For loop to get one by one application object checked with name contaning ABC
if ($i -like '*ABC*')
{
# [3.2] Assign Group to all apps that's name contains ABC
$appnumber = $appdata[0][$j].id
Add-OktaAppGroup($appnumber,$groupid,$group)
}
else
{
}
$j++
}
}
Get-AllActiveApps($url)
问题出在函数 Add-OktaAppGroup($appnumber,$groupid,$group) 中,因为循环将所有应用程序 ID 作为一个数组传递,并且该函数一次只能处理一个组 ID
谁能帮忙解决这个问题?
你的 Get-AllActiveApps
功能几乎没用。在取出所有与获取所有活动应用程序的任务无关的部分后,我们将剩下
function Get-AllActiveApps
{
Invoke-Method GET '/api/v1/apps?filter=status eq "Active"'
}
并且该函数已经存在于 OktaAPI.psm1
中,以更好的形式存在:
function Get-OktaApps($filter, $limit = 20, $expand, $url = "/api/v1/apps?filter=$filter&limit=$limit&expand=$expand&q=$q", $q)
{
# ...
}
所以让我们用 -filter
参数来代替它。
你的任务的其余部分(过滤更多,并为每个项目做一些事情)是 PowerShell 101。你不需要任何自定义函数或循环,一个管道就足够了:
Connect-Okta -baseUrl "https://yourorg.oktapreview.com" -token "<redacted>"
# using a hash for group IDs allows easy reference in the rest of the code
$groups = @{
GRPS1 = "00gtx2yruqKg9diIJ0h7"
}
$activeApps = Get-OktaApps -filter 'status eq "ACTIVE"' -limit 200
$activeApps.objects | Where-Object label -like '*ABC*' | Where-Object {
$appGroups = Get-OktaAppGroups -appid $_.id -limit 200
$appGroups.objects.id -notcontains $groups.GRPS1
} | ForEach-Object {
Add-OktaAppGroup -appid $_.id -groupid $groups.GRPS1
}
备注
- 您不需要设置
[Net.ServicePointManager]::SecurityProtocol
,Connect-Okta
已经设置好了。 - 当您获得应用列表时,应用组不属于 the API response,这就是第二个
Where-Object
为每个应用获取应用组的原因。 $appGroups.objects.id
将是所有返回的 groups 的 ID 数组。-notcontains $groups.GRPS1
产生$true
或$false
,视情况而定。这将是Where-Object
的过滤条件,即 “组 ID 列表不包含该特定 ID 的所有应用程序”。- 许多 Okta API 响应是 paged。根据 API 文档,每页 200 个对象似乎是上限。注意对象比这更多的情况。阅读
OktaAPI.psm1
的文档以了解如何处理这些情况,因为上面的代码没有。 - 您或许应该添加一些调试输出。阅读
Write-Debug
和$DebugPreference
全局变量。
请注意,Okta 应用程序 API 可以让您使用 -q
参数按名称搜索,例如
Get-OktaApps -q "ABC-"
它将 return 最多 200 个应用程序;你可以分页查看更多。
见https://developer.okta.com/docs/reference/api/apps/#list-applications