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]::SecurityProtocolConnect-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