Skip to main content

What Version of Windows are on my Clients?

It has been a very busy few months for me.  As you can see below, I’ve been spending a little time on board some Ships of the United States Navy.  Time to get back to work!!!


So, how do you know what version of PowerShell your clients are running.  There are a variety of ways of doing this.  We are going to use a CIM sessions to remotely pull this information from your client machines.  A few things need to be in place first.

  1. PowerShell Remoting needs to be turning on. (http://mctexpert.blogspot.com/2011/03/enable-powershell-v2-remote-management.html)
  2. Give your clients time to update their group policy.  This may take more than a day depending on how your network is laid out.
  3. Query the clients from Active Directory that you want to query.  Here is the link to the Remote Server Administrator Tools for Windows 10.  There are similar versions all the way back to Windows 7.  Install this on your client. (https://www.microsoft.com/en-us/download/details.aspx?id=45520)
  4. Execute Get-CIMInstance.

We are focused on the fourth item.  In the past, I’ve advocated using Invoke-Command.  That still works but a CIMSession is a bit lighter weight.  Below is our code.

Get-ADComputer -Filter * |
    Select-Object -ExpandProperty Name |
    Get-CimInstance -ClassName Win32_OperatingSystem |
    ForEach-Object -Process {
        $Obj = New-Object -TypeName PSObject -Property @{
            Name = $_.PSComputerName
            OS = $Null
            Product = $Null
        }
        If ($_.ProductType -eq 1) {$Obj.Product = "Client"}
        ElseIf ($_.ProductType -eq 2) {$Obj.Product = "Domain Controller"}
        Else {$Obj.Product = "Server"}

        Switch -Wildcard ($_.Version)
        {
            "10.0*" {$Obj.OS = "Windows 10/2016"}
            "6.3*" {$Obj.OS = "Windows 8.1/2012 R2"}
            "6.2*" {$Obj.OS = "Windows 8/2012"}
            "6.1*" {$Obj.OS = "Windows 7/2008 R2"}
            "6.0*" {$Obj.OS = "Windows Vista/2008"}
        }
        Write-Output $Obj
    }
   
    

The first line uses Get-ADComputer to gather all computer objects in your domain.  Make sure you collect only the objects that you are interested in.

The Select-Object line provides us with just the name of the node.  This is important because of the next line which utilizes Get-CIMInstance.  If you look at the –CIMSession parameter for Get-CIMInstance, you will see that it accepts STRING ByValue.

PS C:\> Get-Help Get-CimInstance -Parameter CIMSession

-CimSession
    Specifies the CIM session to use for this cmdlet. Enter a variable that contains the CIM session or a command that creates or gets the CIM session, such as the New-CimSession or
    Get-CimSession cmdlets. For more information, see about_CimSessions.
   
    Required?                    true
    Position?                    named
    Default value               
    Accept pipeline input?       True (ByValue)
    Accept wildcard characters?  false

We are using the Win32_OperatingSystem class to gather our information.  Two properties from this class that we are interested in are Version and ProductType.  You can see the documentation for the Win32_OperatingSystem class here (https://msdn.microsoft.com/en-us/library/aa394239(v=vs.85).aspx).  We take the numeric values for these properties and translate them into something human readable.  This is done in a custom object which is then sent to the pipeline.
Name    OS              Product         
----    --              -------         
LON-DC1 Windows 10/2016 Domain Controller
LON-CL1 Windows 10/2016 Client    

One thing to note, this is not handling errors.  I have to leave some of the fun up to you.


Comments

Popular posts from this blog

Sticky Key problem between Windows Server 2012 and LogMeIn

This week I instructed my first class using Windows Server 2012 accessed via LogMeIn and discovered a Sticky Key problem every time you press the Shift key. Here is my solution to resolve this.  First off, in the Preferences of LogMeIn for the connection to the Windows Server, click General . Change the Keyboard and mouse priority to Host side user and click Apply at the bottom. On the Windows 2012 server, open the Control Panel – Ease of Access – Change how your keyboard works . Uncheck Turn on Sticky Keys . Click Set up Sticky Keys . Uncheck Turn on Sticky Keys when SHIFT is pressed five times . Click OK twice. If you are using Windows Server 2012 as a Hyper-V host, you will need to redo the Easy of Use settings on each guest operating system in order to avoid the Sticky Key Problem. Updated Information: March 20, 2013 If you continue to have problems, Uncheck Turn on Filter Keys .

With the AD Recycle Bin Turned on, What Happens when you Create a User Account with a Password that does not meet the Password Policy?

This was an interesting observation from one of my Windows Server 2012 classes.  While working with the AD Recycle bin in a lab, one of my students discovered some interesting accounts that were created. When he created user accounts that did not meet password complexity requirements, an account is temporarily made and then deleted.  When a new password is provided that meets the password requirements, then a new account is made. We discovered this in two places.  First off in the Active Directory Administrative Center.  This is what caused the initial confusion.  Take a look.  This is in the Deleted Objects OU. You can see multiple deleted accounts for Test2 and one for Test3.  Test3 is a valid, functioning user account.  Using the PowerShell command Get-ADObject –IncludeDeletedObjects –Filter * –Properties ObjectSID we can see that indeed, two accounts were created, with one of them deleted. Notice the RID portion of the SID is different. ...

Where did a User’s Account Get Locked Out?

Updated: May 15, 2015 When this article was originally published, two extra carriage returns were add causing the code to malfunction.  The code below is correct.   My client for this week’s PowerShell class had a really interesting question. They needed to know where an account is being locked out at. OK, interesting. Apparently users hop around clients and forget to log off, leading to eventual lock out of their accounts. The accounts can be unlocked, but are then relocked after Active Directory replication. This problem is solved in two parts. The first one is to modify the event auditing on the network. The second part is resolved with PowerShell. The first part involves creating a group policy that will encompass your Domain Controllers. In this GPO, make these changes. Expand Computer Configuration \ Policies \ Windows Settings \ Security Settings \ Advanced Audit Policy Configuration \ Audit Policies \ Account Management Double click User Account Management C...