1

recently I took it upon myself to learn Powershell. It was a rough 2 weeks and a lot of reading but I'm getting better and better. I had some pressure at work to help with correcting our CMDB. We are about 7 months away from having a true Depolyment/Asset Management system in place. We have many reasons for relying on Powershell right now and we're trying to clean up a mess before we get the management system in. Anyway, I created a script that gets a lot of information for us. We have about 3000 objects/pcs and we need as much info as possible. Anyway, I created a script. So far it works well but I wanted some opinions from the experts or any advice. I feel like I did a decent job putting this together with only 2 weeks experiance but I really want to know what others think.

One thing I noticed: Windows 7 Boxes with IE9 and Up do not return a value for IE Version. Anyone know why?

Please see my code below:

    Set-QADPSSnapinSettings -defaultSizeLimit 0


    $FullPCList = (Get-QADComputer -SearchRoot $ou | Sort Name | select  -expand name)

    foreach ($computer in $FullPCList) {
    ping -n 2 $computer >$null
    if($lastexitcode -eq 0) { $Online = "Yes" } else { $Online = "No" }
    $PCInfo = (Get-WmiObject -ComputerName $computer -Class Win32_ComputerSystem -ErrorAction SilentlyContinue)
    $WinInfo = (Get-WmiObject -ComputerName $computer -Class Win32_OperatingSystem -ErrorAction SilentlyContinue)
    $ram = ((Get-WmiObject -ComputerName $computer -Class Win32_PhysicalMemory -ErrorAction SilentlyContinue | Measure-Object Capacity -Sum).Sum / 1MB)
    $bios = (Get-WmiObject -ComputerName $computer -Class Win32_Bios -ErrorAction SilentlyContinue)
    $ie = (Get-Wmiobject -ComputerName $computer -namespace “root\CIMV2\Applications\MicrosoftIE” -query “select version from MicrosoftIE_Summary” -ErrorAction SilentlyContinue)
    $freespace = ((Get-WmiObject -ComputerName $computer -Class Win32_LogicalDisk | Select Freespace | Measure-object Freespace -Sum).Sum / 1GB)


    #Start uptime check
    $LastBootUpTime = $WinInfo.ConvertToDateTime($WinInfo.LastBootUpTime)
    $Time = (Get-Date) - $LastBootUpTime
    $formattime = '{0:00}:{1:00}:{2:00}' -f $Time.Days, $Time.Hours, $Time.Minutes
    #End Uptime Check

          if ($WinInfo.Caption -match "Windows 7") {
                $name  = (Get-ChildItem -Path "\\$Computer\C$\Users" -Exclude "*Service*","*admin*","*Public*","*ffodero*","*jgalli*","*jwalters*","*frochet*" | Sort-Object LastAccessTime -Descending | Select-Object Name -First 1).Name
                $loggedintime     = (Get-ChildItem -Path "\\$Computer\C$\Users" -Exclude "*Service*","*admin*","*Public*","*ffodero*","*jgalli*" | Sort-Object LastAccessTime -Descending | Select-Object LastAccessTime -First 1).LastAccessTime
          }
          if ($WinInfo.Caption -match "Windows XP") {
                      $name                   = (Get-ChildItem -Path "\\$Computer\C$\Documents and Settings" -Exclude "*Service*","*admin*","*Public*" | Sort-Object LastAccessTime -Descending | Select-Object Name -First 1).Name
                      $loggedintime     = (Get-ChildItem -Path "\\$Computer\C$\Documents and Settings" -Exclude "*Service*","*admin*","*Public*" | Sort-Object LastAccessTime -Descending | Select-Object LastAccessTime -First 1).LastAccessTime
          }

    $table = @{
          Model = $PCInfo.Model
          IEVersion = $ie.Version
          Serial = $Bios.SerialNumber
          Memory = $ram
          DriveFreeSpaceGB = $freespace
          Manufacturer = $PCInfo.Manufacturer
          OSName = $WinInfo.Caption
          Computer = $computer
          Uptime = $formattime
          LastloggedinUser = $name
          LastLoggedinDate = $loggedintime
          LoggedOnDuringScan = $PCInfo.Username
          ServicePack = $WinInfo.ServicePackMajorVersion
          Online = $Online
                }
          New-Object PSObject -Property $table | Export-Csv C:\logs\mother.csv -NoTypeInformation -Append
    } 
Patrick
  • 107
  • 5
  • 16

1 Answers1

1

The namespace root\CIMV2\Applications\MicrosoftIE has been removed starting with Windows Vista (see note at the end of the blog post). You should be able to read the version number from the registry, though:

$hive = [UInt32]'0x80000002'
$key  = 'SOFTWARE\Microsoft\Internet Explorer'

$reg = [WMIClass]"\\$computer\root\default:StdRegProv"
$ieVersion = $reg.GetStringValue($hive, $key, 'Version').sValue
Ansgar Wiechers
  • 193,178
  • 25
  • 254
  • 328
  • Thanks! I've also come across another problem. $name and $logggedintime both return values when there is nothing to return. I am assuming its posting the previous variable to the table. How do i prevent it from doing this? This only happens if the PC is offline or RPC Service is unavailable for if i get access denied for some reason. – Patrick Aug 30 '13 at 13:25
  • The variables might retain values from a previous iteration. Unset variables before use to prevent that (e.g. `$var = $null` or `Remove-Variable var -EA SilentlyContinue`). – Ansgar Wiechers Aug 30 '13 at 17:17