Powershell - 无需硬编码密码即可自动连接到 Power BI 服务
Powershell - automated connection to Power BI service without hardcoding password
我们有一个 PowerShell 脚本来提取 Power BI activity 数据(使用 Get-PowerBIActivityEvent),我一直在尝试使其自动化,以便它可以每天使用无人值守的帐户提取此数据。问题是脚本必须使用 Connect-PowerBIServiceAccount cmdlet,这需要凭据。我不想在任何地方(显然)对密码进行硬编码,并且理想情况下不希望将其作为明文参数传递到脚本中以防内存泄漏。
我曾尝试使用 SSIS 作为调度机制,因为它允许在脚本任务中使用加密参数,但无法使用 SecureString 参数调用 PS 脚本,因为 System.Management.Automation 命名空间不可用't 在 GAC 中(命令行调用是不可能的)。
我不相信任务调度程序会提供所需的功能。
有谁知道使用加密凭据连接到 power BI 服务的优雅方法吗?
在 docs of Connect-PowerBIServiceAccount
中有 2 个无人值守登录选项:
使用 -Credential
,将 AAD 客户端 ID 作为用户名传递,将应用程序密钥作为密码传递
使用-CertificateThumbprint
和-ApplicationId
对于这两个选项,您都需要配置服务主体并添加适当的权限。我不会详细介绍如何配置它,但很可能您需要(至少)以下应用程序权限:
我不太确定您在脚本中需要什么功能,但根据我的经验,大多数情况都可以通过计划任务来解决,因此下面的解释将适用于该解决方案。
如何保护凭据?
有多种可能的解决方案,具体取决于您的喜好。我认为基于证书的身份验证更安全(证书仅适用于机器的当前 user/all 用户)。
基于证书的身份验证很重要 - 确保证书可用于帐户 运行 脚本(在许多情况下它是服务帐户,而不是您的用户帐户)。
我怎样才能获得更多?
如果需要,您可以将应用程序 ID 存储为安全字符串(我没有要测试的 SSIS,所以我不确定是否有任何解决方法可以让它在其中工作)或使用 Export-CliXml
.他们使用 Windows 数据保护 API (DPAPI),因此文件只能由用于加密的帐户解密。
为了增加一层安全性(我什至没有提到设置正确的文件访问权限,因为这很明显)你可以把文件放在加密的文件夹中(你可能已经有了磁盘加密的解决方案,所以如果你愿意的话就用它吧)。
可能有一些解决方案可以更好地保护密钥,但这些应该可以完成工作。我正在使用具有类似方法的其他 Microsoft 365 模块(Outlook、SharePoint PnP)并且效果很好。
注意:如果您需要使用用户帐户而不是服务主体,请确保您已针对该特定应用程序在该帐户上禁用多重身份验证。
相关文档 (https://docs.microsoft.com/en-us/power-bi/developer/embedded/embed-service-principal) 指出管理 API(即通过 Get-PowerBiActivityEvent 提供的 API)当前不支持服务主体。这意味着目前无法在无人值守的情况下使用已注册的应用 运行 这些 cmdlet。
目前有一个开放的功能请求可以提供此功能:https://ideas.powerbi.com/forums/265200-power-bi-ideas/suggestions/39641572-need-service-principle-support-for-admin-api
我们有一个 PowerShell 脚本来提取 Power BI activity 数据(使用 Get-PowerBIActivityEvent),我一直在尝试使其自动化,以便它可以每天使用无人值守的帐户提取此数据。问题是脚本必须使用 Connect-PowerBIServiceAccount cmdlet,这需要凭据。我不想在任何地方(显然)对密码进行硬编码,并且理想情况下不希望将其作为明文参数传递到脚本中以防内存泄漏。
我曾尝试使用 SSIS 作为调度机制,因为它允许在脚本任务中使用加密参数,但无法使用 SecureString 参数调用 PS 脚本,因为 System.Management.Automation 命名空间不可用't 在 GAC 中(命令行调用是不可能的)。 我不相信任务调度程序会提供所需的功能。
有谁知道使用加密凭据连接到 power BI 服务的优雅方法吗?
在 docs of Connect-PowerBIServiceAccount
中有 2 个无人值守登录选项:
使用
-Credential
,将 AAD 客户端 ID 作为用户名传递,将应用程序密钥作为密码传递使用
-CertificateThumbprint
和-ApplicationId
对于这两个选项,您都需要配置服务主体并添加适当的权限。我不会详细介绍如何配置它,但很可能您需要(至少)以下应用程序权限:
我不太确定您在脚本中需要什么功能,但根据我的经验,大多数情况都可以通过计划任务来解决,因此下面的解释将适用于该解决方案。
如何保护凭据?
有多种可能的解决方案,具体取决于您的喜好。我认为基于证书的身份验证更安全(证书仅适用于机器的当前 user/all 用户)。
基于证书的身份验证很重要 - 确保证书可用于帐户 运行 脚本(在许多情况下它是服务帐户,而不是您的用户帐户)。
我怎样才能获得更多?
如果需要,您可以将应用程序 ID 存储为安全字符串(我没有要测试的 SSIS,所以我不确定是否有任何解决方法可以让它在其中工作)或使用 Export-CliXml
.他们使用 Windows 数据保护 API (DPAPI),因此文件只能由用于加密的帐户解密。
为了增加一层安全性(我什至没有提到设置正确的文件访问权限,因为这很明显)你可以把文件放在加密的文件夹中(你可能已经有了磁盘加密的解决方案,所以如果你愿意的话就用它吧)。
可能有一些解决方案可以更好地保护密钥,但这些应该可以完成工作。我正在使用具有类似方法的其他 Microsoft 365 模块(Outlook、SharePoint PnP)并且效果很好。
注意:如果您需要使用用户帐户而不是服务主体,请确保您已针对该特定应用程序在该帐户上禁用多重身份验证。
相关文档 (https://docs.microsoft.com/en-us/power-bi/developer/embedded/embed-service-principal) 指出管理 API(即通过 Get-PowerBiActivityEvent 提供的 API)当前不支持服务主体。这意味着目前无法在无人值守的情况下使用已注册的应用 运行 这些 cmdlet。
目前有一个开放的功能请求可以提供此功能:https://ideas.powerbi.com/forums/265200-power-bi-ideas/suggestions/39641572-need-service-principle-support-for-admin-api