我需要在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
答案 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 {}