【问题标题】:Send and Extract zip file to azure VM using powershell使用 powershell 将 zip 文件发送并提取到 azure VM
【发布时间】:2020-02-19 18:55:26
【问题描述】:

我正在尝试将 zip 文件发送并解压缩到 azure VM,但无法连接到远程 Azure VM。

代码

$cred = Get-Credential
$SO = New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck
$session = New-PSSession -ConnectionUri 'http://xx.xx.xxx.xxx:3389' -Credential $cred -SessionOption $SO

Send-File -Path C:\testArchive.zip -Destination C:\ -Session $session
Expand-Archive -Path C:\testArchive.zip -DestinationPath C:\ -Session $session

错误

New-PSSession : [xx.xx.xxx.xxx] Connecting to remote server xx.xx.xxx.xxx 
failed with the following error message : The client cannot connect to the 
destination specified in the request. Verify that the service on the 
destination is running and is accepting requests. Consult the logs and 
documentation for the WS-Management service running on the destination, most 
commonly IIS or WinRM. If the destination is the WinRM service, run the 
following command on the destination to analyze and configure the WinRM 
service: "winrm quickconfig". For more information, see the 
about_Remote_Troubleshooting Help topic.
At line:4 char:12
+ $session = New-PSSession -ConnectionUri 'http://xx.xx.xxx.xxx:3389' - ...
+            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OpenError: (System.Manageme....RemoteRunspace:Re 
   moteRunspace) [New-PSSession], PSRemotingTransportException
    + FullyQualifiedErrorId : CannotConnect,PSSessionOpenFailed

以下是我在 azure VM 上运行“winrm quickconfig”命令时的输出

WinRM service is already running on this machine.
WinRM is already set up for remote management on this computer.

当我运行“Enter-PSSession -ComputerName LoadTestVm -Port 3389 -Credential qa-admin”时

Enter-PSSession : Connecting to remote server LoadTestVm failed with the following error 
message : The WinRM client cannot process the request because the server name cannot be 
resolved. For more information, see the about_Remote_Troubleshooting Help topic.
At line:1 char:1
+ Enter-PSSession -ComputerName LoadTestVm -Port 3389 -Credential qa-ad ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (LoadTestVm:String) [Enter-PSSession], PSRem 
   otingTransportException
    + FullyQualifiedErrorId : CreateRemoteRunspaceFailed

【问题讨论】:

  • 如果您只是执行Enter-PSSession -ComputerName VMName 并在出现提示时输入凭据,是否可行?如果没有,你已经找到了你的问题。如果是,那么您的 $cred 对象可能有问题。尝试$cred = Get-Credential 并手动输入用户名/密码对,然后将该对象提供给您的New-PSSession,看看是否可行。
  • 用输出更新了问题。 @马修

标签: powershell virtual-machine rdp winrm azure-vm


【解决方案1】:

WINRM 将在端口 5985 和 5986 上运行。端口 5985 用于 HTTP,5986 用于 HTTPS。默认情况下,如果您没有使用-port 指定它,它会使用端口 5985。您应该指定端口 5985 而不是 3389,如果有,也应在 NSG 中启用它。所以你可以运行Enter-PSSession -ComputerName "PublicIPaddress of VM" -Port 5985 -Credential $cred

这对我有用。

Copy-Item -Path D:\nancy\4.zip -Destination C:\ –ToSession $session

Invoke-Command -Session $session -ScriptBlock { Expand-Archive -Path C:\4.zip -DestinationPath C:\ }

更多参考资料:

https://www.assistanz.com/access-azure-windows-vm-through-powershell/

https://geekdudes.wordpress.com/2016/11/16/enabling-remote-powershell-connection-to-azure-virtual-machine/

https://mohitgoyal.co/2016/11/10/enable-powershell-remoting-on-azure-rm-virtual-machines/

【讨论】:

  • 现在我可以成功创建会话了。 “发送文件”和“扩展存档”中存在一些问题。您能帮忙发送 zip 文件并在 vm 上解压吗?
【解决方案2】:

这并不是真正的风险管理/安全方面的最佳实践。

<#
$username = 'qa-admin'
$pass = ConvertTo-SecureString -string 'xxxxxxxx' -AsPlainText -Force
#>

这...

<#
$cred = New-Object -typename System.Management.Automation.PSCredential -argumentlist $username, $pass
#>

...为此有一个内置的 cmdlet。

切勿在脚本中传递明文密码。要么:

  1. 提示他们
  2. 从安全的预创建文件中读取它们

Quickly and securely storing your credentials – PowerShell

Working with Passwords, Secure Strings and Credentials in Windows PowerShell

  1. 来自 Windows 凭据管理器

CredentialManager 2.0

Accessing Windows Credentials Manager from PowerShell

How to Manage Secrets and Passwords with CredentialManager and PowerShell

$cred = Get-Credential -Credential $env:USERNAME

这...

$session = New-PSSession -ConnectionUri 'http://xx.xx.xxx.xxx:3389' -Credential $cred -SessionOption (New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck)

...不正确。你不可以做这个。您需要将上述结果传递给 -SessionOption 参数。

Get-Help -Name New-PSSessionOption -Examples

<#
NAME
    New-PSSessionOption

SYNOPSIS
    Creates an object that contains advanced options for a PSSession.


Example 1: Create a default session option

    PS C:\>New-PSSessionOption
...

This command creates a session option object that has all of the default values.
Example 2: Configure a session by using a session option object

    PS C:\>$pso = New-PSSessionOption -Culture "fr-fr" -MaximumReceivedObjectSize 10MB
    PS C:\>New-PSSession -ComputerName Server01 -SessionOption $pso

...

Example 3: Start an interactive session

    PS C:\>Enter-PSSession -ComputerName Server01 -SessionOption (New-PSSessionOption -NoEncryption -NoCompression)

...
Example 4: Modify a session option object

    PS C:\>$a = New-PSSessionOption
...

PS C:\> $a.UICulture = (Get-UICulture)
PS C:\> $a.OpenTimeout = (New-Timespan -Minutes 4)
PS C:\> $a.MaximumConnectionRedirectionCount = 1
PS C:\> $a

...

Example 5: Create a preference variable

    PS C:\>$PSSessionOption = New-PSSessionOption -OpenTimeOut 120000

...

Example 6: Fulfill the requirements for a remote session configuration

    PS C:\>$skipCN = New-PSSessionOption -SkipCNCheck
    PS C:\>New-PSSession -ComputerName 171.09.21.207 -UseSSL -Credential Domain01\User01 -SessionOption $SkipCN

...

Example 7: Make arguments available to a remote session

    PS C:\>$team = @{Team="IT"; Use="Testing"}
    PS C:\>$TeamOption = New-PSSessionOption -ApplicationArguments $team
    PS C:\>$s = New-PSSession -ComputerName Server01 -SessionOption $TeamOption
    PS C:\>Invoke-Command -Session $s {$PSSenderInfo.SpplicationArguments}

...

    PS C:\>Invoke-Command -Session $s {if ($PSSenderInfo.ApplicationArguments.Use -ne "Testing") {.\logFiles.ps1} else {"Just testing."}}
...
#>

所以,你的是……

$SO       = New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck
$session  = New-PSSession -ConnectionUri 'http://xx.xx.xxx.xxx:3389' -Credential $cred -SessionOption $SO

# Process other actions
Send-File -Path C:\testArchive.zip -Destination C:\ -Session $session
Expand-Archive -Path C:\testArchive.zip -DestinationPath C:\ -Session $session

【讨论】:

  • 谢谢。好的,忘记通过脚本传递参数。尽管如此,当我在运行时提供凭据时,错误是相同的。我更新了问题。
  • 如果您将凭据传递给已加入域的资源,则需要在 DomainName\Username 和密码中,而不仅仅是用户名和密码。如果您要跨域、跨林,那么您将遇到 Windows 双跃点身份验证问题。还有关于如何解决这个问题的文档。如果这是一个工作组,则需要在主机和目标上进行更多设置。
猜你喜欢
  • 1970-01-01
  • 2021-07-14
  • 2018-08-18
  • 2018-10-26
  • 2019-07-07
  • 1970-01-01
  • 1970-01-01
  • 2014-04-16
  • 1970-01-01
相关资源
最近更新 更多