Действительно, при запуске из очереди может показаться, что несколько запусков одной и той же функции совсем не изолированы.
Один из подходов, который вы можете использовать, - это обернуть ваш код PowerShell, который должен работать изолированно, в его собственное задание PowerShell, используя Start-Job
.Вот пример, который я успешно протестировал.
# Receive queue message
$input = Get-Content $queueItem -Raw
# Pass the input queue message as a parameter to a new job.
$job = Start-Job -ArgumentList $input -ScriptBlock {
param($queueMessage)
# Load the MSOnline PowerShell module
Import-Module $env:CONTOSO_PathToMSOnline
# Retrieve the credentials from where they're securely stored
$credentials = ... # e.g. get from Key Vault
# Connect to Azure AD. This connection is only used by this job.
Connect-MsolService -Credential $credentials
# Do something with MSOnline...
}
# Wait for the job to complete, receive results, then clean up.
Receive-Job -Wait -Job $job -AutoRemoveJob
Исходя из результатов моего тестирования, это должно покрыть ваши потребности в изоляции.Однако имейте в виду, что вы раскручиваете для этого совершенно новый экземпляр хоста PowerShell, что может иметь непредвиденные последствия (например, увеличение использования памяти, больше времени для загрузки).
Пока я на этомЯ хотел бы предложить настроить ваш процесс, чтобы идентифицировать администраторов, у которых включен MFA для каждого пользователя (при условии, что вы не хотите удваивать счет администраторов, которые являются членами нескольких ролей):
# Iterate over all admins of all roles, and check if they have per-user MFA enabled.
$admins = @{} # To keep track of which admins we've already seen
foreach ($role in Get-MsolRole) {
$roleMembers = Get-MsolRoleMember -All -RoleObjectId $role.ObjectId `#`
-MemberObjectTypes @("User")
foreach ($user in $roleMembers) {
if ($admins.ContainsKey($user.ObjectId)) {
# We've already seen this user, skip it.
} else {
$admins[$user.ObjectId] = $true # Mark as admin we've seen
# Determine if per-user MFA is enabled or enforced
$isMfaEnabledOrEnforced = $user.StrongAuthenticationRequirements.Count -gt 0
# Do something...
}
}
}