簡體   English   中英

Azure Runbook-缺少PowerShell Cmdlet或未針對VM執行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM