14 August 2015

SCCM Inactive Systems Report

I have wanted a PowerShell script that would generate an excel report listing all of the inactive systems, if they are in active directory, and the last time someone logged onto the system if it is in AD. As we all know, it is easy to overlook these systems and they can accumulate, even if the cleanup is setup in SCCM. I chose to use SCCM as the definitive report because it pulls it's initial listing of systems from AD. This script has to be executed on the SCCM server.

I have the script require two parameters: 1) OutputFile and 2) Path. The output file is the name of the CSV file and the Path is the location for the script to write the CSV file to. I have prepopulated the OutputFile parameter, but you can change that if necessary.

The next thing will be that you will need to find your collection ID of your Client Activity: Inactive collection and update that on line 40. If you do not have this collection, you will need to create a collection listing all inactive systems and use the collection ID assigned to it.

Now find out where ConfigurationManager.psd1 is located on your SCCM server and update line 94 with the full path to the module.

The SCCM server needs the PowerShell active directory module feature enabled for this script to function. It is located under RSAT in the Windows Features.

Finally, you will need to execute this script on the SCCM server. I have not found any way around this. I have this script setup in Microsoft Orchestrator that uses PSEXEC.EXE to execute the PowerShell script locally on the SCCM server on a weekly basis. It works flawlessly. Again, this script is running in my company's environment, which will largely differ from others. You will need to modify this script to get it to work in your environment.

You can download the script from here.


1:  <#  
2:            ===========================================================================  
3:            Created with:     SAPIEN Technologies, Inc., PowerShell Studio 2015 v4.2.91  
4:            Created on:       8/13/2015 1:36 PM  
5:            Created by:       Mick Pletcher  
6:            Organization:  
7:            Filename:         InactiveSCCMSystemsReport.ps1  
8:            Description:      This script will retrieve the SCCM inactive systems  
9:                              collection and search active directory to see if it   
10:                             exists there. If so, it will retrieve the last   
11:                             logon date and generate a UTF-8 formatted csv file.  
12:    
13:                             The powershell active directory module will need to be  
14:                             enabled on the SCCM server in order for this script to   
15:                             work correctly. This script will also need to be executed  
16:                             on the SCCM server. You will also need to find the location  
17:                             of ConfigurationManager.psd1 module to import.   
18:            ===========================================================================  
19:  #>  
20:  param  
21:  (  
22:       [string]  
23:       $OutputFile = 'InactiveSCCMSystemsReport.csv',  
24:       [string]  
25:       $Path  
26:  )  
27:  Import-Module ActiveDirectory  
28:    
29:    
30:  function ProcessTextFile {  
31:       If ((Test-Path -Path $OutputFile) -eq $true) {  
32:            Remove-Item -Path $OutputFile -Force  
33:       }  
34:  }  
35:    
36:  function Get-SCCMInactiveSystems {  
37:       #Declare Local Variables  
38:       Set-Variable -Name Systems -Scope Local -Force  
39:         
40:       $Systems = get-cmdevice -collectionid "BNA00093" | select name | Sort-Object Name  
41:       Return $Systems  
42:         
43:       #Cleanup Local Variables  
44:       Remove-Variable -Name Systems -Scope Local -Force  
45:  }  
46:    
47:  function Find-SCCMInactiveSystemInAD {  
48:       param ([string]  
49:            $System)  
50:         
51:       #Declare Local Variables  
52:       Set-Variable -Name AD -Scope Local -Force  
53:       $ErrorActionPreference = 'SilentlyContinue'  
54:       $AD = Get-ADComputer $System  
55:       $ErrorActionPreference = 'Continue'  
56:       if ($AD -ne $null) {  
57:            Return "X"  
58:       } else {  
59:            Return " "       
60:       }  
61:         
62:       #Cleanup Local Variables  
63:       Remove-Variable -Name AD -Scope Local -Force  
64:  }  
65:    
66:  function Get-LastLogonDate {  
67:       param ([string]  
68:            $System)  
69:         
70:       #Declare Local Variables  
71:       Set-Variable -Name AD -Scope Local -Force  
72:         
73:       $AD = Get-ADComputer $System -ErrorAction SilentlyContinue  
74:       $AD = $AD.SamAccountName  
75:       $AD = $AD.Substring(0, $AD.Length - 1)  
76:       $AD = Get-ADComputer -Identity $AD -Properties *  
77:       $AD = $AD.LastLogonDate  
78:       Return $AD  
79:              
80:       #Cleanup Local Variables  
81:       Remove-Variable -Name AD -Scope Local -Force  
82:  }  
83:    
84:  #Declare Variables  
85:  Set-Variable -Name ADEntry -Scope Local -Force  
86:  Set-Variable -Name Counter -Value 1 -Scope Local -Force  
87:  Set-Variable -Name LastLogon -Scope Local -Force  
88:  Set-Variable -Name Output -Scope Local -Force  
89:  Set-Variable -Name SCCMInactiveSystems -Scope Local -Force  
90:  Set-Variable -Name System -Scope Local -Force  
91:    
92:  cls  
93:  Import-Module -Name ActiveDirectory  
94:  Import-Module "D:\Program Files\Microsoft Configuration Manager\AdminConsole\bin\ConfigurationManager.psd1" -Force -Scope Global  
95:  Set-Location BNA:  
96:  $SCCMInactiveSystems = Get-SCCMInactiveSystems  
97:  Set-Location c:  
98:  $OutputFile = $Path + "\" + $OutputFile  
99:  ProcessTextFile  
100:  $Output = "Computer Name" + [char]44+"Active Directory"+[char]44+"Last Logon"  
101:  Out-File -FilePath $OutputFile -InputObject $Output -Force -Encoding UTF8  
102:  foreach ($System in $SCCMInactiveSystems) {  
103:       cls  
104:       $Output = "Processing "+$System.Name+" -- "+$Counter+" of "+$SCCMInactiveSystems.Count  
105:       Write-Host $Output  
106:       $Counter++  
107:       $ADEntry = Find-SCCMInactiveSystemInAD -System $System.Name  
108:       If ($ADEntry -ne " ") {  
109:            $LastLogon = Get-LastLogonDate -System $System.Name  
110:       }  
111:       $Output = $System.Name+[char]44+$ADEntry+[char]44+$LastLogon  
112:       Out-File -FilePath $Global:OutputFile -InputObject $Output -Append -Force -Encoding UTF8  
113:       $ADEntry = $null  
114:       $LastLogon = $null  
115:       $Output = $null  
116:  }  
117:    
118:  #Cleanup Variables  
119:  Remove-Variable -Name ADEntry -Scope Local -Force  
120:  Remove-Variable -Name Counter -Scope Local -Force  
121:  Remove-Variable -Name LastLogon -Scope Local -Force  
122:  Remove-Variable -Name Output -Scope Local -Force  
123:  Remove-Variable -Name SCCMInactiveSystems -Scope Local -Force  
124:  Remove-Variable -Name System -Scope Local -Force  
125:    

Related Posts:

  • Deploying enormous packages across a WAN As many of you might know, deploying huge packages through SCCM can be a challenge. The first question you might ask is, define enormous. IMO, anything over the default 5GB client cache size is enormous. Working in the archi… Read More
  • Microsoft Office Updater One of the things that has annoyed me in the past is having to keep the Microsoft Office Updates folder up-to-date with the latest .MSP files. The reason I bother with keeping the Updates folder up-to-date is because it spe… Read More
  • SCCM: Package not updating on the distribution points You have made changes to your installation package and it does not update on the distribution points, even after validating and redistributing. I ran into this issue and could not figure out why it was doing this. I ended up… Read More
  • SCCM 2012 R2 Client Uninstalls after Reboot I encountered an issue with SCCM 2012 R2 when deploying the client to systems that were being upgraded from SCCM 2007. What would happen was that I pushed the client to the system through the console using the Install Client… Read More
  • Running Programs as an Application Installation in SCCM 2012 Recently, I had to deploy an application, IntApp, with minimal intrusion and no reboots. Part of the process was to restart the application after a successful installation. The crux was that the application has to run und… Read More

0 comments:

Post a Comment