PowerShell for Windows Admins


August 24, 2011  2:25 PM

Testing the network speed

Richard Siddaway Richard Siddaway Profile: Richard Siddaway

In the last post I showed how to use the MSNdis_LinkSpeed class. Digging into the class information I found a suggestion that the speed returned was in Kbps. The answers didn’t look right especially when they suggested my wireless network was running at 540Mbps!

At bit of experimentation produced this

function test-linkspeed{            
param(            
 [string]$computer="."            
)            
            
Get-WmiObject -Namespace root\wmi -Class MSNdis_LinkSpeed `
-ComputerName $computer |             
foreach {            
 $nic = Get-WmiObject -Class Win32_NetworkAdapter `
 -ComputerName $computer -Filter "Name = '$($_.InstanceName)'"            
            
New-Object -TypeName PSObject -Property @{            
 Name = $_.InstanceName            
 NdisLinkSpeed = $_.NdisLinkSpeed            
 TestNdis = $_.NdisLinkSpeed / 10000            
 Speed = $nic.Speed            
 Test = $nic.Speed / 1000000            
} | select Name, NdisLinkSpeed, TestNdis, Test, Speed            
            
}            
            
}

Use the MSNdis_LinkSpeed class as before. Pipe into foreach and get the corresponding Win32_NetworkAdapter class. I know that the speed reported there is in bits per second. Create an object that shows the speeds reported by the two classes, convert Win32_NetworkAdapter speed to Mbps and play around with the divisor for Ndis speed until it matches. Turns out MSNdis_LinkSpeed reports in 100s of bits per second.

Odd but fun

August 24, 2011  2:15 PM

Network Link Speed

Richard Siddaway Richard Siddaway Profile: Richard Siddaway

The root\wmi Namespace contains a class that just returns the link speed of your network card. Quick and easy to use function.

function get-linkspeed{            
param(            
 [string]$computer="."            
)            
Get-WmiObject -Namespace root\wmi -Class MSNdis_LinkSpeed `
-ComputerName $computer |             
select InstanceName, @{N="Speed(Mbps)"; E={$_.NdisLinkSpeed/10000}}            
            
}

The documentation I could find suggested that the NdisLinkSpeed property returned Kbps but that gave some odd results. Experimentation and a bit more research suggested I needed to divide by 10000.


August 22, 2011  3:05 PM

TechEd Australia PowerShell conference

Richard Siddaway Richard Siddaway Profile: Richard Siddaway

Tuesday August 30th 2011 at 9am EST there is a PowerShell conference at TechEd Australia. 

Details from

http://powershelldownunder.com/featured/teched2011/

The sessions will be available via Live meeting please register at above URL


August 22, 2011  1:03 PM

Ping a subnet

Richard Siddaway Richard Siddaway Profile: Richard Siddaway

I recently needed to find which IP addresses were active on a subnet to track down a printer. Quickest way was to ping them.

 

function ping-subnet {            
param (            
 [parameter(Mandatory=$true)]            
 [ValidatePattern("\b\d{1,3}\.\d{1,3}\.\d{1,3}\b")]            
 [string]$subnet            
)            
            
0..255 | foreach {             
             
 $address = "$subnet.$_"            
            
 if (Test-Connection -ComputerName $address -Count 1 -Quiet){            
    Test-Connection -ComputerName $address -Count 1            
 }            
            
}            
}

 

Put the subnet in as a parameter. Then work through 0 – 255 building an address from the subnet. use test-connection in quiet mode and if it responds do a 1 count test-connection (ping) to get the result.

Not necessarily the quickest but it was quick to throw together and it works


August 21, 2011  12:24 PM

Create a process on a remote machine

Richard Siddaway Richard Siddaway Profile: Richard Siddaway

We can use the [wmiclass] to create a process but it doesn’t allow us to set the credentials. We can get round that by using a bit of .NET code. [wmiclass] is as accelerator for System.Management.ManagementClass so we go back to basics

function new-process {            
param (            
 [string]$computer="localhost",            
 [string]$procpath="C:\Program Files\Internet Explorer\iexplore.exe"            
)            
            
$conopt = New-Object System.Management.ConnectionOptions             
            
switch ($computer ) {            
 "."         {break}            
 "localhost" {break}            
 "$env:COMPUTERNAME" {break}            
 default {            
           $cred = Get-Credential            
           $conopt.UserName = $cred.UserName            
           $conopt.SecurePassword = $cred.Password            
         }            
}            
$conopt.EnablePrivileges = $true            
            
$scope = New-Object System.Management.ManagementScope             
$scope.Path = "\\$computer\root\cimv2"             
$scope.Options = $conopt             
            
$path = New-Object System.Management.ManagementPath            
$path.ClassName = "Win32_Process"              
            
$proc = New-Object System.Management.ManagementClass($scope, $path, $null)             
            
$proc.Create($procpath)             
}

 

The computer name and path to the exe we want to run are given as parameters. We create the System.Management.ConnectionOptions. If we are  targeting a remote machine we can add the credentials (doesn’t work for local machine). The switch simplifies the coding of avoid local machine

 

The scope and management path (name space and class) are set and then we create a new instance of the class. We can then use the Create method to create the process.


August 21, 2011  11:01 AM

Ethernet Errors

Richard Siddaway Richard Siddaway Profile: Richard Siddaway

While we are looking at the MSNdis_Ethernet* classes we should consider these three that pick up potential problems

MSNdis_EthernetReceiveErrorAlignment
MSNdis_EthernetOneTransmitCollision
MSNdis_EthernetMoreTransmitCollisions

 

If all is well we will get an answer of zero for each of them – no errors and no collisions. Its a bit awkward working through each class in turn and we get a lot of “noise” returned so the following function concatenates the results.

function test-etherneterror {            
param(            
 [string]$computer="."            
)            
Get-WmiObject -Namespace root\wmi -Class MSNdis_EthernetReceiveErrorAlignment `
-ComputerName $computer |            
foreach {            
                
  $one = Get-WmiObject -Namespace root\wmi  `
  -Class MSNdis_EthernetOneTransmitCollision -ComputerName $computer `
  -Filter "InstanceName='$($_.InstanceName)'"            
            
  $more = Get-WmiObject -Namespace root\wmi  `
  -Class MSNdis_EthernetMoreTransmitCollisions -ComputerName $computer `
  -Filter "InstanceName='$($_.InstanceName)'"            
            
  New-Object -TypeName PSobject -Property @{            
  Computer = $_.__SERVER            
  Adapter = $_.InstanceName            
  ReceiveError = $_.NdisEthernetReceiveErrorAlignment            
  OneCollision = $one.NdisEthernetOneTransmitCollision            
  MoreCollision = $more.NdisEthernetMoreTransmitCollisions            
 }            
}            
}

Start by getting the members of the MSNdis_EthernetReceiveErrorAlignment  class. Loop through them and get the related MSNdis_EthernetOneTransmitCollision  and MSNdis_EthernetMoreTransmitCollisions classes.

 

Create an object for output


August 20, 2011  12:29 PM

Powershell and WMI–MEAP Chapters 12 and 13

Richard Siddaway Richard Siddaway Profile: Richard Siddaway

Chapters 12 and 13 have been added to the early access program.

 

Chapter 12: Internet Information Server (IIS) may not be the first application that comes to mind when we think of using WMI to administer remote servers, but it provides a lot of functionality. You’ll learn to administer the web server itself, websites, applications, and application pools.

Chapter 13: Configuring a new server is a task that occurs on a regular basis in most organizations. All of the activities required to configure a new server take time. You can use PowerShell functions to perform these tasks remotely so you don’t need to spend time accessing the server directly.

The code for all chapters is available for download.

 

The MEAP is available from http://www.manning.com/siddaway2/


August 19, 2011  1:10 PM

Testing MAC address changes

Richard Siddaway Richard Siddaway Profile: Richard Siddaway

My recent post on using MSNdis_EthernetCurrentAddress to get the MAC address may have had you saying so what because I can do this

 

Get-WmiObject -Class Win32_NetworkAdapter -ComputerName "." | select Name, MACAddress

 

However, there is another class MSNdis_EthernetPermanentAddress which shows the permanent address. This means we can see if the MAC address has been changed. This does happen in a few places including NLB.

function convert-macaddresstostring{            
 param ($address)            
             
 $values = @()            
 $address |             
 select -ExpandProperty Address |            
 foreach {            
  $values += ([convert]::ToString($_,16)).ToUpper().PadLeft(2,"0")            
 }            
             
 $values -join "-"            
}             
            
function test-macaddresschange {            
param(            
 [string]$computer="."            
)            
Get-WmiObject -Namespace root\wmi -Class MSNdis_EthernetCurrentAddress `
-ComputerName $computer |            
foreach {            
              
  $currentmac = convert-macaddresstostring $($_.NdisCurrentAddress)            
              
  $perm = Get-WmiObject -Namespace root\wmi  `
  -Class MSNdis_EthernetPermanentAddress -ComputerName $computer `
  -Filter "InstanceName='$($_.InstanceName)'"            
              
  $permanentmac = convert-macaddresstostring $($perm.NdisPermanentAddress)            
              
  New-Object -TypeName PSobject -Property @{            
  Computer = $_.__SERVER            
  Adapter = $_.InstanceName            
  CurrentMACAddress = $currentmac            
  PermanentMACAddress = $permanentmac            
 }            
}            
}            
            

You should recognise this from the previous post. We use MSNdis_EthernetCurrentAddress  and loop through the adapters. Then MSNdis_EthernetPermanentAddress  is used to get the permanent MAC address of the instance. Instance name is used as a filter. The conversion of the MAC address from integer array to string is pushed into its own function.

The output object is altered to show current and permanent addresses


August 18, 2011  1:01 PM

Find the MAC address

Richard Siddaway Richard Siddaway Profile: Richard Siddaway

One thing that has bugged me for years is having to use the /all parameter with ipconfig to get the MAC address. It also doesn’t work on remote machines. bah humbug.

The MSNdis_EthernetCurrentAddress class in the root\wmi namespace offers a quicker way

function get-macaddress {            
param(            
 [string]$computer="."            
)            
Get-WmiObject -Namespace root\wmi -Class MSNdis_EthernetCurrentAddress `
-ComputerName $computer |            
foreach {            
 $values = @()            
 $_.NdisCurrentAddress |             
 select -ExpandProperty Address |            
 foreach {            
  $values += ([convert]::ToString($_,16)).ToUpper().PadLeft(2,"0")            
 }            
             
 $mac = $values -join "-"            
 New-Object -TypeName PSobject -Property @{            
  Computer = $_.__SERVER            
  Adapter = $_.InstanceName            
  MACAddress = $mac            
 }            
}            
}

Get the WMI objects for MSNdis_EthernetCurrentAddress. For each of them take the NdisCurrentAddress and expand the address property. This gives 6 integer values one for each element of the MAC address. We convert them to hex, convert to upper case and pad a 0 to the left if needed. the MAC address is created by joining those 6 values with a hyphen.

An object is created to output the results


August 17, 2011  2:19 AM

Half price PowerShell books

Richard Siddaway Richard Siddaway Profile: Richard Siddaway

Check www.manning .com for a half price deal on PoweShell books:

  • PowerShell in Practice
  • PowerShell and WMI
  • PowerShell in Action
  • Learn PowerShell in a month of lunches

Hurry. Today only!


Forgot Password

No problem! Submit your e-mail address below. We'll send you an e-mail containing your password.

Your password has been sent to: