[英]Azure Runbooks - Missing PowerShell Cmdlets Or Not Executing Against a VM
我需要從Azure Automation Runbook在VM上執行PowerShell,類似於WinRm執行/ PowerShell Remoting。
我已經通過Azure自動化GUI創建了Azure Runbook,並且正在嘗試運行一個可與物理和虛擬機完美配合的腳本,以獲取關鍵的系統信息和端口。 我能夠在Azure中進行身份驗證,並且看來我可以通過Azure Runbook執行腳本的某些方面(除非僅針對Azure Automation Worker運行),例如,使用以下方法獲取目標VM的已安裝PowerShell版本: $PSVersionTable.PSVersion
因此我所知道的安全性/訪問權限沒有問題。
但是,其他幾個組件也會失敗,並且我不知道是否需要將模塊導入到Azure自動化,如果需要,則導入哪個組件。 或者,如果失敗是因為它是針對Worker而不是針對VM運行的。
這是我正在運行的一些代碼片段:
$computerSystem = Get-CimInstance Win32_ComputerSystem
"CPU: " + $computerCPU.Name
Get-WmiObject -Class Win32_LogicalDisk |
Where-Object {$_.DriveType -ne 5} |
Sort-Object -Property Name |
Select-Object Name, VolumeName, FileSystem, Description, `
@{"Label"="DiskSize(GB)";"Expression"={"{0:N}" -f ($_.Size/1GB) -as [float]}}, `
@{"Label"="FreeSpace(GB)";"Expression"={"{0:N}" -f ($_.FreeSpace/1GB) -as [float]}}, `
@{"Label"="%Free";"Expression"={"{0:N}" -f ($_.FreeSpace/$_.Size*100) -as [float]}} |
Format-Table -AutoSize
Get-NetAdapter -Name "*" | Format-Table
Get-NetOffloadGlobalSetting | Format-List
Test-NetConnection -Port 80
這是錯誤消息,由於缺少需要上載的PowerShell模塊,我強烈懷疑這些錯誤消息,但是不確定在哪里找到這些錯誤消息,或者這是我未正確定位VM而是針對AZ運行該錯誤消息的情況主辦? (如果是,那么如何定位單個VM的任何好的示例):
Get-CimInstance:指定的服務不存在為已安裝的服務。
Get-WmiObject:指定的服務不存在為已安裝的服務。
Get-NetAdapter:術語“ Get-NetAdapter”未被識別為cmdlet,函數,腳本文件或可運行程序的名稱。
Get-NetOffloadGlobalSetting:術語“ Get-NetOffloadGlobalSetting”未被識別為cmdlet,函數,腳本文件或可操作程序的名稱。
Test-NetConnection:術語“ Test-NetConnection”不被視為cmdlet,函數,腳本文件或可運行程序的名稱。
如果正確定向虛擬機存在問題,我需要一些指導。 我懷疑我的目標是運行Runbook的Worker,而不是實際的VM。 我正在使用RunAs帳戶/新的Azure自動化安全方法(不是經典方法),因此我認為證書不起作用。 這是我嘗試定位VM的方式(我懷疑這是錯誤的/應該更改):
$Resources = Get-AzureRmResource -ResourceType "Microsoft.Compute/virtualMachines" -ResourceGroupName "MyTestGroup" -ResourceName "MyTestVM"
ForEach ($Resource in $Resources)
{
# PowerShell Code from Above here
}
更新1:
既然我們確定我沒有正確定位虛擬機,我嘗試了Joe的建議,但是當我嘗試運行以下命令時,WinRm出現錯誤。 我找到了Connect-AzureVM.ps1 ,但是不確定它是舊的還是與我正在使用的較新的RunAs Connection對齊。 這是我當前嘗試連接到VM並調用PowerShell的腳本。
param(
[parameter(Mandatory=$true)][String] 'https://myvmname.eastus.cloudapp.azure.com:5986,
[parameter(Mandatory=$true)][String] 'MyVMName'
)
$connectionName = "AzureRunAsConnection"
try
{
# Get the connection "AzureRunAsConnection "
$servicePrincipalConnection=Get-AutomationConnection -Name $connectionName
"Logging in to Azure..."
Add-AzureRmAccount `
-ServicePrincipal `
-TenantId $servicePrincipalConnection.TenantId `
-ApplicationId $servicePrincipalConnection.ApplicationId `
-CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint
}
catch {
if (!$servicePrincipalConnection)
{
$ErrorMessage = "Connection $connectionName not found."
throw $ErrorMessage
} else{
Write-Error -Message $_.Exception
throw $_.Exception
}
}
# Get credentials to Azure VM
$Credential = Get-AutomationPSCredential -Name $VMCredentialName
Invoke-Command -ConnectionUri $Uri -Credential $Credential -ScriptBlock {
# My PowerShell Here
}
這是腳本產生的錯誤。 我懷疑是因為我需要在要定位的VM上導入/創建WinRM證書,但是不確定Connect-AzureVM.ps1是否是正確的腳本,或者是否有其他/更多更新的方法可用於WinRM訪問:
[myvmname.eastus.cloudapp.azure.com]連接到遠程服務器myvmname.eastus.cloudapp.azure.com失敗,並顯示以下錯誤消息:WinRM無法完成操作。 驗證指定的計算機名稱是否有效,可通過網絡訪問該計算機以及是否已啟用WinRM服務的防火牆例外並允許從該計算機進行訪問。 默認情況下,公共配置文件的WinRM防火牆例外將限制對同一本地子網內的遠程計算機的訪問。 有關更多信息,請參見about_Remote_Troubleshooting幫助主題。 + CategoryInfo:OpenError:(myvmname.eastus.cloudapp.azure.com:String)[],PSRemotingTransportException + FullyQualifiedErrorId:WinRMOperationTimeout,PSSessionStateBroken
您需要添加要在其上運行這些腳本的VM作為Azure自動化混合工作程序,以便可以將腳本作為目標在其上運行,或者需要從在Azure自動化自己的工作程序上運行的運行簿中遠程訪問每個VM並在遠程處理模塊中運行命令。
對於前者,請參閱: https : //docs.microsoft.com/zh-cn/azure/automation/automation-hybrid-runbook-worker
對於梯子:
Invoke-Command -ConnectionUri $Uri -Credential $Credential -ScriptBlock {
$computerSystem = Get-CimInstance Win32_ComputerSystem
"CPU: " + $computerCPU.Name
Get-WmiObject -Class Win32_LogicalDisk |
Where-Object {$_.DriveType -ne 5} |
Sort-Object -Property Name |
Select-Object Name, VolumeName, FileSystem, Description, `
@{"Label"="DiskSize(GB)";"Expression"={"{0:N}" -f ($_.Size/1GB) -as [float]}}, `
@{"Label"="FreeSpace(GB)";"Expression"={"{0:N}" -f ($_.FreeSpace/1GB) -as [float]}}, `
@{"Label"="%Free";"Expression"={"{0:N}" -f ($_.FreeSpace/$_.Size*100) -as [float]}} |
Format-Table -AutoSize
Get-NetAdapter -Name "*" | Format-Table
Get-NetOffloadGlobalSetting | Format-List
Test-NetConnection -Port 80
}
在提升的提示下在VM內部運行此命令
https://gist.github.com/jeffpatton1971/2321f0db8025e48ad8ec13c243153045
在您的Runbook內部,通常可以進行連接,但是創建一些會話選項以傳遞invoke命令。
$ SessionOption = New-PSSessionOption -SkipCACheck -SkipCNCheck
調用命令-計算機名$ VMname-憑據$憑據-UseSSL -SessionOption $ SessionOption -ScriptBlock {}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.