Azure的PowerShell如何获得通过运行手册运行一个虚拟机的服务?(Azure Powers

2019-09-27 15:23发布

我试图写一个Azure的PowerShell的运行手册,将启动一个虚拟机,然后或者检查是否在虚拟机上Windows服务运行不启动它。

我能得到的VM开始,但历数服务无法正常工作。 我是全新的在Azure上运行手册,所以我可以做一些错误的。 我限制了下面的代码只对Get-Service比特,而不是虚拟机启动。

# 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:演示0

清单另一种方法...

成品上市...

Answer 1:

当您运行Azure的自动化运行手册,你有蔚蓝的队列的选择或创建一个混合的工人。 湛蓝的队列是好了许多进程,但它不会有访问虚拟机直接运行,如获得服务的命令。

为了扩大对@ 4c74356b41答案,你需要使用远程PowerShell来执行(使用命令新的PSSession ),但你也必须确保这些命令上运行Azure的自动化混合工

在下面的评论,你问凭据。 您可以在Azure的自动化帐户凭据,然后让他们创建一个新的会话时所使用的脚本。 请参阅此链接



Answer 2:

好吧,首先,启动VM是异步的,所以你需要等待VM真正启动,以及Get-Service不会无论如何努力,才能得到从VM,你需要针对VM认证服务,所以无论用户PSSession中或调用命令,类似的东西。 只要看看如何远程连接到使用PowerShell或如何发出PowerShell命令来远程PC的服务器。 这种情况是没有什么不同的。 而且它有无关Azure的自动化的工作。



Answer 3:

你可以尝试使用以下cmdlet。 这个对我有用。

# Try and enumerate the VM's services 
foreach ($VM in $VMs) {
        Write-Output "Listing all services..."
        Write-Output ("VM: {0}" -f $VM.Name)
        $ResourceGroupName=$VM.ResourceGroupName
        $Name=$VM.Name
        $status=(Get-AzureRmVM -ResourceGroupName $ResourceGroupName -Name $Name -Status).Statuses[1].code
        if($status -like "PowerState/deallocated")
        {
            Write-Output "VM is stopped, starting VM"
            if (Start-AzureRmVm -ResourceGroupName $ResourceGroupName -Name $Name)
            {
                Write-Output "Start VM successfuly"
            }else
            {
                Write-Output "Start VM failed"
                break
            }

        }
        ##get VM's Public IP
        $nicName = ($VM.NetworkInterfaceIDs[0] -split '/')[-1]
        $pip = (Get-AzureRmNetworkInterface -Name $nicName -ResourceGroupName $ResourceGroupName).IpConfigurations.publicipaddress.id
        $PublicIP=(Get-AzureRmPublicIpAddress -ResourceGroupName shui -Name ($pip -split '/')[-1]).IpAddress

        $Uri="http://$($PublicIP):5986"
        Write-Output "Get ConnectionUri $Uri"

        ##get Credential from assets
        $shui=Get-AutomationPSCredential -Name 'shui' 

        $session=New-PSSession -ConnectionUri $Uri -Credential $shui -SessionOption (New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck)

        $result=Invoke-Command -Session $session -ScriptBlock {ipconfig}
        Write-Output "$result"
        Write-Output "Finished listing..."
}

在你使用这个脚本。 首先,你应该在你的虚拟机的防火墙和NSG打开端口5896,你可以检查如下面的链接 。 请确保你可以telnet IP 5986在本地PC上。

  1. 你应该导入AzureRM.Network模块的自动化帐户。 有关如何导入模块,请参阅更多的相关信息的链接 。

3.Store您的VM的passord到运行手册,你可以参考这个链接 。 当你想使用的凭证,你可以使用下面的脚本:

##get Credential from assets
$shui=Get-AutomationPSCredential -Name 'shui' 

$session=New-PSSession -ConnectionUri $Uri -Credential $shui -SessionOption (New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck)


文章来源: Azure Powershell how to get running services of a VM via Runbook?