使用Automation RunAs服务主体连接到Azure Analysis Services并处理

时间:2018-02-01 03:45:54

标签: azure azure-powershell azure-automation azure-analysis-services

TL; DR

总之,步骤如下:

  1. 使用正确的代码(本文中的最后一个代码)
  2. 在SSMS中手动将您的应用ID添加为服务器管理员或数据库管理员
  3. 然后您可以从Azure自动化帐户处理Azure Analysis Services多维数据集,而无需创建另一个单独的服务帐户

    实际问题:

    我正在尝试使用Azure自动化RunAs服务主体处理Azure Analysis Services多维数据集。这在Azure自动化帐户中运行

    此代码

    #Get the existing AzureRunAsConnection connection
    $Conn = Get-AutomationConnection -Name AzureRunAsConnection
    
    # Login with service principal account
    Login-AzureRMAccount 
        -ServicePrincipal 
        -Tenant $Conn.TenantID 
        -ApplicationId $Conn.ApplicationID 
        -CertificateThumbprint $Conn.CertificateThumbprint
    
    # Process cube
    Invoke-ProcessASDatabase -databasename "DB" -server "Server" -RefreshType "Full"
    

    结果

      
        

    身份验证失败:当用户界面不是时,需要用户ID和密码     可用。

      

    我的理解是,当您创建Azure自动化帐户时,它还会创建一个“RunAs”帐户,该帐户又会创建一个服务主体帐户。 (虽然doco似乎有点亮)

    我尝试在Azure AD中找到此主帐户并将其添加到Azure门户中的SSAS管理员,但我找不到实际帐户。服务主体是否实际显示为帐户?

    以下代码运行正常,但它使用预先保存的凭据,但我不想再管理另一个帐户。

    # Purpose: Run a full process the SSAS cube
    $AzureCred = Get-AutomationPSCredential -Name "MyCredential"
    
    Add-AzureRmAccount -Credential $AzureCred | Out-Null
    Invoke-ProcessASDatabase -databasename "MyDB" -server "MyServer" -RefreshType "Full" -Credential $AzureCred 
    

    更新1

    我还尝试在SSMS成员资格区域中手动添加这些内容(在自动帐户中的 RunAs帐户区域中查找guid之后):

    app:applicationid@tenantid
    
    obj:serviceprincipalobjectid@tenantid
    

    我得到了同样的错误信息。

    我还使用非管理员用户运行脚本并获得了

      
        

    服务器上不存在“zzz”数据库。

      

    所以看来我的问题是身份验证,而不是授权。换句话说,这不是我不能访问,而是我无法登录。我正在考虑基于该错误,-credential在针对Azure Analysis服务调用Invoke-ProcessAsDatabase时不是可选的

    另外,我注意到-credential选项,帮助说

      
        

    如果未指定凭据,则运行脚本的用户的默认Windows帐户为

      

    鉴于Azure Analysis Services似乎只能在连接到数据源时使用SQL凭据(没有任何AD凭据),我只能推测Azure Analysis Services无法使用任何类型的Azure广告身份验证内部流程。

    令人讨厌的是,这在任何地方都没有说明。

    更新2

    所以我没有仔细阅读链接。有效的代码主要在answerers here发布的网站上。要预先验证Azure Analysis Server,您需要使用Add-AzureAnalysisServicesAccount(链接的博客使用Login-AzureAsAccount但我无法使其工作且无法找到doco)。您需要安装powershell模块“Azure.AnalysisServices”才能使用它。

    $Conn = Get-AutomationConnection -Name AzureRunAsConnection
    Add-AzureAnalysisServicesAccount -RolloutEnvironment "australiasoutheast.asazure.windows.net" -ServicePrincipal -Tenant $Conn.TenantID -ApplicationId $Conn.ApplicationID -CertificateThumbprint $Conn.CertificateThumbprint
    Invoke-ProcessASDatabase -databasename "MYDB" -server "MyServerEndpoint" -RefreshType "Full"
    

    您可以使用RunAs帐户,之后您不需要使用-credential

    所以..这实际上有效并且无需单独的凭证即可登录,但现在它无法访问数据库。我没有登录错误,而是

      

    服务器上不存在“ZZZZ”数据库。

    我认为RunAs帐户可以访问服务器但不能访问数据库,我无法找到它来访问它。

    更新3:

    这是一个更直接的指南,介绍如何让应用程序访问模型,以便构建它:

    Azure analysis service connection using Service principal not working

    请注意,您无法添加Azure门户,因为它无法找到它。在SSMS中“手动”添加它,它将起作用,它也将作为管理员出现在Azure门户中

    现在一切正常。

    更新4:

    这已经成为一个方便的地方,可以通过MSI验证我的发现

    虽然这个问题已经解决,但我不想使用MSI安全性从其他东西连接到SQL Azure。没有连接字符串支持此 - 任何连接字符串中的任何身份验证方法都不支持MSI身份验证。我确实找到了这个有趣的链接,暗示你可以创建一个支持身份验证为MSI的连接字符串:

    https://docs.microsoft.com/en-us/azure/app-service/app-service-web-tutorial-connect-msi

    感兴趣的代码是:

    az webapp config connection-string set 
    --resource-group myResourceGroup 
    --name <app name> 
    --settings MyDbConnection='Server=tcp:<server_name>.database.windows.net,1433;Database=<db_name>;' 
    --connection-string-type SQLAzure
    

    我找不到对参数--connection-string-type的任何引用。但看起来您只是完全排除了身份验证部分。

2 个答案:

答案 0 :(得分:1)

根据官方文件:

  

创建服务主体后,可以使用以下语法在Azure Analysis Services服务器或模型角色中为其应用程序ID分配权限。以下示例将服务主体添加到SSMS中的服务器管理员组。

我没有看到使用Run-as选项,我建议您查看blog

它还包含有关在azure自动化中存储凭据的信息,这将帮助您在代码中不刻写凭据。

答案 1 :(得分:1)

在您的示例1中,似乎不是您的登录Azure Login-AzureRMAccount获取错误日志。根据我的知识,Invoke-ProcessASDatabase不是Azure Power Shell cmdlet。实际上,您无需登录Azure订阅。只有Invoke-ProcessASDatabase -databasename "MyDB" -server "MyServer" -RefreshType "Full" -Credential $AzureCred适合您。

  

是的,如果我提供了可行的凭证,但我想使用RunAs   凭据。如果我不能,那么它有什么意义。

RunAs credential仅适用于登录Azure订阅,它不存储SQL的凭据。在您的方案中,您可以将您的SQL凭据存储在Runbook PSCredential中,就像您的example2一样。实际上,在您的示例中,您可以删除Add-AzureRmAccount -Credential $AzureCred | Out-Null

更新

您应该在Runbook中使用以下脚本。

$Conn = Get-AutomationConnection -Name AzureRunAsConnection 
Login-AzureASAccount -RolloutEnvironment "southcentralus.asazure.windows.net" -ServicePrincipal -ApplicationId $Conn.ApplicationID -CertificateThumbprint $Conn.CertificateThumbprint -TenantId $Conn.TenantID 
Invoke-ProcessTable -Server "asazure://southcentralus.asazure.windows.net/myserver" -TableName "MyTable" -Database "MyDb" -RefreshType "Full"

有关此问题的详情,请查看此blog