{"id":4714,"date":"2012-11-07T00:01:00","date_gmt":"2012-11-07T00:01:00","guid":{"rendered":"https:\/\/blogs.technet.microsoft.com\/heyscriptingguy\/2012\/11\/07\/post-windows-server-2012-migration-powershell-cleanup-work\/"},"modified":"2012-11-07T00:01:00","modified_gmt":"2012-11-07T00:01:00","slug":"post-windows-server-2012-migration-powershell-cleanup-work","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/scripting\/post-windows-server-2012-migration-powershell-cleanup-work\/","title":{"rendered":"Post Windows Server 2012 Migration PowerShell Cleanup Work"},"content":{"rendered":"<p><strong>Summary:<\/strong> Microsoft Scripting Guy, Ed Wilson, talks about Windows PowerShell cleanup work to do following a migration to Windows Server&nbsp;2012.<\/p>\n<p>Microsoft Scripting Guy, Ed Wilson, is here. Well, following any migration, there is always a bit of cleanup work. Luckily, Windows Server&nbsp;2012 enables Windows PowerShell remoting by default. This means that the cleanup is not too bad.<\/p>\n<p style=\"padding-left: 30px\"><strong>Note<\/strong> &nbsp;&nbsp;Read about my experience upgrading my group of servers to Windows Server&nbsp;2012 in yesterday&rsquo;s Hey, Scripting Guy! blog post: <a href=\"http:\/\/blogs.technet.com\/b\/heyscriptingguy\/archive\/2012\/11\/06\/the-32-hour-upgrade-to-windows-server-2012.aspx\" target=\"_blank\">The 32-hour Upgrade to Windows Server 2012<\/a><em>.<\/em><\/p>\n<h2>First Windows PowerShell task&mdash;ensure you update Help<\/h2>\n<p>One of the cool new features of Windows PowerShell&nbsp;3.0 is the updatable Help. The great thing about this is that it makes it easy to always have the latest Help files. Once I complete my upgrade to Windows Server&nbsp;2012 (or, for that matter, to Windows&nbsp;8, or any computer to Windows PowerShell&nbsp;3.0) I need to run the <strong>Update-Help<\/strong> cmdlet.<\/p>\n<p>I could simply run <strong>Update-Help<\/strong> on each computer, and then tell it to go off to the Internet and grab the latest Help files. But that is inefficient, and Windows PowerShell&nbsp;3.0 has provisions for offline updates.<\/p>\n<p>So, from my laptop computer (which, incidentally, has the Windows&nbsp;8 RSAT tools and, therefore, all the modules installed on it), I run the <strong>Save-Help<\/strong> cmdlet. I point it to a shared folder on my network. The following image shows the command and the associated output.<\/p>\n<p>&nbsp;<a href=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/29\/2019\/02\/3377.hsg-11-7-12-01.png\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/29\/2019\/02\/3377.hsg-11-7-12-01.png\" alt=\"\" border=\"0\" \/><\/a><\/p>\n<p>OK, so that was less than impressive. The reason? Well, the destination folder must exist. I was hoping that it would be smart enough to create my poshhelp directory. Oh, well. No problem. I revise the command as appears here.<\/p>\n<p style=\"padding-left: 30px\">PS C:\\&gt; New-Item -ItemType directory -Path \\\\dc1\\share\\poshhelp<\/p>\n<p style=\"padding-left: 30px\">&nbsp;&nbsp;&nbsp; Directory: \\\\dc1\\share<\/p>\n<p style=\"padding-left: 30px\">Mode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LastWriteTime&nbsp;&nbsp;&nbsp;&nbsp; Length Name<\/p>\n<p style=\"padding-left: 30px\">&#8212;-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8212;&#8212;&#8212;&#8212;-&nbsp;&nbsp;&nbsp;&nbsp; &#8212;&#8212; &#8212;-<\/p>\n<p style=\"padding-left: 30px\">d&#8212;-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11\/5\/2012&nbsp;&nbsp; 2:12 PM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; poshhelp<\/p>\n<p style=\"padding-left: 30px\">PS C:\\&gt; Save-Help -Module * -DestinationPath \\\\dc1\\share\\poshHelp<\/p>\n<p>A couple of errors still appear, but that is due to the fact that Help is trying to update Help for some modules that do not have updated Help. Cool. Now, I need to update the Help by using the share for all my new Windows Server&nbsp;2012 servers. This is easier than it appears. Remember, I have the RSAT tools on my laptop, therefore, I have access to the <strong>Get-ADComputer<\/strong> cmdlet. I use the following command to obtain all of the servers that run Windows Server&nbsp;2012 on my network.<\/p>\n<p style=\"padding-left: 30px\">PS C:\\&gt; Get-ADComputer -Filter * -properties operatingsystem | where operatingsystem<\/p>\n<p style=\"padding-left: 30px\">-match 2012 | select name<\/p>\n<p style=\"padding-left: 30px\">name<\/p>\n<p style=\"padding-left: 30px\">&#8212;-<\/p>\n<p style=\"padding-left: 30px\">DC3<\/p>\n<p style=\"padding-left: 30px\">DC4<\/p>\n<p style=\"padding-left: 30px\">W8SERVER8<\/p>\n<p style=\"padding-left: 30px\">W8S504<\/p>\n<p style=\"padding-left: 30px\">HYPERV3<\/p>\n<p style=\"padding-left: 30px\">SQL1<\/p>\n<p style=\"padding-left: 30px\">WDS1<\/p>\n<p style=\"padding-left: 30px\">HYPERV2<\/p>\n<p style=\"padding-left: 30px\">DC2<\/p>\n<p style=\"padding-left: 30px\">WEB1<\/p>\n<p>&nbsp;I store the results of the command (not by using <strong>Select-Object<\/strong>) into a variable I call <strong>cn<\/strong><em>. <\/em>This is shown here.<\/p>\n<p style=\"padding-left: 30px\">&nbsp;$cn = Get-ADComputer -Filter * -properties operatingsystem | where operatingsystem -match 2012<\/p>\n<p>&nbsp;By using an automatic expansion (a cool Windows PowerShell&nbsp;3.0 feature), it is easy to get the computer names. I just pick out the property. I will include it in my command to create the Windows PowerShell session. I know some of these computers are offline, and so I expect some errors. Here is the command I use to create the sessions.<\/p>\n<p style=\"padding-left: 30px\">$session = New-PSSession -cn $cn.name -Credential iammred\\administrator<\/p>\n<p>I query the $session variable to see that at least some computers worked. This appears here.<\/p>\n<p style=\"padding-left: 30px\">PS C:\\&gt; $session<\/p>\n<p style=\"padding-left: 30px\">&nbsp;Id Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ComputerName&nbsp;&nbsp;&nbsp; State&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ConfigurationName&nbsp;&nbsp;&nbsp;&nbsp; Availability<\/p>\n<p style=\"padding-left: 30px\">&nbsp;&#8212; &#8212;-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8212;&#8212;&#8212;&#8212;&nbsp;&nbsp;&nbsp; &#8212;&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8212;&#8212;&#8212;&#8212;&#8212;&#8211;&nbsp;&nbsp;&nbsp;&nbsp; &#8212;&#8212;&#8212;&#8212;<\/p>\n<p style=\"padding-left: 30px\">&nbsp; 4 Session4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DC3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Opened&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Microsoft.PowerShell&nbsp;&nbsp;&nbsp;&nbsp; Available<\/p>\n<p style=\"padding-left: 30px\">&nbsp; 5 Session5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DC4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Opened&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Microsoft.PowerShell&nbsp;&nbsp;&nbsp;&nbsp; Available<\/p>\n<p style=\"padding-left: 30px\">&nbsp; 8 Session8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HYPERV3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Opened&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Microsoft.PowerShell&nbsp;&nbsp;&nbsp;&nbsp; Available<\/p>\n<p style=\"padding-left: 30px\">&nbsp;11 Session11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HYPERV2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Opened&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Microsoft.PowerShell&nbsp;&nbsp;&nbsp;&nbsp; Available<\/p>\n<p style=\"padding-left: 30px\">&nbsp; 9 Session9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQL1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;Opened&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Microsoft.PowerShell&nbsp;&nbsp;&nbsp;&nbsp; Available<\/p>\n<p style=\"padding-left: 30px\">&nbsp;10 Session10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WDS1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Opened&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Microsoft.PowerShell&nbsp;&nbsp;&nbsp;&nbsp; Available<\/p>\n<p style=\"padding-left: 30px\">&nbsp;13 Session13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WEB1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Opened&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Microsoft.PowerShell&nbsp;&nbsp;&nbsp;&nbsp; Available<\/p>\n<p style=\"padding-left: 30px\">&nbsp;12 Session12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DC2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;Opened&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Microsoft.PowerShell&nbsp;&nbsp;&nbsp;&nbsp; Available<\/p>\n<p>The commands and associated output appear here.<\/p>\n<p>&nbsp;<a href=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/29\/2019\/02\/4857.hsg-11-7-12-02.png\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/29\/2019\/02\/4857.hsg-11-7-12-02.png\" alt=\"\" border=\"0\" \/><\/a>&nbsp;<\/p>\n<p>I now use <strong>Invoke-Command<\/strong> to update Help on all of my servers. This appears here.<\/p>\n<p style=\"padding-left: 30px\">Invoke-Command -Session $session -ScriptBlock {Update-Help -PSPath \\\\dc1\\Share\\poshhelp -Force}<\/p>\n<p>If I do not want to fool with downloading Help, I can use the following command to update Help on all of my servers.<\/p>\n<p style=\"padding-left: 30px\">Invoke-Command -Session $session -ScriptBlock {Update-Help -force}<\/p>\n<p>Of course, a few more errors about missing modules and stuff appear, but, in the end, I have updated all the Help on my servers.<\/p>\n<h2>Enable script support<\/h2>\n<p>Now, I want to enable scripting on the servers. This is also a single cmdlet&mdash;<strong>Set-ExecutionPolicy<\/strong>. Here is the command I use:<\/p>\n<p style=\"padding-left: 30px\">Invoke-Command -Session $session -ScriptBlock {Set-ExecutionPolicy remotesigned -force}<\/p>\n<p>I can easily check the results by using <strong>Get-ExecutionPolicy<\/strong>. This is shown here.<\/p>\n<p style=\"padding-left: 30px\">PS C:\\&gt; Invoke-Command -Session $session -ScriptBlock {Get-ExecutionPolicy}<\/p>\n<p style=\"padding-left: 30px\">PSComputerName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RunspaceId&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Value<\/p>\n<p style=\"padding-left: 30px\">&#8212;&#8212;&#8212;&#8212;&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8212;&#8212;&#8212;-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8212;&#8211;<\/p>\n<p style=\"padding-left: 30px\">DC4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 571a049f-c671-46e7-b72a-&#8230; RemoteSigned<\/p>\n<p style=\"padding-left: 30px\">DC3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8cc8e20d-2426-44fd-9ae5-&#8230; RemoteSigned<\/p>\n<p style=\"padding-left: 30px\">HYPERV3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b3f5afae-1f1b-43ca-918f-&#8230; RemoteSigned<\/p>\n<p style=\"padding-left: 30px\">SQL1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9609e293-26ff-4866-9734-&#8230; RemoteSigned<\/p>\n<p style=\"padding-left: 30px\">WEB1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d5dfcde8-2de1-4b8f-9a21-&#8230; RemoteSigned<\/p>\n<p style=\"padding-left: 30px\">WDS1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 75124ffd-5f4b-4e27-91f4-&#8230; RemoteSigned<\/p>\n<p style=\"padding-left: 30px\">DC2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ea287978-f21f-4f27-85e1-&#8230; RemoteSigned<\/p>\n<p style=\"padding-left: 30px\">HYPERV2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a4e5f5ab-add7-4fe3-a7a7-&#8230; RemoteSigned<\/p>\n<p>That is all there is to updating Help and configuring script support on my remote servers running Windows Server&nbsp;2012. Join me tomorrow, when I will do remote updates. &nbsp;<\/p>\n<p>I invite you to follow me on <a href=\"http:\/\/bit.ly\/scriptingguystwitter\" target=\"_blank\">Twitter<\/a> and <a href=\"http:\/\/bit.ly\/scriptingguysfacebook\" target=\"_blank\">Facebook<\/a>. If you have any questions, send email to me at <a href=\"mailto:scripter@microsoft.com\" target=\"_blank\">scripter@microsoft.com<\/a>, or post your questions on the <a href=\"http:\/\/bit.ly\/scriptingforum\" target=\"_blank\">Official Scripting Guys Forum<\/a>. See you tomorrow. Until then, peace.<\/p>\n<p><strong>Ed Wilson, Microsoft Scripting Guy<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Summary: Microsoft Scripting Guy, Ed Wilson, talks about Windows PowerShell cleanup work to do following a migration to Windows Server&nbsp;2012. Microsoft Scripting Guy, Ed Wilson, is here. Well, following any migration, there is always a bit of cleanup work. Luckily, Windows Server&nbsp;2012 enables Windows PowerShell remoting by default. This means that the cleanup is not [&hellip;]<\/p>\n","protected":false},"author":596,"featured_media":87096,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[31,362,3,4,45],"class_list":["post-4714","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-scripting","tag-operating-system","tag-powershell-3","tag-scripting-guy","tag-scripting-techniques","tag-windows-powershell"],"acf":[],"blog_post_summary":"<p>Summary: Microsoft Scripting Guy, Ed Wilson, talks about Windows PowerShell cleanup work to do following a migration to Windows Server&nbsp;2012. Microsoft Scripting Guy, Ed Wilson, is here. Well, following any migration, there is always a bit of cleanup work. Luckily, Windows Server&nbsp;2012 enables Windows PowerShell remoting by default. This means that the cleanup is not [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/posts\/4714","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/users\/596"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/comments?post=4714"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/posts\/4714\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/media\/87096"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/media?parent=4714"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/categories?post=4714"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/tags?post=4714"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}