Я думаю, что должно быть что-то, чтобы убедиться в назначении роли. Для одной и той же области или ресурса вы можете назначить ту же роль субъекту службы только один раз. В этом случае это означает, что вы можете назначить роль «Участник хранилища больших двоичных объектов» для учетной записи хранения только один раз.
Таким образом, когда вы проверяете, существует ли назначение роли, вам нужно только проверить, является ли результат команды PowerShell нулевым или нет.
Get-AzureRmRoleAssignment -ObjectId "$objectid" -RoleDefinitionName "$roleDefinitionName" -Scope "$resid"
И я думаю, что цикл while не подходит. Если назначение роли может быть успешно создано, тогда это просто необходимо один раз. Больше одного раза бессмысленно. Так что вам просто нужно проверить, успешно ли это. Если нет, то в чем причина.
Обновление
Из вашего скрипта PowerShell я обнаружил, что вы используете команду ниже, чтобы получить идентификатор удостоверения веб-приложения:
$objectid = [System.Guid]::Parse($webapp.Identity.PrincipalId)
Это не правильно. Вы просто можете получить результат объекта, а не только идентификатор. Как это:
Два способа получить только идентификатор.
Один: $webapp.Identity.PrincipalId
Два: $objectid.Guid
Я предлагаю первый способ, затем вы можете удалить команду $objectid = [System.Guid]::Parse($webapp.Identity.PrincipalId)
.
С вашим комментарием операция, которая включает управляемую идентификацию веб-приложения, займет некоторое время, чтобы получить эффект. Лучше поспать некоторое время перед созданием назначения роли, чем использовать цикл while. Не долго, просто спать 30 секунд вполне достаточно.