如何在Azure Automation PowerShell Runbook中加载Kusto NuGet包并执行查询
在Azure Automation PowerShell Runbook中加载Kusto客户端NuGet包并运行查询
方法一:上传自定义模块(推荐,稳定可靠)
这种方法将Kusto客户端程序集打包成Azure Automation可识别的模块,一次性上传后可重复使用:
步骤1:准备Kusto客户端程序集
下载对应版本的Microsoft.Azure.Kusto.DataNuGet包,解压后提取核心程序集,通常包括:Microsoft.Azure.Kusto.Data.dllMicrosoft.Azure.Kusto.Common.dll- 依赖的基础dll(如
Newtonsoft.Json.dll,具体根据包版本确定)
步骤2:创建模块结构
创建一个名为KustoClient的文件夹,将提取的dll放入其中。然后在本地PowerShell中执行以下命令生成模块清单文件(.psd1):New-ModuleManifest -Path ".\KustoClient\KustoClient.psd1" ` -RootModule "Microsoft.Azure.Kusto.Data.dll" ` -RequiredAssemblies @("Microsoft.Azure.Kusto.Common.dll") ` -ModuleVersion "1.0.0" ` -Description "Kusto Client Module for Azure Automation"步骤3:上传到Azure Automation
将KustoClient文件夹压缩为Zip包(确保文件夹处于Zip根目录,而非直接压缩文件)。登录Azure门户,进入你的Automation账户:- 左侧菜单选择模块 → 添加模块
- 上传生成的Zip包,等待模块导入完成
步骤4:在Runbook中使用
导入模块后,即可直接调用Kusto客户端类:# 可选:显式导入模块(若未自动加载) Import-Module KustoClient # 配置Kusto连接参数 $clusterUri = "https://your-cluster.kusto.windows.net" $databaseName = "your-database" # 从Automation变量中读取服务主体密钥(提前存储敏感信息) $tenantId = "your-tenant-id" $clientId = "your-service-principal-client-id" $clientSecret = Get-AutomationVariable -Name "KustoServicePrincipalSecret" # 创建认证凭据与客户端 $credential = [Microsoft.Azure.Kusto.Data.SdkClientCredentialsFactory]::CreateAadApplicationKeyCredentials($clientId, $clientSecret, $tenantId) $kustoClient = [Microsoft.Azure.Kusto.Data.KustoClientFactory]::CreateCslQueryProvider($clusterUri, $credential) # 运行Kusto查询 $query = "StorageLogs | take 10" $queryResult = $kustoClient.ExecuteQuery($databaseName, $query) # 处理查询结果(转换为PowerShell对象) $resultTable = [Microsoft.Azure.Kusto.Data.DataReaderExtensions]::ToDataSet($queryResult).Tables[0] $resultObjects = foreach ($row in $resultTable.Rows) { $obj = [PSCustomObject]@{} foreach ($col in $resultTable.Columns) { $obj | Add-Member -MemberType NoteProperty -Name $col.ColumnName -Value $row[$col] } $obj } $resultObjects
方法二:Runbook内动态加载程序集(临时场景)
如果不想上传模块,可在Runbook运行时直接下载并加载NuGet包的程序集:
# 定义NuGet包信息 $nugetPackageName = "Microsoft.Azure.Kusto.Data" $packageVersion = "11.0.0" # 替换为你需要的版本 $tempPath = Join-Path $env:TEMP $nugetPackageName # 下载并解压NuGet包 if (-not (Test-Path $tempPath)) { Install-Package -Name $nugetPackageName -RequiredVersion $packageVersion -Destination $tempPath -Force -Scope CurrentUser } # 加载核心程序集 $assemblyPaths = Get-ChildItem -Path $tempPath -Filter "*.dll" -Recurse | Where-Object { $_.Name -in "Microsoft.Azure.Kusto.Data.dll", "Microsoft.Azure.Kusto.Common.dll", "Newtonsoft.Json.dll" } | Select-Object -ExpandProperty FullName foreach ($path in $assemblyPaths) { [System.Reflection.Assembly]::LoadFrom($path) | Out-Null } # 后续连接与查询逻辑同方法一 # ...
注意事项
- 权限配置:确保Runbook使用的身份(如服务主体)拥有Kusto集群的查询权限(可在Kusto门户中配置角色)
- 版本兼容性:选择与Azure Automation沙箱PowerShell版本兼容的Kusto客户端版本(建议使用较新的稳定版)
- 密钥管理:敏感信息(如服务主体密钥)需存储在Azure Automation的变量或凭据资产中,避免硬编码
内容的提问来源于stack exchange,提问作者user9297554
相关产品推荐
相关产品推荐

