使用SQL Server代理Powershell CmdExec步骤

问题描述

我正在尝试使用Analysis Services Cmdlets处理Power BI Premium模型上的分区。当从ISE,命令行运行以及使用Windows Task Scheduler进行调度时,我的PowerShell脚本运行良好。但是,当我尝试使用步骤类型的SQL Server 2019代理作业计划PowerShell脚本时 操作系统(CmdExec)”中遇到以下错误消息。

以用户身份执行的消息:MyDomain \ MyUser。 Invoke-ProcessPartition: 连接字符串无效。在 C:\ Users \ MyUser \ Desktop \ PS1 \ SSAS \​​ wtf.ps1:15 char:11 + $ asResult = Invoke-ProcessPartition-凭据$ UserCredential-服务器... +
CategoryInfo:未指定:(:) [Invoke-ProcessPartition], ConnectionException + FullyQualifiedErrorId: Microsoft.AnalysisServices.ConnectionException,Microsoft.AnalysisServices.PowerShell.Cmd lets.ProcessPartition。

我已经按照此blog article中的步骤进行了设置。在所有三个运行方案中都使用相同的Windows用户。 SQL Server是我的本地开发SQL Server,其Windows用户是SQL Server和Windows Admin上的SA。使用SQL实例所在的同一台计算机成功执行其他三种运行PS脚本的方式(ISE,命令行和Windows Task Scheduler)

如果我在与本地服务器相同的SQL Server所在计算机上从命令行运行以下命令,则PowerShell脚本将成功运行。

PowerShell -File "C\Users\MyUser\Desktop\PS1\SSAS\wtf.ps1"

下面将我的PowerShell脚本修改为尽可能小,以演示问题,当然还删除了敏感信息。在此先感谢您的帮助,我不知所措。我真的需要从SQL代理处执行此操作,因此我不必猜测处理所依赖的步骤何时完成。

$ErrorActionPreference=”Stop”

Import-Module "SqlServer"

$User = "MyUser@MyDomain.com"
$PWord = ConvertTo-SecureString -String "MyPassword" -AsPlainText -Force
$UserCredential = New-Object -TypeName "System.Management.Automation.PSCredential" -ArgumentList $User,$PWord

$server = "powerbi://api.powerbi.com/v1.0/myorg/MyWorkspace"
$db = "MyModel"

$asResult = Invoke-ProcessPartition -Credential $UserCredential -Server $server -PartitionName "DimDate" -TableName "DimDate" -Database $db  -RefreshType "Full"

我工作中的步骤代码是:

powershell -File "C:\Users\MyUser\Desktop\PS1\SSAS\wtf.ps1"

更新: 我发现,如果我以本地SSAS服务器为目标,则使用SQL Agent方法可以工作完全相同的代码(服务器变量除外),但是我当然不希望切换到本地。 / p>

更新2: 当我右键单击SSMS中的作业,然后单击“启动PowerShell”时,将打开一个SQL Server PowerShell窗口。如果我尝试以这种方式执行脚本,则会收到以下错误消息。正在使用的帐户未启用MFA。

无法使用提供的凭据获取身份验证令牌。 如果您的Active Directory租户管理员已配置 多重身份验证,或者如果您的帐户是Microsoft帐户, 请从连接字符串中删除用户名和密码, 然后重试。然后,系统将提示您输入凭据。

如果我没有使用SQL Server PowerShell窗口将凭据传递给Invoke-ProcessPartition命令,则会提示我输入凭据,并且调用成功。当然,我不能将其用作解决方法,因为我需要它在无人看管的情况下运行。

我还尝试打开PowerShell ISE作为PS脚本中用于对工作区进行身份验证的帐户,并且它也给出与SQL Server代理作业相同的错误。

连接字符串无效。

解决方法

我找到了解决该问题的方法。分辨率是两倍。

第一个问题是,当从SQL Server代理运行PowerShell时,SqlServer模块的版本是较旧的过时版本。我是通过使用以下代码从SQL Server代理作业中执行ps1文件并查看作业历史记录结果来发现这一点的。

Get-Command -module sqlserver invoke*

我尝试跑步

Install-Module sqlserver -AllowClobber -Scope AllUsers  

作为管理员,但它没有更新SQL代理正在运行的SqlServer模块。相反,我创建了一个简单运行的ps1文件

 Install-Module sqlserver -AllowClobber -Scope CurrentUser -Force 

,然后使用SQL Agent CMD任务调用脚本,这将更新SqlServer模块版本。此后,我开始收到一条更有用的错误消息:

无法使用提供的凭据获取身份验证令牌。 如果您的Active Directory租户管理员已配置 多重身份验证,或者如果您的帐户是Microsoft帐户, 请从连接字符串中删除用户名和密码, 然后重试。然后应该提示您输入您的 凭据

对于此新错误消息,我决定尝试通过利用Azure服务主体来提供凭据的另一种方法。这种新方法使包括SQL Server代理作业在内的所有PowerShell方法均获得成功。 Power BI Documentation中概述了实现的步骤。

最终的PS代码如下所示。

$ErrorActionPreference=”Stop”
Import-Module "SqlServer"
$AppId = "AAD_App_Registration_Application_Client_Id"
$TenantId = "AAD_App_Registration_Directory_Tenant_Id"
$AppSecret = "AAD_App_Registration_CertificatesAndSecrets_ClientSecret"
$PWord = ConvertTo-SecureString -String $AppSecret -AsPlainText -Force
$Credential = New-Object -TypeName "System.Management.Automation.PSCredential" -ArgumentList $AppId,$PWord

Invoke-ProcessPartition -Server "powerbi://api.powerbi.com/v1.0/myorg/MyModel" -PartitionName "DimDate" -TableName "DimDate" -Database "MyModel" -RefreshType "Full" -ServicePrincipal -ApplicationId $AppId -TenantId $TenantId -Credential $Credential

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...