Powershell Azure 函数失败
Powershell Azure Function Fails
首先,我是 Azure Functions 的新手,使用它才几个星期,所以请多多包涵。我的任务是获取我们的一个 Powershell 脚本,该脚本从我们的 Office 365 租户那里获取用户和许可证,将它们输出到 CSV,然后通过电子邮件将它们发送到受监控的邮箱,并将其移植到 Azure Functions。
经过大量工作后,我设法通过在我的脚本中调用 Powershell.exe 使其工作,因为某些对象返回“未序列化”,阻止了它们从被迭代。 (Known Issue on GitHub)
一切都通过测试 + 代码工作,我将时间触发器设置为 运行 12:00am,但是当我第二天检查收件箱时,我没有收到任何电子邮件。当我检查功能监控时,我为每个迭代的租户列出了以下内容,这似乎是调用 Powershell.exe:
失败的原因
HResult : -2146233087 CategoryInfo : OperationStopped: (:) [],
CryptographicException FullyQualifiedErrorId :
System.Security.Cryptography.CryptographicException InvocationInfo :
ScriptLineNumber : 77 OffsetInLine : 5 HistoryId : -1 ScriptName :
C:\home\site\wwwroot\License_Report_a-f\run.ps1 Line : $ScriptResult =
(&bitPowerShellPath -WindowStyle Hidden -NonInteractive -Command
$Script -Args
$ApplicationId,$credential,$refreshToken,$tenantID,$client.TenantID)
PositionMessage : At
C:\home\site\wwwroot\License_Report_a-f\run.ps1:77 char:5 +
$ScriptResult = (&bitPowerShellPath -WindowStyle Hidden -NonIn … +
PSScriptRoot : C:\home\site\wwwroot\License_Report_a-f PSCommandPath :
C:\home\site\wwwroot\License_Report_a-f\run.ps1 CommandOrigin :
Internal ScriptStackTrace : at ,
C:\home\site\wwwroot\License_Report_a-f\run.ps1: line 77
我对此做了一些调查,发现有人回避了在某些情况下函数无法读取“Profile.ps1”的情况,这就是我想要的 [=32] 的声明=] env 变量,因此作为测试,我在脚本中本地移动了赋值。然后,我在 TimeTrigger 上设置了一个每小时的时间表,并且 运行 整点都很好。然而,在 12:00am 将 TimeTrigger 改回仅 运行,今天早上我再次收到没有电子邮件和同样的错误,似乎排除了“Profile.ps1”问题。
我目前的挫折是该功能在代码 + 测试中运行良好,但似乎如果该功能长时间处于空闲状态,当它再次启动时它无法正确加载某些东西.我在昨天 10:00、11:00、12:00、13:00、14:00 和 15:00 的整点成功 运行ning。然后它在 9 小时内没有旋转,然后失败了。今天早上,我再次将 TimeTrigger 更新为每小时 运行 以查看会发生什么,现在又一次,我收到了电子邮件,所以我感到困惑。再一次,我做了一个改变,几乎“唤醒了机器”,现在一切都恢复正常了。
有没有人以前看过这个或类似的东西,因为我不确定接下来要看哪里。如果您不 运行 x 分钟/x 小时的函数导致问题,是否可能会清除某种缓存?我在网上看了几个小时,但看不到任何类似的东西。非常感谢任何帮助/积分。
看来我可能自己发现了这个问题,但它并没有真正解释到底发生了什么,但它似乎与生成“图形访问令牌”以访问 Office 365 本身有关。
经过上周的一些尝试,我发现我无法在没有上述错误的情况下 运行 脚本,即使在 Azure 上的“测试 + 运行” 中也是如此功能界面。我决定对外部 PowerShell 调用 运行 的脚本进行一些测试,当我删除生成“图形访问令牌”的代码时,脚本成功执行。然后我 re-structured 整个代码,以便在调用外部 PS 脚本之前生成令牌,然后传入访问令牌。
经过周末的测试,我可以确认我已经正确生成并通过电子邮件发送了导出文件,所以现在看起来一切正常。下面是脚本开始的粗略支出,只是为了展示我最终得到的结果。
# Import Modules
Import-Module MsOnline -UseWindowsPowershell
Import-Module PartnerCenter -UseWindowsPowershell
# Get Tokens
$aadGraphToken = New-PartnerAccessToken -ApplicationId $ApplicationId -Credential $credential -RefreshToken $refreshToken -Scopes 'https://graph.windows.net/.default' -ServicePrincipal -Tenant $tenantID
$graphToken = New-PartnerAccessToken -ApplicationId $ApplicationId -Credential $credential -RefreshToken $refreshToken -Scopes 'https://graph.microsoft.com/.default' -ServicePrincipal -Tenant $tenantID
#Connect to Msol
Connect-MsolService -AdGraphAccessToken $aadGraphToken.AccessToken -MsGraphAccessToken $graphToken.AccessToken
# Get Client List
$clientList = Get-MsolPartnerContract -All | Sort-Object -Property Name
# Loop Clients
ForEach ($client in $clientList)
{
$Script = {
param (
[Object]$aadGraphTkn,
[Object]$graphTkn,
[string]$clientTenantID
)
# Import Modules
Import-Module MsOnline
Import-Module PartnerCenter
#Connect to Msol
Connect-MsolService -AdGraphAccessToken $aadGraphTkn.AccessToken -MsGraphAccessToken $graphTkn.AccessToken
# DO OTHER THINGS HERE AND RETURN SOMETHING
}
$ScriptResult = (&$env:64bitPowerShellPath -WindowStyle Hidden -NonInteractive -Command $Script -Args $aadGraphToken,$graphTkn)
}
首先,我是 Azure Functions 的新手,使用它才几个星期,所以请多多包涵。我的任务是获取我们的一个 Powershell 脚本,该脚本从我们的 Office 365 租户那里获取用户和许可证,将它们输出到 CSV,然后通过电子邮件将它们发送到受监控的邮箱,并将其移植到 Azure Functions。
经过大量工作后,我设法通过在我的脚本中调用 Powershell.exe 使其工作,因为某些对象返回“未序列化”,阻止了它们从被迭代。 (Known Issue on GitHub)
一切都通过测试 + 代码工作,我将时间触发器设置为 运行 12:00am,但是当我第二天检查收件箱时,我没有收到任何电子邮件。当我检查功能监控时,我为每个迭代的租户列出了以下内容,这似乎是调用 Powershell.exe:
失败的原因HResult : -2146233087 CategoryInfo : OperationStopped: (:) [], CryptographicException FullyQualifiedErrorId : System.Security.Cryptography.CryptographicException InvocationInfo : ScriptLineNumber : 77 OffsetInLine : 5 HistoryId : -1 ScriptName : C:\home\site\wwwroot\License_Report_a-f\run.ps1 Line : $ScriptResult = (&bitPowerShellPath -WindowStyle Hidden -NonInteractive -Command $Script -Args $ApplicationId,$credential,$refreshToken,$tenantID,$client.TenantID) PositionMessage : At C:\home\site\wwwroot\License_Report_a-f\run.ps1:77 char:5 + $ScriptResult = (&bitPowerShellPath -WindowStyle Hidden -NonIn … +
PSScriptRoot : C:\home\site\wwwroot\License_Report_a-f PSCommandPath : C:\home\site\wwwroot\License_Report_a-f\run.ps1 CommandOrigin : Internal ScriptStackTrace : at , C:\home\site\wwwroot\License_Report_a-f\run.ps1: line 77
我对此做了一些调查,发现有人回避了在某些情况下函数无法读取“Profile.ps1”的情况,这就是我想要的 [=32] 的声明=] env 变量,因此作为测试,我在脚本中本地移动了赋值。然后,我在 TimeTrigger 上设置了一个每小时的时间表,并且 运行 整点都很好。然而,在 12:00am 将 TimeTrigger 改回仅 运行,今天早上我再次收到没有电子邮件和同样的错误,似乎排除了“Profile.ps1”问题。
我目前的挫折是该功能在代码 + 测试中运行良好,但似乎如果该功能长时间处于空闲状态,当它再次启动时它无法正确加载某些东西.我在昨天 10:00、11:00、12:00、13:00、14:00 和 15:00 的整点成功 运行ning。然后它在 9 小时内没有旋转,然后失败了。今天早上,我再次将 TimeTrigger 更新为每小时 运行 以查看会发生什么,现在又一次,我收到了电子邮件,所以我感到困惑。再一次,我做了一个改变,几乎“唤醒了机器”,现在一切都恢复正常了。
有没有人以前看过这个或类似的东西,因为我不确定接下来要看哪里。如果您不 运行 x 分钟/x 小时的函数导致问题,是否可能会清除某种缓存?我在网上看了几个小时,但看不到任何类似的东西。非常感谢任何帮助/积分。
看来我可能自己发现了这个问题,但它并没有真正解释到底发生了什么,但它似乎与生成“图形访问令牌”以访问 Office 365 本身有关。
经过上周的一些尝试,我发现我无法在没有上述错误的情况下 运行 脚本,即使在 Azure 上的“测试 + 运行” 中也是如此功能界面。我决定对外部 PowerShell 调用 运行 的脚本进行一些测试,当我删除生成“图形访问令牌”的代码时,脚本成功执行。然后我 re-structured 整个代码,以便在调用外部 PS 脚本之前生成令牌,然后传入访问令牌。
经过周末的测试,我可以确认我已经正确生成并通过电子邮件发送了导出文件,所以现在看起来一切正常。下面是脚本开始的粗略支出,只是为了展示我最终得到的结果。
# Import Modules
Import-Module MsOnline -UseWindowsPowershell
Import-Module PartnerCenter -UseWindowsPowershell
# Get Tokens
$aadGraphToken = New-PartnerAccessToken -ApplicationId $ApplicationId -Credential $credential -RefreshToken $refreshToken -Scopes 'https://graph.windows.net/.default' -ServicePrincipal -Tenant $tenantID
$graphToken = New-PartnerAccessToken -ApplicationId $ApplicationId -Credential $credential -RefreshToken $refreshToken -Scopes 'https://graph.microsoft.com/.default' -ServicePrincipal -Tenant $tenantID
#Connect to Msol
Connect-MsolService -AdGraphAccessToken $aadGraphToken.AccessToken -MsGraphAccessToken $graphToken.AccessToken
# Get Client List
$clientList = Get-MsolPartnerContract -All | Sort-Object -Property Name
# Loop Clients
ForEach ($client in $clientList)
{
$Script = {
param (
[Object]$aadGraphTkn,
[Object]$graphTkn,
[string]$clientTenantID
)
# Import Modules
Import-Module MsOnline
Import-Module PartnerCenter
#Connect to Msol
Connect-MsolService -AdGraphAccessToken $aadGraphTkn.AccessToken -MsGraphAccessToken $graphTkn.AccessToken
# DO OTHER THINGS HERE AND RETURN SOMETHING
}
$ScriptResult = (&$env:64bitPowerShellPath -WindowStyle Hidden -NonInteractive -Command $Script -Args $aadGraphToken,$graphTkn)
}