在Azure Function应用中使用PowerShell连接到不同的Azure AD租户

时间:2018-10-12 10:57:03

标签: azure powershell azure-active-directory azure-functions

我正在尝试创建一个系统,其中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连接的范围?

我能想到的唯一解决方案是同步运行脚本,但这会导致性能很差。

3 个答案:

答案 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

它在我的本地计算机上工作