Azure Powershell如何通过Runbook获取VM的运行服务?

时间:2017-05-01 18:11:42

标签: powershell azure azure-powershell

我正在尝试编写一个启动VM的Azure Powershell Runbook,然后检查VM上的Windows服务是否正在运行并启动它。

我可以启动虚拟机,但枚举服务无效。我在Azure Runbooks上是全新的,所以我可能做错了什么。我将以下代码仅限于Get-Service位而不是VM启动。

# Returns strings with status messages
[OutputType([String])]

param (
    [Parameter(Mandatory=$false)] 
    [String]  $AzureConnectionAssetName = "AzureRunAsConnection",

    [Parameter(Mandatory=$false)] 
    [String] $ResourceGroupName = ""
)

try {
    # Connect to Azure using service principal auth
    $ServicePrincipalConnection = Get-AutomationConnection -Name $AzureConnectionAssetName         

    Write-Output "Logging in to Azure..."

    $Null = Add-AzureRmAccount `
        -ServicePrincipal `
        -TenantId $ServicePrincipalConnection.TenantId `
        -ApplicationId $ServicePrincipalConnection.ApplicationId `
        -CertificateThumbprint $ServicePrincipalConnection.CertificateThumbprint 
}
catch {
    if(!$ServicePrincipalConnection) {
        throw "Connection $AzureConnectionAssetName not found."
    }
    else {
        throw $_.Exception
    }
}

# If there is a specific resource group, then get all VMs in the resource group,
# otherwise get all VMs in the subscription.
if ($ResourceGroupName) { 
    $VMs = Get-AzureRmVM -ResourceGroupName $ResourceGroupName
}
else { 
    $VMs = Get-AzureRmVM
}

# Try and enumerate the VM's services 
foreach ($VM in $VMs) {
        Write-Output "Listing all services..."
        Write-Output ("VM: {0}" -f $VM.Name)
        $VM | Get-Service | Format-Table -AutoSize

        Write-Output "Listing alternative method..."
        Get-Service -ComputerName $VM.Name | Format-Table -AutoSize
        Write-Output "Finished listing..."
}

输出是这样的:

  

登录Azure ...

     

列出所有服务......

     

VM:demo-0

     

列出替代方法......

     

完成列表......

3 个答案:

答案 0 :(得分:1)

首先,启动VM是异步的,因此您需要等待VM实际启动,并且Get-Service无论如何都无法正常工作,以便从您需要的VM获取服务对该VM进行身份验证,因此用户PSsessions或invoke-command就是这样的。只需了解如何使用PowerShell远程访问服务器或如何向远程PC发出powershell命令。这种情况没什么不同。它与Azure自动化的工作方式无关。

答案 1 :(得分:0)

运行Azure自动化Runbook时,您可以选择azure队列或创建混合工作线程。 azure队列适用于许多进程,但它不能直接访问VM来运行get-service等命令。

要扩展@ 4c74356b41答案,您需要使用远程powershell来执行命令(使用New-PSSession),但您还必须确保这些命令在Azure Automation Hybrid Worker上运行

在下面的评论中,您询问了凭据。您可以在Azure自动化帐户中设置凭据,然后在创建新会话时由脚本使用它们。见this link

答案 2 :(得分:0)

您可以尝试使用以下cmdlet。它对我有用。

telnet IP 5986

使用此脚本之前。首先,您应该在VM的防火墙和NSG上打开端口5896,您可以检查以下link。请确保您可以在本地PC上AzureRM.Network

  1. 您应该将##get Credential from assets $shui=Get-AutomationPSCredential -Name 'shui' $session=New-PSSession -ConnectionUri $Uri -Credential $shui -SessionOption (New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck) 个模块导入自动化帐户。有关如何导入模块的更多信息,请参阅此link
  2. 3.将您的虚拟机密码存储到Runbook,您可以参考此link。如果要使用凭据,可以使用以下脚本:

    import {SebmGoogleMap} from 'angular2-google-maps/core';
    
    @Component({
     selector: 'my-map-cmp',
     directives: [SebmGoogleMap],
     styles: [`
       .sebm-google-map-container {
         height: 300px;
       }
    `],