While building some multithreading Azure Runbooks that log into multiple subscriptions simultaneously, I noticed that these multiple concurrent runs often end up on the same Azure Automation Host.
Apparently, these runbooks then don’t run in full isolation, and the following error may occur:
The running command stopped because the preference variable “ErrorActionPreference” or common parameter is set to Stop: The process cannot access the file ‘C:\Windows\system32\config\systemprofile\AppData\Roaming\Windows Azure Powershell\TokenCache.dat’ because it is being used by another process.
AzureProfile.json may also get locked. I resolved this by doing a retry on the Save-AzureRMContext, and using a randomized file name for the azure json profile:
$randomProfileName = [System.IO.Path]::GetRandomFileName() Save-AzureRmContext -Path .\$randomProfileName -Force -Confirm:$False
And for my full Azure Login code snippet:
$randomProfileName = [System.IO.Path]::GetRandomFileName() $tries=0 while($true){ $tries++ try{ Write-Output "Logging in to Azure $azureSubscription" $res = Login-AzureRmAccount -Credential $azureCreds -SubscriptionId $azureSubscription -TenantId $tenantId -ErrorAction Stop Select-AzureRmSubscription -SubscriptionId $azureSubscription -ErrorAction Stop -TenantId $tenantId if($res.Context.Subscription.Id -eq $azureSubscription){ Write-Output "Logged in to Azure subscription $($res.Context.Subscription.Id)" }else{ Throw "Failed, we were logged in to $($res.Context.Subscription.Id) while trying to log in to $azureSubscription" } Save-AzureRmContext -Path .\$randomProfileName -Force -Confirm:$False break }catch{ if($tries -ge 30){ Throw Exit } #sleep on failed attempts, as the azure token cache gets locked by concurrent jobs sleep -s (Get-Random -minimum 1 -maximum 6) } }
Hey, I’m running into the exact same issue using Azure PowerShell Workflow in a runbook. Did you also have to disable-azcontextautosave? I’m running mine on hybrid worker and am having no luck.