我正在尝试创建一个系统,其中PowerShell从多个租户收集数据并在报告中进行播放。管理员是否已启用MFA是需要检查的数据点之一。为了提取此数据,我使用以下
$credentials = <credentials>;
Connect-MSOLService -Credential $credentials;
foreach ($role in Get-MsolRole) {
foreach ($adminUser in (Get-MsolRoleMember -All -RoleObjectId $role.ObjectId -MemberObjectTypes @("User"))) {
$isMFA = ($adminUser.StrongAuthenticationRequirements -match 'Microsoft.Online.Administration.StrongAuthenticationRequirement').Count -gt 0;
#Do stuff
}
}
这有效。问题是,此脚本正在队列中运行,触发了天蓝色函数。它在计时器上触发,这意味着所有触发器将同时运行。建立第一个连接后,所有其他数据请求都从同一租户提取数据。
有什么方法可以确保每个请求建立自己的连接,还是限制msol连接的范围?
我能想到的唯一解决方案是同步运行脚本,但这会导致性能很差。
答案 0 :(得分:1)
的确,当由队列触发时,似乎完全没有隔离同一功能的多次运行。
您可以采用的一种方法是使用Start-Job
将应该独立运行的PowerShell代码包装到它自己的PowerShell作业中。这是我成功测试的示例。
# 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...
}
}
}
答案 1 :(得分:0)
恐怕这个ps命令:“ Connect-MSOLService -Credential”会将您带到在其上创建帐户的租户。如果您有多个租户要检查。您应该为每个租户准备多个帐户凭据,以便可以检查所需的所有租户。 也许您可以将所有凭据作为触发器中的参数推送到列表中,并通过凭据循环遍历ps脚本,以检查所有数据点。 顺便说一句,我找到了一个解决天蓝色查询的好渠道:https://support.microsoft.com/en-us/help/3174960/dev-chat-for-office365-azure,所有天蓝色或O365的查询都似乎总是可以回答的,可以尝试一下:)
答案 2 :(得分:0)
您可以在下面尝试这种方式:
workflow testworkflow
{
param([Management.Automation.PSCredential[]]$creds)
foreach –parallel ($cred in $creds){
get-tenantNames -cred $cred
}
function get-tenantNames{
Param([Management.Automation.PSCredential]$cred)
echo "start query"
Connect-MsolService -Credential $cred
$info = Get-MsolCompanyInformation
echo $info.displayname
}
}
testworkflow -creds $creds # run workflow
它在我的本地计算机上工作