the specific pssession psremoting following example enable created commands closed are and powershell winrm

pssession - session specific commands in powershell



Enviar archivos a través de PSSession (5)

Acabo de grabar un par de horas en busca de una solución para enviar archivos a través de una PSSession activa. Y el resultado es nada, niente. Estoy intentando invocar un comando en una computadora remota durante una sesión activa, que debería copiar algo de un almacenamiento de red. Entonces, básicamente esto es:

icm -Session $s { Copy-Item $networkLocation $PCLocation }

Debido al problema del "segundo salto", no puedo hacer eso directamente, y porque estoy ejecutando Win Server 2003, no puedo habilitar CredSSP. Primero podría copiar los archivos a mi computadora y luego enviarlos / enviarlos a la máquina remota, pero ¿cómo? Probé PModem , pero como lo vi, solo puede extraer datos y no enviar datos.

Cualquier ayuda es apreciada.


Esto ahora es posible en PowerShell / WMF 5.0

Copy-Item tiene los parámetros -FromSession y -toSession . Puedes usar uno de estos y pasar una variable de sesión.

p.ej.

$cs = New-PSSession -ComputerName 169.254.44.14 -Credential (Get-Credential) -Name SQL Copy-Item Northwind.* -Destination "C:/Program Files/Microsoft SQL Server/MSSQL10_50.SQL2008R2/MSSQL/DATA/" -ToSession $cs

Vea más ejemplos en https://richardspowershellblog.wordpress.com/2015/05/28/copy-files-over-ps-remoting-sessions/


Hace un tiempo enfrenté el mismo problema y armé una prueba de concepto para enviar archivos a través de una sesión de PS Remoting. Encontrarás el script aquí:

https://gist.github.com/791112

#requires -version 2.0 [CmdletBinding()] param ( [Parameter(Mandatory=$true)] [string] $ComputerName, [Parameter(Mandatory=$true)] [string] $Path, [Parameter(Mandatory=$true)] [string] $Destination, [int] $TransferChunkSize = 0x10000 ) function Initialize-TempScript ($Path) { "<# DATA" | Set-Content -Path $Path } function Complete-Chunk () { @" DATA #> `$TransferPath = `$Env:TEMP | Join-Path -ChildPath ''$TransferId'' `$InData = `$false `$WriteStream = [IO.File]::OpenWrite(`$TransferPath) try { `$WriteStream.Seek(0, ''End'') | Out-Null `$MyInvocation.MyCommand.Definition -split "``n" | ForEach-Object { if (`$InData) { `$InData = -not `$_.StartsWith(''DATA #>'') if (`$InData) { `$WriteBuffer = [Convert]::FromBase64String(`$_) `$WriteStream.Write(`$WriteBuffer, 0, `$WriteBuffer.Length) } } else { `$InData = `$_.StartsWith(''<# DATA'') } } } finally { `$WriteStream.Close() } "@ } function Complete-FinalChunk ($Destination) { @" `$TransferPath | Move-Item -Destination ''$Destination'' -Force "@ } $ErrorActionPreference = ''Stop'' Set-StrictMode -Version Latest $EncodingChunkSize = 57 * 100 if ($EncodingChunkSize % 57 -ne 0) { throw "EncodingChunkSize must be a multiple of 57" } $TransferId = [Guid]::NewGuid().ToString() $Path = ($Path | Resolve-Path).ProviderPath $ReadBuffer = New-Object -TypeName byte[] -ArgumentList $EncodingChunkSize $TempPath = ([IO.Path]::GetTempFileName() | % { $_ | Move-Item -Destination "$_.ps1" -PassThru}).FullName $Session = New-PSSession -ComputerName $ComputerName $ReadStream = [IO.File]::OpenRead($Path) $ChunkCount = 0 Initialize-TempScript -Path $TempPath try { do { $ReadCount = $ReadStream.Read($ReadBuffer, 0, $EncodingChunkSize) if ($ReadCount -gt 0) { [Convert]::ToBase64String($ReadBuffer, 0, $ReadCount, ''InsertLineBreaks'') | Add-Content -Path $TempPath } $ChunkCount += $ReadCount if ($ChunkCount -ge $TransferChunkSize -or $ReadCount -eq 0) { # send Write-Verbose "Sending chunk $TransferIndex" Complete-Chunk | Add-Content -Path $TempPath if ($ReadCount -eq 0) { Complete-FinalChunk -Destination $Destination | Add-Content -Path $TempPath Write-Verbose "Sending final chunk" } Invoke-Command -Session $Session -FilePath $TempPath # reset $ChunkCount = 0 Initialize-TempScript -Path $TempPath } } while ($ReadCount -gt 0) } finally { if ($ReadStream) { $ReadStream.Close() } $Session | Remove-PSSession $TempPath | Remove-Item }

Algunos cambios menores le permitirían aceptar una sesión como parámetro en lugar de comenzar una nueva. Encontré que el consumo de memoria en el servicio Remoting en la computadora de destino podría crecer bastante al transferir archivos grandes. Sospecho que PS Remoting no fue realmente diseñado para ser utilizado de esta manera.


Si se tratara de un archivo pequeño, podría enviar el contenido del archivo y el nombre del archivo como parámetros.

$f="the filename" $c=Get-Content $f invoke-command -session $s -script {param($filename,$contents) ` set-content -path $filename -value $contents} -argumentlist $f,$c

Si el archivo es demasiado largo para ajustarse a los límites de la sesión, puede leer el archivo como fragmentos y utilizar una técnica similar para adjuntarlos en la ubicación de destino.


NET USE permite agregar una letra de unidad local para el sistema remoto, que luego le permite usar la letra de unidad en su PSSession, o incluso sin una PSSession. Esto es útil si no tiene Powershell v5.0, e incluso si lo tiene,

Puede usar el nombre de la máquina remota o su dirección IP como parte de la ruta UNC remota y puede especificar las credenciales de nombre de usuario y contraseña en la misma línea:

NET USE Z: //192.168.1.50/ShareName /USER:192.168.1.50/UserName UserPassword

Otro ejemplo:

NET USE Z: //RemoteSystem/ShareName /USER:RemoteSystem/UserName UserPassword

O

NET USE Z: //RemoteSystem/ShareName /USER:Domain/UserName UserPassword

Si no proporciona las credenciales de usuario en la misma línea, se le solicitarán:

>NET USE Z: //192.168.1.50/ShareName Enter the user name for ''192.168.1.50'': 192.168.1.50/UserName Enter the password for 192.168.1.50: ***** The command completed successfully.

Puede eliminar la letra de unidad cuando haya terminado con lo siguiente:

NET USE Z: /delete

Puede obtener la sintaxis completa con NET USE /?

>net use /? The syntax of this command is: NET USE [devicename | *] [//computername/sharename[/volume] [password | *]] [/USER:[domainname/]username] [/USER:[dotted domain name/]username] [/USER:[username@dotted domain name] [/SMARTCARD] [/SAVECRED] [[/DELETE] | [/PERSISTENT:{YES | NO}]] NET USE {devicename | *} [password | *] /HOME NET USE [/PERSISTENT:{YES | NO}]

NET es un comando externo .exe estándar en la carpeta del sistema y funciona bien en Powershell.


$data = Get-Content ''C:/file.exe'' -Raw Invoke-Command -ComputerName ''server'' -ScriptBlock { $using:data | Set-Content -Path ''D:/filecopy.exe'' }

No sé realmente cuál es la limitación del tamaño máximo de archivo.