Archive for October, 2014

Can’t install .net 3.5 on Windows 8 or 2012

Friday, October 31st, 2014

As Microsoft tries to make things easier; they sometimes cause problems with internal security policies. Like many companies, Windows Update has a few controls on it.

A few Windows 8 installations ran into a problem when they needed .Net 3.5. The update policies blocked the download of needed files for the Windows Features wizard to install it.

Luckily; there is a support note; that explains another method to install.

All that is needed is the DVD or an ISO of the operating system. I used an ISO. A nice new feature is the ability for a virtual drive. Simply copy the ISO, double-click it and and you have the ISO mounted.

After that start an admin level CMD and use the DISM command to install .Net 3.5.

DISM /Online /Enable-Feature /FeatureName:NetFx3 /All /LimitAccess /Source:<Virtual drive letter>:\sources\sxs

It will run for a couple minutes and it didn’t require a reboot.

Changing to Powershell ISE

Thursday, October 23rd, 2014

I have had a constant problem with AdminScriptEditor.  For whatever reason, it will format certain lines which break up my variables (IE.  $  variable).

In a moment of anger, I decided to start using the Powershell ISE.  Simple but missing a few things such as a print menu.

There is the add-ons menu which is kind of clumsy but it gives you the chance to add missing routines and functions.

I found Jeffrey Hicks wrote a series of functions to extend ISE.  Simple install process and now I can print my scripts!

There is also a technet entry on this.

Windows 7/8 and hiberfil.sys

Tuesday, October 14th, 2014

Windows 8 increased the boot speed by making use of the hibernate function to store the kernel session rather then completely shutdown.

For laptops and even desktops; this is a nice feature.  However, for a testing server or virtual machine; this is a waste of disk space especially if you have a large amount of RAM (in one situation, a windows 7 and 8 setup had two sixty gig files for hiberfil.sys).

This consumption also confused the users as they would see their free space as small and yet looking at their folders didn’t show these files.   Programs like windirstat will point this out.

The simplest way to disable this feature is to use the powercfg command.  Start an administrative level cmd shell.

Enter:  powercfg /h off

The hiberfil.sys file will disappear right after.

Startup time will increase but for these users; space was more important.

How to extend a Windows Server trial period.

Tuesday, October 14th, 2014

Every so often I will get the “emergency” request for a Windows Server machine and either it will take too long to purchase a license or it’s only a trial to check something.  Of course, the server is established and all is forgotten.

One hundred and eighty days later; an issue is raised over the server being offline.  A quick check and of course the license has expired so the machine will start regularly shutting itself down.

The test of course is not over so do we extend it or get a license? The license idea is rejected to we can only extend the trial period.

Microsoft understands these issues and gave a simple way to extend a trial:

  1. Start a command prompt as administrator
  2. enter : slmgr.vbs /rearm
  3. The system will need a reboot for the extension to begin.

A new period of 180 days will be displayed and you can do this 2 more times.

DNS check for powershell

Saturday, October 11th, 2014

I had a need to do a quick DNS lookup for computers in a powershell script which going through a list of computers. There are two ways to a system will not have a DNS entry: 1) System retired. 2) System uses DHCP and is not on the network.

A quick way to perform a look would be to use:

[System.Net.Dns]::GetHostName()

It does give output directed to the console.  If you want to suppress it, use the [void] option.

[void][System.Net.Dns]::GetHostName()

Trimming white space

Friday, October 10th, 2014

Working with a CSV file; I had a situation where the command line would give the output I wanted but the script would get the object information.  I found I could get what I needed by converting the output to a script but it introduced white space.  A computer name would turn into:

“Computer                                       “

What was interesting was the system commands would treat the white space as part of the computer name which of course cause the commands to fail.

Look around the Net; I found a command to trim white space.

$server = $server.trim()

The system name returned to proper size and what is great about this command is that it will trim white space from both sides.

Replace a character in a string

Friday, October 10th, 2014

I had a script where I needed to change a character in a string.

Simple task as I found on the Net.

$str = $str.replace(‘\’,’_’)

Scriptblock doesn’t work with variables.

Friday, October 10th, 2014

Powershell is a fun experience which I wish I had started awhile ago.  It’s features seem endless and it greatly eases system management.

The recent scare over Shellshock caused us to evaluate our Cygwin installations.  We didn’t know the exact number of installations and the version of Bash in use.

The question of the number of Cygwin installations was easy to solve. A script to review the organization units and scan each computer for Cygwin.

After a list was generated; a script was written and three results files were created: Found, System Down, and Not Found.

Cygwin due to it’s open source nature does not follow Microsoft design standards.  It has it’s own way of doing things. Good for the user but not always good for system management purposes.

I didn’t find a “Quick and Dirty” way to get the version number of the Bash executable.   Nothing in the registry and file information lacked details.

Redhat (we use them for support) advised using the “–version” option to identify the version.  A rather tedious task if done through remote desktop or nagging the users to send the information.

What would be nice if there was way to run a command remote and get the information.

Powershell has a nice option called “invoke-command.” It’s a one use option for such things.

The command is rather simply to use:

Invoke-Command -scriptblock { c:\cygwin\bin\bash –version }  -computername <hostname>

This gave the following output:

GNU bash, version 4.1.15(1)-release (i686-pc-cygwin)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

A little too much detail for a version number.  This was quickly addressed by using Select-String command.

Invoke-Command -scriptblock { c:\cygwin\bin\bash –version }  -computername <hostname> | Select-String -pattern “GNU bash, version”

This in turn gave:

GNU bash, version 4.1.15(1)-release (i686-pc-cygwin)

This was usable.  It also helped with simple errors.  If you don’t get the expected result, add an error message. This became evident when trying to run the command on Windows 2003 which lacked Powershell 2.0 and systems which did not have remote management configured.

Invoke-Command is great.  It gave me the information I needed without visiting each system.

I wrote a script and quickly found two problems:

  1. There are flavors of Cygwin and unless there was a conscious effort during install; you could end up with different directories (ie: C:\cygwin, C:\cygwin64, C:\rhcygwin).
  2. Running the command for several systems.  Invoke-Command can take up to five systems.  Great for a small number but not so great when you have hundreads or more.

Both of these issues required the use of variables and it was quickly discovered that -scriptblock option couldn’t use variables. For example:  $cygwinPath\bash.exe –version resulted as \bash.exe –version

The dynamic nature of scanning several computers was not something the command could do.  Rather then use another approach; I looked around the Net and found there was a way to use dynamic scriptblocks by using the NewScriptBlock command.

A quick change:

$scriptblock = $ExecutionContent.InvokeCommand.NewScriptBlock( “$cygwinPath\bash.exe –version”)
$versionResult = Invoke-Command -scriptblock $scriptblock -computername $server | Select-String -pattern “GNU bash, version”

This gave the needed results and we had an understanding of the work needed to be done.

If you would like to read more about Invoke-Command, Ed Wilson did a nice little writeup on his blog.