Azure Runbook - 缺少PowerShell Cmdlet或未针对VM执行

时间:2017-02-01 15:55:52

标签: powershell azure azure-automation

我需要在Azure自动化Runbook上的VM上执行PowerShell,类似于WinRm执行/ PowerShell远程处理。

我已经通过Azure自动化GUI创建了一个Azure Runbook,并且我正在尝试运行一个与物理机和虚拟机完美配合的脚本,以获取关键的系统信息和端口。我能够在Azure中进行身份验证,看起来我可以通过Azure Runbook执行脚本的某些方面(除非它只针对Azure Automation Worker运行),例如获取已安装的PowerShell版本的目标VM使用:$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模块,但我不确定在哪里找到这些OR这是我没有正确定位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自动化安全方法(非经典),所以我不相信证书会发挥作用。以下是我试图定位虚拟机的方法(我怀疑它是错误的/应该更改):

$Resources = Get-AzureRmResource -ResourceType "Microsoft.Compute/virtualMachines" -ResourceGroupName "MyTestGroup" -ResourceName "MyTestVM"
ForEach ($Resource in $Resources)
{
# PowerShell Code from Above here
}

更新1:

既然我们已经确定我没有正确定位VM,我尝试了Joe的推荐,但是当我尝试运行以下内容时,我在WinRm上遇到错误。我找到了Connect-AzureVM.ps1,但不确定这是旧的还是与我正在使用的较新的RunAs连接对齐。这是我当前尝试连接到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

2 个答案:

答案 0 :(得分:1)

您需要将要运行这些脚本的VM作为Azure自动化混合工作程序添加,以便您可以将脚本定位在它们上运行,或者您需要从运行Azure Automation'自己的工作人员,远程进入每个VM,并从远程控制块中运行命令。

对于前者,请参阅:https://docs.microsoft.com/en-us/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
}

答案 1 :(得分:1)

在提升的提示符下在VM内运行

https://gist.github.com/jeffpatton1971/2321f0db8025e48ad8ec13c243153045

从您的Runbook内部做任何通常的连接,但创建一些会话选项以传递您的invoke命令。

$ SessionOption = New-PSSessionOption -SkipCACheck -SkipCNCheck

Invoke-Command -ComputerName $ VMname -Credential $ Credential -UseSSL -SessionOption $ SessionOption -ScriptBlock {}