PowerShell in Action–Deal of the Day-23 July 2016

Deal of the Day July 23: Half off my book Windows PowerShell in Action, Third Edition. Use code dotd072316au at http://bit.ly/2afnOPj

Deal of the Day details at https://www.manning.com/dotd

Posted in Books, Powershell, PowerShell v5 | Leave a comment

Parallel copy files over remoting session

In response to this post – https://richardspowershellblog.wordpress.com/2015/05/28/copy-files-over-ps-remoting-sessions/

I was asked how you could copy files in parallel to multiple machines.

As soon as anyone mentions parallelism I think of workflows so I ended up with this

$computers = ‘W16TP5TGT01’, ‘W16TP5TGT02’

workflow parallelcopy {
  param ([string[]]$computername)
  foreach -parallel ($computer in $computername) {
     InlineScript {
       $s = New-PSSession -ComputerName $using:computer
       Copy-Item -Path C:\Scripts\New-NanoMachine.ps1 -Destination C:\Source -ToSession $s
       Remove-PSSession -Session $s
     }
  }
}

parallelcopy -computername $computers

A couple of issues I found. First off –Tosession and –FromSession haven’t been added to the Copy-Item workflow activity. This means you have to use an Inline script block to access those parameters

Secondly accessing a emoting session created outside of the workflow generates a session busy error when trying to perform the copy so have to move the session creation into the Inline script.

If you had a lot of files, or a lot of data, to copy to multiple machines this approach may be worthwhile. For small amounts of data then the approach in the original article is probably best.

Posted in PowerShell v5 | Leave a comment

Manning Deal of the Day 19 July 2016

Deal of the Day July 19: Half off my book Learn Active Directory Management in a Month of Lunches. Use code dotd071916au at http://bit.ly/2a8jroO

For more information on Manning’s Deal of the Day see –  https://www.manning.com/dotd.

Posted in Active Directory, Books | Leave a comment

Biggest innovation in PowerShell is…

The imminent arrival of PowerShell 5.1 in the Windows 10 Anniversary update (assumption as the Windows 10 Insider previews have been showing PowerShell 5.1 for some time) and Windows Server 2016 (TP5 shows PowerShell 5.1) and the fact that PowerShell was officially released to the world 10 years ago come November started me thinking about what has been the biggest innovation in PowerShell over those 10 years.

Contenders that come to mind include:

– Remoting
– PowerShell modules
– CIM & CIM sessions
– Workflows
– Job engine
– Desired State Configuration
– PowerShell Gallery and package management
– PowerShell classes
– JSON support in PowerShell
– Internationalisation
– Error handling – try/catch
– Debugging enhancements
– REST API and Odata support
– PowerShell support for Microsoft products
– PowerShell support from third part vendors
– PowerShell community

Which do you think?

Or is it something else?

Leave a comment as I’m intrigued as to what people think has been the biggest PowerShell innovation

Posted in Powershell | 7 Comments

Summer goodies

Looks like we’re set for some summer goodies over the next few months.

First up is Windows 10 anniversary update that’s due 2 August

https://blogs.windows.com/buildingapps/2016/07/12/windows-10-anniversary-sdk-preview-build-14388-released/

Followed by the Windows Server 2016 launch at the end of September

https://blogs.technet.microsoft.com/windowsserver/2016/07/12/windows-server-2016-new-current-branch-for-business-servicing-option/

TP5 is stated to be feature complete – my testing so far shows some rough edges. Hope launch means general availability and not another 2-3 month wait like we had with Windows 2012 R2

The article is also interesting for showing how Windows server and Nano server will be treated differently. Windows server wil get patches in the traditional cycle we’ve come to know and love(?). Nano server will be more like Windows 10 with updates 2-3 times per year – including new features. Hopefully that would include Nano server being able to support more roles

Posted in Windows 10, Windows Server 2016 | Leave a comment

Copying across multiple remoting sessions

I needed to copy the same file to multiple machines so I tried this:

$computers = ‘W16CN01’, ‘W16CN02’

$s = New-PSSession -ComputerName $computers

Copy-Item -Path ‘C:\Source\Windows 2016 TP5\Cumulative Update for Windows Server 2016 Technical Preview 5 (KB3163016)\AMD64-all-windows10.0-kb3163016-x64_83d6e9bca94a64a5d9be3d81cdb182e540285848.msu’ -Destination C:\Scripts -ToSession $s

Remove-PSSession –Session $s

It failed with:

Copy-Item : Cannot convert ‘System.Object[]’ to the type
‘System.Management.Automation.Runspaces.PSSession’ required by parameter
‘ToSession’. Specified method is not supported.
At line:5 char:236
+ … a5d9be3d81cdb182e540285848.msu’ -Destination C:\Scripts -ToSession $s
+                                                                        ~~
    + CategoryInfo          : InvalidArgument: (:) [Copy-Item], ParameterBindi
   ngException
    + FullyQualifiedErrorId : CannotConvertArgument,Microsoft.PowerShell.Comma
   nds.CopyItemCommand

If you look at the syntax

Get-Command Copy-Item -Syntax

Copy-Item [-Path] <string[]> [[-Destination] <string>] [-Container]
[-Force] [-Filter <string>] [-Include <string[]>] [-Exclude <string[]>]
[-Recurse] [-PassThru] [-Credential <pscredential>] [-WhatIf] [-Confirm]
[-UseTransaction] [-FromSession <PSSession>] [-ToSession <PSSession>]
[<CommonParameters>]

Copy-Item [[-Destination] <string>] -LiteralPath <string[]> [-Container]
[-Force] [-Filter <string>] [-Include <string[]>] [-Exclude <string[]>]
[-Recurse] [-PassThru] [-Credential <pscredential>] [-WhatIf] [-Confirm]
[-UseTransaction] [-FromSession <PSSession>] [-ToSession <PSSession>]
[<CommonParameters>]

the ToSession and FromSession parameters only take a single session as their value.

Modify the code to

$computers = ‘W16CN01’, ‘W16CN02’

$sessions = New-PSSession -ComputerName $computers

foreach ($session in $sessions) {
Copy-Item -Path ‘C:\Source\Windows 2016 TP5\Cumulative Update for Windows Server 2016 Technical Preview 5 (KB3163016)\AMD64-all-windows10.0-kb3163016-x64_83d6e9bca94a64a5d9be3d81cdb182e540285848.msu’ -Destination C:\Scripts -ToSession $session
}

Remove-PSSession -Session $sessions

And it works

Posted in PowerShell v5, Windows Server 2016 | 1 Comment

PowerShell Direct example

Last week I mentioned PowerShell and how you can create a PowerShell Remoting session to a Virtual Machine that’s running on Hyper-V

Here’s an example of it in use:

$cred = Get-Credential W16TP5TGT01\Administrator
$s = New-PSSession -VMName W16TP5TGT01 -Credential $cred

Create the credential for the VM and then create the remoting session. I prefer to use the VM name rather than the GUID.

Once you’ve established the session you can use it. In this case I’m using another PowerShell 5.o innovation to copy a file across the remote session:

Copy-Item -Path ‘C:\Source\Windows 2016 TP5\Cumulative Update for Windows Server 2016 Technical Preview 5 (KB3163016)\AMD64-all-windows10.0-kb3163016-x64_83d6e9bca94a64a5d9be3d81cdb182e540285848.msu’ -Destination c:\source -ToSession $s

Clean up as usual:

Remove-PSSession -Session $s

PowerShell Direct is another useful addition to the remoting toolbox. It’ll be especially useful in non-domain remoting situations.

Posted in PowerShell v5, Virtualisation, Windows Server 2016 | Leave a comment