首先,我是 Azure Functions 的新手,并且只使用了幾個星期,所以請多多包涵。我的任務是獲取我們的一個 Powershell 腳本,該腳本從我們的 Office 365 租戶獲取用戶和許可證,將它們輸出到 CSV,然后通過電子郵件將它們發送到受監控的郵箱,并將其移植到 Azure 函式。
經過大量作業后,我設法在我的腳本中使用對 Powershell.exe 的呼叫使其作業,因為某些物件回傳“未序列化”,從而防止它們被迭代。(GitHub 上的已知問題)
一切都通過測驗 代碼運行,我將時間觸發器設定為在上午 12:00 運行,但是當我第二天檢查我的收件箱時,我沒有任何電子郵件。當我檢查功能監控時,我為每個迭代的租戶列出了以下內容,這似乎是呼叫 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 行:$ScriptResult = (&$64bitPowerShellPath -WindowStyle Hidden -NonInteractive -Command $Script -Args $ApplicationId,$credential,$refreshToken,$tenantID,$client.TenantID) PositionMessage:在 C:\home\site \wwwroot\License_Report_a-f\run.ps1:77 char:5 $ScriptResult = (&$64bitPowerShellPath -WindowStyle Hidden -NonIn ...
PSScriptRoot : C:\home\site\wwwroot\License_Report_a-f PSCommandPath : C:\home\site\wwwroot\License_Report_a-f\run.ps1 CommandOrigin : 內部 ScriptStackTrace : at , C:\home\site\wwwroot\License_Report_a- f\run.ps1:第 77 行
我對此進行了一些調查,發現有人在某些情況下無法讀取函式無法讀取“Profile.ps1”,這是我要宣告的 Powershell.exe env 變數的地方,所以作為我移動的測驗在腳本中本地分配。然后我在 TimeTrigger 上設定了一個每小時的時間表,它每小時運行良好。然而,將 TimeTrigger 改回僅在上午 12:00 運行,今天早上我再次收到沒有電子郵件和同樣的錯誤,似乎排除了“Profile.ps1”問題。
我目前的挫敗感是該函式在 Code Test 中運行良好,但如果該函式長時間處于空閑狀態,當它再次啟動時,它似乎無法正確加載某些內容。我在昨天 10:00、11:00、12:00、13:00、14:00 和 15:00 的整點成功運行。然后它在 9 小時內沒有旋轉,然后它失敗了。今天早上,我再次更新了 TimeTrigger 以每小時運行一次,看看會發生什么,現在又一次收到了電子郵件,所以我很困惑。再一次,我做了一個改變,幾乎“喚醒了機器”,現在一切都恢復正常了。
有沒有人見過這個或類似的東西,因為我不知道下一步該去哪里看。如果您在 x 分鐘 / x 小時內沒有運行導致問題的函式,是否可能會清除某種快取?我在網上看了幾個小時,但我看不到任何類似的東西。任何幫助/積分將不勝感激。
uj5u.com熱心網友回復:
所以看起來我自己可能已經發現了這個問題,但是它并沒有真正解釋到底發生了什么,但它似乎與生成“圖形訪問令牌”以訪問 Office 365 本身有關。
在上周玩了一些之后,我已經到了一個地步,即使在 Azure Functions 界面上的“測驗 運行”中,我也無法在沒有上述錯誤的情況下運行腳本。我決定對外部 PowerShell 呼叫運行的腳本進行一些測驗,當我洗掉生成“圖形訪問令牌”的代碼時,腳本成功執行。然后我重新構建了整個代碼,以便在呼叫外部 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)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/475544.html
