smartguy5000

deviceCollectionBuildoutSCCMByADOU

Mar 24th, 2016
765
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <#
  2. .SYNOPSIS
  3.  
  4.     Powershell script to buildout SCCM Device collections
  5. .DESCRIPTION
  6.  
  7.     Grabs OU from AD, and generates a collection group for the corp, and adds collections with the desktops\laptops computers based on teach,stu,or admin of the OU being a membership rule
  8. .PARAMETER debug
  9.  
  10.     turns on visible debugging and debug logging, warning all ye who enter here, your eyes shall bleed
  11. .EXAMPLE
  12.  
  13.     & .\corpDeviceCollectionBuildout.ps1
  14. .OUTPUTS
  15.  
  16.     c:\windows\Temp\logs\corpDeviceCollectionBuildout$date.log logfile outputting changes
  17. .NOTES
  18.  
  19.     Name: sanitizedDeviceCollectionBuildout.ps1
  20.     Author: Smartguy5000
  21.     Last Modified: 03/24/2016 14:07
  22. #>
  23.  
  24. <#
  25. .CHANGELOG
  26. v1.0 - initial write
  27. .VERSION
  28. 1.0
  29. #>
  30.  
  31. #Parent IDs of Device Collection Folders
  32. <#
  33. Name                                  objectType ParentContainerNodeID ContainerNodeID
  34. ----                                  ---------- --------------------- ---------------
  35. TEST Computers                             5000                     0             781
  36.     TEST corps Computers                 5000                   781             782 corps OU
  37.     TEST Administrative Office Computers   5000                   781             783 Employees OU
  38. #>
  39. [CmdletBinding(SupportsShouldProcess=$True)]
  40. Param(
  41. )
  42.  
  43. Function New-CollectionFolder
  44. {
  45. Param(
  46.         [parameter(Mandatory = $true)]$folderName,
  47.         [parameter(Mandatory = $true)]$ParentCollectionNodeID      
  48.      )
  49.     $CollectionFolderArgs = @{
  50.     Name = $FolderName;
  51.     ObjectType = "5000";         # 5000 means Collection_Device, 5001 means Collection_User
  52.     ParentContainerNodeid = "$ParentCollectionNodeID"  # 0 is root.
  53.    
  54.     }
  55.        set-ciminstance -Class "SMS_ObjectContainerNode" -arguments $CollectionFolderArgs -namespace "root\SMS\Site_$sitecode" -ComputerName $siteserver -PutType CreateOnly | Out-Null
  56. }
  57. Function Move-CMObject
  58. {
  59.     [CmdLetBinding()]
  60.     Param(
  61.     [Parameter(Mandatory=$True,HelpMessage="Please Enter Site Server Site code")]
  62.               $SiteCode,
  63.     [Parameter(Mandatory=$True,HelpMessage="Please Enter Site Server Name")]
  64.               $SiteServer,
  65.     [Parameter(Mandatory=$True,HelpMessage="Please Enter Object ID")]
  66.               [ARRAY]$ObjectID,
  67.     [Parameter(Mandatory=$True,HelpMessage="Please Enter current folder ID")]
  68.               [uint32]$CurrentFolderID,
  69.     [Parameter(Mandatory=$True,HelpMessage="Please Enter target folder ID")]
  70.               [uint32]$TargetFolderID,
  71.     [Parameter(Mandatory=$True,HelpMessage="Please Enter object type ID")]
  72.               [uint32]$ObjectTypeID              
  73.         )
  74.    
  75.     Try{
  76.         invoke-ciminstance -Namespace "Root\SMS\Site_$SiteCode" -Class SMS_objectContainerItem -Name MoveMembers -ArgumentList $CurrentFolderID,$ObjectID,$ObjectTypeID,$TargetFolderID -ComputerName $SiteServer -ErrorAction STOP
  77.     }
  78.     Catch{
  79.         $_.Exception.Message
  80.     }  
  81.                                                          
  82. }
  83. $origVerbPref = $VerbosePreference
  84. Start-Transcript 'C:\Windows\Temp\computerCollectionBuildout.log'
  85.  
  86. import-module 'C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\ConfigurationManager.psd1'
  87. $OriginalLocaiton = Get-Location
  88.  
  89.  
  90. $VerbosePreference = 'Continue'
  91.  
  92. $sitecode      = "CEN"
  93. Set-Location "${SiteCode}:"
  94. $siteserver    = "CM_CAS.$env:userdnsdomain"
  95. $objectType = '5000' #DeviceCollectionFolder
  96. ###########
  97. $ParentNodeID = '782' #TEST corps Computers Folder
  98. $SearchBase = 'OU=Computers,OU=Organization,DC=corp,DC=contoso,DC=com'
  99. ###########
  100. $OUArray = Get-ADOrganizationalUnit -Filter * -SearchBase $SearchBase -SearchScope OneLevel
  101.  
  102. [int]$Hour = '00'
  103. [int]$Min = '00'
  104. $i = 0
  105.  
  106.  
  107.     ForEach ($OU in $OUArray)
  108.         {
  109.             $OUName = $OU.Name
  110.             $FolderName = 'TEST ' + $OUName + ' Computers'
  111.             Write-Verbose "$OUName"
  112.             $SearchBase = $OU.DistinguishedName
  113.             $SubOUArray = Get-ADOrganizationalUnit -Filter * -SearchBase $SearchBase -SearchScope OneLevel -Properties Name,DistinguishedName,CanonicalName | Select-Object Name,DistinguishedName,CanonicalName
  114.             Write-Verbose "Adding $FolderName Folder"
  115.             New-CollectionFolder -folderName $FolderName $ParentNodeID
  116.             start-sleep -s '7'
  117.             Write-Verbose 'Awake'
  118.             ForEach ($SubOU in $SubOUArray)
  119.                 {          
  120.                     $SubOUName = $SubOU.Name
  121.                     $DepartmentNumber = $SubOUName.SubString($SubOUName.Length-4)
  122.                     $SubFolderName = 'TEST ' + $SubOUName + ' Computers'
  123.                     $ParentFolderWMI = get-ciminstance -namespace "ROOT\SMS\Site_$siteCode" -computername $siteserver -Query "SELECT * FROM SMS_ObjectContainerNode WHERE ObjectType=$objectType And Name like ""%${FolderName}%"""
  124.                     Write-Verbose "Adding $Subfoldername Subfolder"
  125.                     $SubParentNodeID = $ParentFolderWMI.ContainerNodeID
  126.                     New-CollectionFolder $SubFolderName $SubParentNodeID                  
  127.                     start-sleep -s '7'
  128.                     #add error checking here to see if new folder exists
  129.                     [string]$Hour = $Hour.ToString()
  130.                     [string]$Min = $Min.ToString()  
  131.                     If ($Hour.Length -eq 1)
  132.                         {
  133.                             $Hour = '0' + $Hour
  134.                         }            
  135.                     If ($Min.Length -eq 1)
  136.                         {
  137.                             $Min = '0' + $Min
  138.                         }  
  139.                     $CollectionName = 'TEST ' + $SubOUName + ' All Computers'        
  140.                     $SubFolderWMI = get-ciminstance -namespace "ROOT\SMS\Site_$siteCode" -computername $siteserver -Query "SELECT * FROM SMS_ObjectContainerNode WHERE ObjectType=$objectType And Name like ""%${SubFolderName}%"""
  141.                     $SubSubParentNodeID = $SubFolderWMI.ContainerNodeID  
  142.                     $Schedule = New-CMSchedule -Start "2016-04-01 ${Hour}:${Min}" -RecurInterval Days -RecurCount 1
  143.                     $NewcorpComputerCollection = New-CMDeviceCollection -Name $CollectionName -RefreshType 'Periodic' -RefreshSchedule $Schedule -LimitingCollectionName "TEST Workstations" -Confirm:$False
  144.                     start-sleep -S '5'
  145.                     Move-CMObject -SiteCode $sitecode -SiteServer $siteserver -ObjectID $NewcorpComputerCollection.CollectionID -CurrentFolderID '0' -TargetFolderID $SubSubParentNodeID -ObjectTypeID $objectType | Out-Null
  146.                     start-sleep -s '5'
  147.                     Add-CMDeviceCollectionQueryMembershipRule -CollectionName $CollectionName -RuleName "$($SubOU.Name) OU" -QueryExpression "select * from SMS_R_System where SMS_R_System.SystemOUName = '$($SubOU.CanonicalName)'" | Out-Null
  148.                     Write-Verbose "Added Collection"
  149.                     start-sleep -s '3'
  150.                             [int]$Hour = $Hour        
  151.                             [int]$Min = $Min
  152.                             $Min = $Min + 5
  153.                             If (($Min % 12) -eq '0')
  154.                                 {                    
  155.                                     $Hour = $Hour + 1
  156.                                     $Min = '0'                    
  157.                                 }
  158.                             If ([int]$Hour -gt '23')
  159.                                 {
  160.                                     $hour = '0'
  161.                                 }
  162.                     [int]$i = 0            
  163.                     While ($i -le '5')
  164.                         {
  165.                             Switch($i)
  166.                             {
  167.                                 0{
  168.                                     $OUSuffix = 'Laptop Computers'
  169.                                     $SubCollectionName = 'TEST ' + $SubOUName + ' ' + $OUSuffix                    
  170.                                     $Schedule2 = New-CMSchedule -Start "2016-04-01 ${Hour}:${Min}" -RecurInterval Days -RecurCount 1
  171.                                     Write-Verbose "Adding Collection"                                        
  172.                                     $NewComputerCollection = New-CMDeviceCollection -Name $SubCollectionName -RefreshType 'Periodic' -RefreshSchedule $Schedule2 -LimitingCollectionName $NewcorpComputerCollection.Name -Confirm:$False                    
  173.                                     Write-Verbose "Added Collection"
  174.                                     start-sleep -s '5'
  175.                                     Move-CMObject -SiteCode $sitecode -SiteServer $siteserver -ObjectID $NewComputerCollection.CollectionID -CurrentFolderID '0' -TargetFolderID $SubSubParentNodeID -ObjectTypeID $objectType | Out-Null
  176.                                     start-sleep -s '3'
  177.                                     Add-CMDeviceCollectionQueryMembershipRule -CollectionName $SubCollectionName -RuleName "$($SubOU.Name) Laptop Chassis Type" -QueryExpression "select * from SMS_R_System inner join SMS_G_System_SYSTEM_ENCLOSURE on SMS_G_System_SYSTEM_ENCLOSURE.ResourceID = SMS_R_System.ResourceId where SMS_G_System_SYSTEM_ENCLOSURE.ChassisTypes in ( ""8"", ""9"", ""10"", ""14"" )" | Out-Null                        
  178.                            
  179.                                  }
  180.                                 1{
  181.                                     $OUSuffix = 'Desktop Computers'
  182.                                     $SubCollectionName = 'TEST ' + $SubOUName + ' ' + $OUSuffix                    
  183.                                     $Schedule2 = New-CMSchedule -Start "2016-04-01 ${Hour}:${Min}" -RecurInterval Days -RecurCount 1
  184.                                     Write-Verbose "Adding Collection"                                        
  185.                                     $NewComputerCollection = New-CMDeviceCollection -Name $SubCollectionName -RefreshType 'Periodic' -RefreshSchedule $Schedule2 -LimitingCollectionName $NewcorpComputerCollection.Name -Confirm:$False                    
  186.                                     Write-Verbose "Added Collection"
  187.                                     start-sleep -s '5'
  188.                                     Move-CMObject -SiteCode $sitecode -SiteServer $siteserver -ObjectID $NewComputerCollection.CollectionID -CurrentFolderID '0' -TargetFolderID $SubSubParentNodeID -ObjectTypeID $objectType | Out-Null
  189.                                     start-sleep -s '3'
  190.                                     Add-CMDeviceCollectionQueryMembershipRule -CollectionName $SubCollectionName -RuleName "$($SubSubOU.Name) Desktop Chassis Type" -QueryExpression "select * from SMS_R_System inner join SMS_G_System_SYSTEM_ENCLOSURE on SMS_G_System_SYSTEM_ENCLOSURE.ResourceID = SMS_R_System.ResourceId where SMS_G_System_SYSTEM_ENCLOSURE.ChassisTypes not in ( ""8"", ""9"", ""10"", ""14"" )" | Out-Null                        
  191.                            
  192.                                  }
  193.                                 2{
  194.                                     $OUSuffix = 'Teacher Computers'
  195.                                     $SubCollectionName = 'TEST ' + $SubOUName + ' ' + $OUSuffix                    
  196.                                     $Schedule2 = New-CMSchedule -Start "2016-04-01 ${Hour}:${Min}" -RecurInterval Days -RecurCount 1
  197.                                     Write-Verbose "Adding Collection"                                        
  198.                                     $NewComputerCollection = New-CMDeviceCollection -Name $SubCollectionName -RefreshType 'Periodic' -RefreshSchedule $Schedule2 -LimitingCollectionName $NewcorpComputerCollection.Name -Confirm:$False                    
  199.                                     Write-Verbose "Added Collection"
  200.                                     start-sleep -s '5'
  201.                                     Move-CMObject -SiteCode $sitecode -SiteServer $siteserver -ObjectID $NewComputerCollection.CollectionID -CurrentFolderID '0' -TargetFolderID $SubSubParentNodeID -ObjectTypeID $objectType | Out-Null
  202.                                     start-sleep -s '3'
  203.                                     Add-CMDeviceCollectionQueryMembershipRule -CollectionName $SubCollectionName -RuleName "$($SubOU.Name) Teacher Computers" -QueryExpression "select * from SMS_R_System where SMS_R_System.SystemOUName like ""$($SubOU.CanonicalName)/${DepartmentNumber}Computers/%/${DepartmentNumber}-Teachers""" | Out-Null                        
  204.                            
  205.  
  206.                                  }
  207.                                 3{
  208.                                     $OUSuffix = 'Student Computers'
  209.                                     $SubCollectionName = 'TEST ' + $SubOUName + ' ' + $OUSuffix                    
  210.                                     $Schedule2 = New-CMSchedule -Start "2016-04-01 ${Hour}:${Min}" -RecurInterval Days -RecurCount 1
  211.                                     Write-Verbose "Adding Collection"                                        
  212.                                     $NewComputerCollection = New-CMDeviceCollection -Name $SubCollectionName -RefreshType 'Periodic' -RefreshSchedule $Schedule2 -LimitingCollectionName $NewcorpComputerCollection.Name -Confirm:$False                    
  213.                                     Write-Verbose "Added Collection"
  214.                                     start-sleep -s '5'
  215.                                     Move-CMObject -SiteCode $sitecode -SiteServer $siteserver -ObjectID $NewComputerCollection.CollectionID -CurrentFolderID '0' -TargetFolderID $SubSubParentNodeID -ObjectTypeID $objectType | Out-Null
  216.                                     start-sleep -s '3'
  217.                                     Add-CMDeviceCollectionQueryMembershipRule -CollectionName $SubCollectionName -RuleName "$($SubOU.Name) Student Computers" -QueryExpression "select * from SMS_R_System where SMS_R_System.SystemOUName like ""$($SubOU.CanonicalName)/${DepartmentNumber}Computers/%/${DepartmentNumber}-Students""" | Out-Null                        
  218.                            
  219.  
  220.                                  }
  221.                                 4{
  222.                                     $OUSuffix = 'Administration Computers'
  223.                                     $SubCollectionName = 'TEST ' + $SubOUName + ' ' + $OUSuffix                    
  224.                                     $Schedule2 = New-CMSchedule -Start "2016-04-01 ${Hour}:${Min}" -RecurInterval Days -RecurCount 1
  225.                                     Write-Verbose "Adding Collection"                                        
  226.                                     $NewComputerCollection = New-CMDeviceCollection -Name $SubCollectionName -RefreshType 'Periodic' -RefreshSchedule $Schedule2 -LimitingCollectionName $NewcorpComputerCollection.Name -Confirm:$False                    
  227.                                     Write-Verbose "Added Collection"
  228.                                     start-sleep -s '5'
  229.                                     Move-CMObject -SiteCode $sitecode -SiteServer $siteserver -ObjectID $NewComputerCollection.CollectionID -CurrentFolderID '0' -TargetFolderID $SubSubParentNodeID -ObjectTypeID $objectType | Out-Null
  230.                                     start-sleep -s '3'
  231.                                     Add-CMDeviceCollectionQueryMembershipRule -CollectionName $SubCollectionName -RuleName "$($SubOU.Name) Administration Computers" -QueryExpression "select * from SMS_R_System where SMS_R_System.SystemOUName like ""$($SubOU.CanonicalName)/${DepartmentNumber}Computers/%/${DepartmentNumber}-Administration""" | Out-Null                        
  232.                            
  233.  
  234.                                  }
  235.                                
  236.  
  237.                             }
  238.                             $Min = $Min + 5
  239.                             If (($Min % 12) -eq '0')
  240.                                 {                    
  241.                                     $Hour = $Hour + 1
  242.                                     $Min = '0'                    
  243.                                 }
  244.                             If ([int]$Hour -gt '23')
  245.                                 {
  246.                                     $hour = '0'
  247.                                 }
  248.                          $i = $i + 1  
  249.                         }
  250.                                                  
  251.                 }
  252.                    
  253.         }
  254.        
  255.    
  256.  
  257.  
  258. $VerbosePreference = $origVerbPref
  259. Set-Location = $OriginalLocaiton
  260.  
  261. Stop-Transcript
Advertisement
Add Comment
Please, Sign In to add comment