Advertisement
Guest User

Untitled

a guest
Oct 3rd, 2017
501
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 62.01 KB | None | 0 0
  1. <#
  2. .SYNOPSIS
  3. This CM12 Function Library contains many functions
  4. .EXAMPLE
  5. Add-Prerequisites
  6. This example installs all required CM Site Server roles/features and configures Wirefall rules
  7. .EXAMPLE
  8. Add-Prerequisites -DotNet -File "C:\temp\dotNetFx40_Full_x86_x64.exe" -Arguments "/Q /NoRestart"
  9. This example installs all required CM Site Server roles, features and DotNet also
  10. .EXAMPLE
  11. Add-CMFolder -SiteCode PS1 -SiteServer localhost -FolderName "New Application Folder" -Type 6000
  12. This example adds under Applications new folder. Type 6000 means Application Folder. Object Type can be:
  13. Object type 2 - Package Folder
  14. Object type 7 - Query Folder
  15. Object type 9 - Software Metering Folder
  16. Object type 14 - Operating System Installers Folder
  17. Object type 17 - State Migration GFolder
  18. Object type 18 - Image Package Folder
  19. Object type 19 - Boot Image Folder
  20. Object type 20 - Task Sequence Folder
  21. Object type 23 - Driver Package Folder
  22. Object type 25 - Driver Folder
  23. Object type 2011 - Configuration Baseline Folder
  24. Object type 5000 - Device Collection Folder
  25. Object type 5001 - User Collection Folder
  26. Object type 6000 - Application Folder
  27. Object type 6001 - Configuration Item Folder
  28. .EXAMPLE
  29. Add-CMFolder -SiteCode PS1 -SiteServer localhost -FolderName "New Application test" -Type 6000 -ParentFolderID 16777244
  30. This example adds subfolder. If you need to create subfolders, then please use Get-CMFolder to get Folder ID(ContainerNodeID WMI property value)
  31. .EXAMPLE
  32. Get-CMFolder -SiteCode PS1 -SiteServer Localhost -Filter "Name='New Application test'"
  33. This example queris "New Application test" folder information
  34. .EXAMPLE
  35. Get-CMCollection -SiteCode PS1 -SiteServer Localhost
  36. This example queries all collections
  37. .EXAMPLE
  38. Add-CMCollection -SiteCode PS1 -SiteServer localhost -Name "New User Collection" -Type User -LimitToCollectionID SMS00002
  39. This example adds new User Collection and limits it All Users Collection
  40. .EXAMPLE
  41. Add-CMCollection -SiteCode PS1 -SiteServer localhost -Name "New User Collectionwith schedule " -Type User -LimitToCollectionID SMS00002 -Day saturday -NumberOfWeeks 2
  42. This example adds new User Collection and limits it All Users Collection and creates weekly schedule
  43. .EXAMPLE
  44. Add-CMCollection -SiteCode PS1 -SiteServer localhost -Name "New Collection Under User 2" -LimitToCollectionID SMS00002 -Folder "User 2" -Type user
  45. This example adds new User Collection and limits it All Users Collection and moves this new collection under folder "User 2"
  46. .EXAMPLE
  47. Add-CMCollection -SiteCode PS1 -SiteServer localhost -Name "New Collection with schedule" -LimitToCollectionID SMS00002 -Type user -CustomDay 6
  48. This example adds new User Collection and limits it All Users Collection and creates custom schedule
  49. .EXAMPLE
  50. Add-CMCollection -SiteCode PS1 -SiteServer localhost -Name "New Collection with schedule 3" -LimitToCollectionID SMS00002 -Type user -Day wednesday -MonthName Feburary -WeekOrder second
  51. This example adds new User Collection and limits it All Users Collection and creates Monthly schedule
  52. .EXAMPLE
  53. Add-CMCollection -SiteCode PS1 -SiteServer localhost -Name "New Collection with schedule 4" -LimitToCollectionID SMS00002 -Type user -MonthName June -MonthDay 23
  54. This example adds new User Collection and limits it All Users Collection and creates Monthly schedule
  55. .EXAMPLE
  56. Add-CMCollection -SiteCode PS1 -SiteServer localhost -Name "New Collection with schedule 5" -LimitToCollectionID SMS00002 -Type user -MonthName June -MonthDay 23 -Comment "Made by PowerShell"
  57. This example adds new User Collection and limits it All Users Collection and creates Monthly schedule and adds comment "Made by PowerShell"
  58. .EXAMPLE
  59. Add-CMCollection -SiteCode PS1 -SiteServer localhost -Name "New Collection inc" -LimitToCollectionID SMS00002 -Type user -CustomDay 6 -Incremental
  60. This example adds new User Collection and limits it All Users Collection and creates custom schedule with Incremental updates
  61. .EXAMPLE
  62. Add-CMCollection -SiteCode PS1 -SiteServer localhost -Name "New DEV Col" -LimitToCollectionID SMS00001 -Type Device -Comment "PowerShell Rocks" -Folder "Device 2"
  63. This example adds new Device Collection and limits it All Systems Collection and moves this new collection under folder "Device 2" and adds comment "PowerShell Rocks"
  64. .EXAMPLE
  65. Move-CMItem -SiteCode PS1 -SiteServer localhost -TargetContainerName "Device Catalog" -ObjectTypeID 5000 -ObjectID TRT0000C
  66. This example moves Collection TRT0000C to folder "Device Catalog"
  67. .EXAMPLE
  68. Set-CMCollectionQueryRule -SiteServer localhost -SiteCode PS1 -Query 'select * from SMS_R_User where SMS_R_User.UserGroupName = "CORP\\SW 7-Zip Install"' -queryname "7-ZIP" -QueryType User -CollectionName "7-Zip installation"
  69. This example adds query based rule to users collection.
  70. .EXAMPLE
  71. Set-CMCollectionExcludeRule -Sitecode PS1 -SiteServer localhost -collectionName "EP WRK PROD" -ExcludeCollectionName "EP pilot 1"
  72. This example adds exclusion rule
  73. .EXAMPLE
  74. Set-CMCollectionIncludeRule -Sitecode PS1 -SiteServer localhost -collectionName "EP WRK PROD" -IncludeCollectionName "EP Pilot Include"
  75. This example adds inclusion rule
  76. .EXAMPLE
  77. Set-CMCollectionDirectRule -SiteServer localhost -SiteCode PS1 -ResourceName server3 -CollectionName "EP WRK PROD"
  78. This example adds direct membership rule
  79. .EXAMPLE
  80. Add-CMBoundary -Name "AD TRT" -Value "AD" -Type AD -SiteCode PS1 -SiteServer Localhost
  81. This example adds Active Directory Site boundary
  82. .EXAMPLE
  83. Add-CMBoundary -Name "IPv6" -Value "Fe80:0000:0000:0000" -Type Ipv6 -SiteCode PS1 -SiteServer Localhost
  84. This example adds IPv6 boundary
  85. .EXAMPLE
  86. Add-CMBoundary -Name "IpSubNet" -Value "192.168.1.0" -Type IPSubNet -SiteCode PS1 -SiteServer Localhost
  87. This example adds IPSubnet boundary
  88. .EXAMPLE
  89. Add-CMBoundary -Name "IpRange" -Value "192.168.10.1-192.168.10.6" -Type IPRange -SiteCode PS1 -SiteServer Localhost
  90. This example adds IPRange boundary
  91. .EXAMPLE
  92. Add-CMBoundaryGroup -SiteServer localhost -Sitecode PS1 -Name "New York Clients"
  93. This example adds boundary group "New York Clients"
  94. .EXAMPLE
  95. Add-CMBoundaryToGroup -SiteServer localhost -Sitecode PS1 -BoundaryGroup "New York Clients" -Boundary "AD NY"
  96. This example adds boundary "AD NY" to boundary group "New York Clients"
  97. .EXAMPLE
  98. Add-CMSiteSystemToBoundaryGroup -SiteServer localhost -Sitecode PS1 -sitesystem "server1.cm.local" -BoundaryGroup "New York Clients" -ConnectionType Slow
  99. This example adds site system "Server1.CM.Local" to boundary group 'New York Clients' and modifies the connection type to slow
  100. .EXAMPLE
  101. Add-CMSiteSystemToBoundaryGroup -SiteServer localhost -Sitecode PS1 -sitesystem "server2.cm.local" -BoundaryGroup "New York Clients"
  102. This example adds site system "Server2.CM.Local" to boundary group 'New York Clients'
  103. .EXAMPLE
  104. Create-CMAccount -MACAddress 00:15:5D:C2:A3:20 -SiteServer localhost -SiteCode PS1 -AccountName TEST6 -CollectionName "OSD Bare Metal"
  105. This example creates new ConfigMgr account
  106. .EXAMPLE
  107. Add-WSUS -File C:\Users\Administrator\Downloads\WSUS30-KB972455-x64.exe -arguments "/q CONTENT_LOCAL=0 DEFAULT_WEBSITE=0 CREATE_DATABASE=1 SQLINSTANCE_NAME=%Computername%"
  108. This example installs WSUS 3.0 SP2 to SQL default instance.
  109. .EXAMPLE
  110. Add-WDS
  111. By default this example installs Windows Deployment Service to system drive and configures PXE response policy. If you want to configure WDS to another partition,
  112. then use the parameter Folder
  113. .NOTES
  114. Developed by Kaido Järvemets
  115. Version 1.0
  116. .LINK
  117. Http://depsharee.blogspot.com
  118. Http://blog.Coretech.dk
  119. #>
  120.  
  121. ##----------------------------------------------------------------------------------------------------
  122. ## Function: Set-ServiceState
  123. ## Purpose: This function configures service start mode
  124. ##----------------------------------------------------------------------------------------------------
  125. Function Set-ServiceState
  126. {
  127. [CmdLetBinding()]
  128. Param(
  129. [Parameter(Mandatory=$True, HelpMessage = "Please enter Service name")]
  130. $ServiceName,
  131. [Parameter(Mandatory=$True, HelpMessage = "Please enter Service Start mode")]
  132. $StartMode
  133. )
  134.  
  135. Try {
  136. $ServiceQuery = Get-WmiObject -Class Win32_Service -ErrorAction STOP -Filter "Name='$ServiceName'"
  137. $Return = $ServiceQuery.ChangeStartMode("$StartMode")
  138.  
  139. If($Return.ReturnValue -eq 0){
  140. Write-Host " - Successfully $StartMode $ServiceName Service"
  141. }
  142. Else{
  143. Write-Host "Something went wrong"
  144. }
  145. }
  146. Catch{
  147. Write-Host "Error: $($_.Exception.Message)"
  148. }
  149. }
  150.  
  151. ##----------------------------------------------------------------------------------------------------
  152. ## Function: Create-WindowsFWRules
  153. ## Purpose: This function configures Windows Firewall rules
  154. ##----------------------------------------------------------------------------------------------------
  155. Function Create-WindowsFWRules
  156. {
  157.  
  158. $PROTOCOL_TCP = 6
  159.  
  160. $FireWall = New-Object -ComObject HNetCfg.FwMgr
  161. $SQLServePort = New-Object -ComObject HNetCfg.FWOpenPort
  162. $SQLServerBrokerPort = New-Object -ComObject HNetCfg.FWOpenPort
  163.  
  164. $SQLServePort.Name = "SQL Server (TCP 1433)"
  165. $SQLServePort.Port = 1433
  166. $SQLServePort.Protocol = $PROTOCOL_TCP
  167. $SQLServerBrokerPort.Name = "SQL Service Broker (TCP 4022)"
  168. $SQLServerBrokerPort.Port = 4022
  169. $SQLServerBrokerPort.Protocol = $PROTOCOL_TCP
  170.  
  171. $DomainProfile = $FireWall.LocalPolicy.GetProfileByType(0)
  172. $DomainProfile.GloballyOpenPorts.Add($SQLServePort)
  173. $DomainProfile.GloballyOpenPorts.Add($SQLServerBrokerPort)
  174.  
  175. }
  176.  
  177. ##----------------------------------------------------------------------------------------------------
  178. ## Function: Add-Prerequisites
  179. ## Purpose: This function installs Prerequisites components for CM12 Site Server
  180. ##----------------------------------------------------------------------------------------------------
  181. Function Add-Prerequisites
  182. {
  183. [CmdLetBinding(DefaultParameterSetName = "None")]
  184. Param(
  185. [Parameter(Mandatory=$True,ParameterSetName='DotNet')]
  186. [Switch]$DotNet,
  187. [Parameter(Mandatory=$True,HelpMessage="Please enter DotNet installation file location",ParameterSetName='DotNet')]
  188. $File,
  189. [Parameter(Mandatory=$True,HelpMessage="Please enter DotNet installation parameters",ParameterSetName='DotNet')]
  190. $Arguments,
  191. [Parameter(Mandatory=$False)]
  192. [Switch]$ConfigureFireWall,
  193. [Parameter(Mandatory=$False)]
  194. [Switch]$DisableFireWall
  195. )
  196.  
  197. $Roles = @("Web-Server", "Web-Asp-Net", "Web-ASP", "Web-Windows-Auth", "Web-Metabase", "Web-WMI", "BITS", "RDC", "NET-Framework-Core","NET-HTTP-Activation")
  198.  
  199. Try{
  200. Write-Host " - Loading Server Manager PowerShell Module"
  201. Import-Module servermanager -ErrorAction STOP
  202. }
  203. Catch{
  204. Write-Host "Failed to load Server Manager PowerShell Module"
  205. }
  206.  
  207. Try{
  208. Write-Host " - Adding Server Roles and Features"
  209. Add-WindowsFeature $Roles -ErrorAction STOP
  210. }
  211. Catch{
  212. Write-Host "Error: $($_.Exception.Message)"
  213. }
  214.  
  215. If($DotNet){
  216. Try{
  217. Write-Host " - Installing DotNet 4.0 "
  218. $Install = Start-Process $File -ArgumentList $Arguments -ErrorAction STOP -Wait -PassThru
  219. Write-Host " - Installation Return Code:$($Install.ExitCode)"
  220. }
  221. Catch{
  222. Write-Host "Error: $($_.Exception.Message)"
  223. }
  224. }
  225.  
  226. If($ConfigureFireWall){
  227. Create-WindowsFWRules
  228. }
  229.  
  230. If($DisableFireWall){
  231. Set-ServiceState -ServiceName MpsSvc -StartMode disabled
  232. }
  233. }
  234.  
  235. ##----------------------------------------------------------------------------------------------------
  236. ## Function: Get-CMFolder
  237. ## Purpose: This function retrieves CM folder information
  238. ##----------------------------------------------------------------------------------------------------
  239. Function Get-CMFolder
  240. {
  241. [CmdLetBinding()]
  242. Param(
  243. [Parameter(Mandatory=$True,HelpMessage="Please Enter Primary Server Site code")]
  244. $SiteCode,
  245. [Parameter(Mandatory=$True,HelpMessage="Please Enter Primary Server Name")]
  246. [String]$SiteServer,
  247. [Parameter(Mandatory=$True,HelpMessage="Please Enter filter")]
  248. [String]$Filter
  249. )
  250.  
  251. $Class = "SMS_ObjectContainerNode"
  252.  
  253. Try{
  254. Get-WmiObject -Namespace "root\SMS\Site_$SiteCode" -Class $Class -Filter $Filter -ErrorAction STOP -ComputerName $SiteServer
  255. }
  256. Catch{
  257. Write-Host "Error: $($_.Exception.Message)"
  258. }
  259. }
  260.  
  261. ##----------------------------------------------------------------------------------------------------
  262. ## Function: Add-CMFolder
  263. ## Purpose: This function adds CM12 folder
  264. ##----------------------------------------------------------------------------------------------------
  265. Function Add-CMFolder
  266. {
  267. [CmdLetBinding()]
  268. Param(
  269. [Parameter(Mandatory=$True,HelpMessage="Please Enter Primary Server Site code")]
  270. $SiteCode,
  271. [Parameter(Mandatory=$True,HelpMessage="Please Enter Primary Server Name")]
  272. [String]$SiteServer,
  273. [Parameter(Mandatory=$True,HelpMessage="Please Enter folder name")]
  274. [String]$FolderName,
  275. [Parameter(Mandatory=$True,HelpMessage="Please Enter folder type")]
  276. [ValidateSet(2,7,9,14,17,18,19,20,23,25,2011,5000,5001,6000,6001)]
  277. $Type,
  278. [Parameter(Mandatory=$False)]
  279. $ParentFolderID = 0
  280. )
  281.  
  282. $Class = "SMS_ObjectContainerNode"
  283. $Arguments = @{Name="$FolderName";ObjectType="$Type";ParentContainerNodeId="$ParentFolderID"}
  284.  
  285. If((Get-CMFolder -SiteCode $SiteCode -SiteServer $SiteServer -Filter "Name='$FolderName' and ObjectType='$Type'") -ne $Null){
  286.  
  287. Write-Host "Folder already exists"
  288. }
  289. Else{
  290. Try{
  291. Set-WmiInstance -Namespace "root\sms\site_$SiteCode" -Class $Class -Arguments $Arguments -ComputerName $SiteServer -ErrorAction STOP
  292. }
  293. Catch{
  294. Write-Host "Error: $($_.Exception.Message)"
  295. }
  296. }
  297. }
  298.  
  299.  
  300. ##----------------------------------------------------------------------------------------------------
  301. ## Function: Get-CMCollection
  302. ## Purpose: This function queries all CM Collections
  303. ##----------------------------------------------------------------------------------------------------
  304. Function Get-CMCollection
  305. {
  306. [CmdletBinding()]
  307. Param(
  308. [Parameter(Mandatory=$True,HelpMessage="Please Enter Site Server Site code")]
  309. $SiteCode,
  310. [Parameter(Mandatory=$True,HelpMessage="Please Enter Site Server name")]
  311. $SiteServer,
  312. [Parameter(Mandatory=$False,HelpMessage="Please Enter Query Filter")]
  313. $Filter
  314. )
  315.  
  316. $Class = "SMS_Collection"
  317.  
  318. Try{
  319. Get-WmiObject -Namespace "root\SMS\Site_$SiteCode" -Class $Class -Filter $Filter -ErrorAction STOP -ComputerName $SiteServer
  320. }
  321. Catch{
  322. Write-Host "Error: $($_.Exception.Message)"
  323. }
  324. }
  325.  
  326. ##----------------------------------------------------------------------------------------------------
  327. ## Function: Move-Item
  328. ## Purpose: This function moves CM12 objects
  329. ##----------------------------------------------------------------------------------------------------
  330. Function Move-CMItem
  331. {
  332. [CmdletBinding()]
  333. Param(
  334. [Parameter(Mandatory=$True,HelpMessage="Please Enter Site Server Site code")]
  335. $SiteCode,
  336. [Parameter(Mandatory=$True,HelpMessage="Please Enter Site Server Name")]
  337. $SiteServer,
  338. $ContainerNodeID = 0,
  339. [Parameter(Mandatory=$True,HelpMessage="Please Enter Object ID")]
  340. $ObjectID,
  341. [Parameter(Mandatory=$True,HelpMessage="Please Enter Object Type")]
  342. $ObjectTypeID,
  343. [Parameter(Mandatory=$True,HelpMessage="Please Enter target container name")]
  344. [String]$TargetContainerName
  345. )
  346.  
  347. $Method = "MoveMembers"
  348. $Class = "SMS_objectContainerItem"
  349. $colon = ":"
  350.  
  351. $FolderID = Get-CMFolder -SiteCode $SiteCode -SiteServer $SiteServer -Filter "Name='$TargetContainerName' and ObjectType='$ObjectTypeID'"
  352.  
  353. If($FolderID -ne $Null){
  354. Try{
  355. $WMIConnection = [WMIClass]"\\$SiteServer\root\SMS\Site_$SiteCode$Colon$Class"
  356. $MoveItem = $WMIConnection.psbase.GetMethodParameters($Method)
  357. $MoveItem.ContainerNodeID = $ContainerNodeID
  358. $MoveItem.InstanceKeys = $ObjectID
  359. $MoveItem.ObjectType = $ObjectTypeID
  360. $MoveItem.TargetContainerNodeID = $FolderID.ContainerNodeID
  361. $Return = $WMIConnection.psbase.InvokeMethod($Method,$MoveItem,$null)
  362.  
  363. if($Return.ReturnValue -eq 0){
  364. Write-Host "Object Successfully moved to new location" -ForegroundColor Green
  365. }
  366. }
  367. Catch{
  368. Write-Host "Error: $($_.Exception.Message)"
  369. }
  370. }
  371. Else{
  372. Write-Host "Cannot move item because there is no such Folder" -ForegroundColor RED
  373. }
  374.  
  375. }
  376.  
  377. ##----------------------------------------------------------------------------------------------------
  378. ## Function: Convert-MonthToNumbers
  379. ## Purpose: This function converts Month names to numbers
  380. ##----------------------------------------------------------------------------------------------------
  381. Function Convert-MonthToNumbers
  382. {
  383. [CmdletBinding()]
  384. Param(
  385. [String]$MonthName
  386. )
  387.  
  388. Switch ($MonthName)
  389. {
  390. "January" {$MonthNumber = 1}
  391. "Feburary" {$MonthNumber = 2}
  392. "March" {$MonthNumber = 3}
  393. "April" {$MonthNumber = 4}
  394. "May" {$MonthNumber = 5}
  395. "June" {$MonthNumber = 6}
  396. "July" {$MonthNumber = 7}
  397. "August" {$MonthNumber = 8}
  398. "September" {$MonthNumber = 9}
  399. "October" {$MonthNumber = 10}
  400. "November" {$MonthNumber = 11}
  401. "December" {$MonthNumber = 12}
  402. }
  403.  
  404. Return $MonthNumber
  405. }
  406.  
  407. ##----------------------------------------------------------------------------------------------------
  408. ## Function: Convert-DayNameToNumbers
  409. ## Purpose: This function converts week days to numbers
  410. ##----------------------------------------------------------------------------------------------------
  411. Function Convert-DayNameToNumbers
  412. {
  413. [CmdletBinding()]
  414. Param(
  415. [String]$Day
  416. )
  417.  
  418. Switch ($Day)
  419. {
  420. "Sunday" {$DayNumber = 1}
  421. "Monday" {$DayNumber = 2}
  422. "TuesDay" {$DayNumber = 3}
  423. "WednesDay" {$DayNumber = 4}
  424. "ThursDay" {$DayNumber = 5}
  425. "FriDay" {$DayNumber = 6}
  426. "Saturday" {$DayNumber = 7}
  427.  
  428. }
  429.  
  430. Return $DayNumber
  431. }
  432.  
  433. ##----------------------------------------------------------------------------------------------------
  434. ## Function: Convert-WeekOrder
  435. ## Purpose: This function converts week order to numbers
  436. ##----------------------------------------------------------------------------------------------------
  437. Function Convert-WeekOrder
  438. {
  439. [CmdletBinding()]
  440. Param(
  441. [String]$WeekOrder
  442. )
  443.  
  444. Switch ($WeekOrder)
  445. {
  446. "Last" {$WeekNumber = 0}
  447. "First" {$WeekNumber = 1}
  448. "Second" {$WeekNumber = 2}
  449. "Third" {$WeekNumber = 3}
  450. "Fourth" {$WeekNumber = 4}
  451.  
  452. }
  453.  
  454. Return $WeekNumber
  455. }
  456.  
  457. ##----------------------------------------------------------------------------------------------------
  458. ## Function: Write-SchedToString
  459. ## Purpose: This function Scheduled token to String
  460. ##----------------------------------------------------------------------------------------------------
  461. Function Write-SchedToString
  462. {
  463. [CmdletBinding()]
  464. Param(
  465. [Parameter(Mandatory=$True,HelpMessage="Please Enter Site Server Site code")]
  466. $SiteCode,
  467. [Parameter(Mandatory=$True,HelpMessage="Please Enter Site Server Name")]
  468. $SiteServer,
  469. [Parameter(Mandatory=$True,HelpMessage="Please Enter Token Information")]
  470. $TokenData
  471. )
  472.  
  473. $Method = "WriteToString"
  474. $Class = "SMS_ScheduleMethods"
  475.  
  476. Try{
  477. $WMIConnection = ([WMIClass]"\\$SiteServer\root\SMS\Site_$($SiteCode):$Class")
  478. $schedule = $WMIConnection.psbase.GetMethodParameters($Method)
  479. $schedule.TokenData = $TokenData
  480. $StringData = $WMIConnection.psbase.InvokeMethod($Method,$schedule,$null)
  481.  
  482. Return $StringData.StringData
  483. }
  484. Catch{
  485. Write-Host "Error: $($_.Exception.Message)"
  486. }
  487. }
  488.  
  489. ##----------------------------------------------------------------------------------------------------
  490. ## Function: New-ScheduleToken
  491. ## Purpose: This function creates Scheduled token
  492. ##----------------------------------------------------------------------------------------------------
  493. Function New-ScheduleToken
  494. {
  495. [CmdletBinding()]
  496. Param(
  497. [Parameter(Mandatory=$True,HelpMessage="Please Enter Day Name",ParameterSetName='RecurWeekly')]
  498. [Parameter(Mandatory=$True,HelpMessage="Please Enter Day Name",ParameterSetName='RecurMonthlyWeekDay')]
  499. [ValidateSet("Sunday","Monday","TuesDay","WednesDay","ThursDay","FriDay","SaturDay")]
  500. [String]$Day,
  501. [Parameter(Mandatory=$True,HelpMessage="Please Enter week number",ParameterSetName='RecurWeekly')]
  502. [ValidateRange(1,4)]
  503. [Int]$NumberOfWeeks,
  504. [Parameter(Mandatory=$True,HelpMessage="Please Enter month name",ParameterSetName='RecurMonthly')]
  505. [Parameter(Mandatory=$True,HelpMessage="Please Enter month name",ParameterSetName='RecurMonthlyWeekDay')]
  506. [ValidateSet("January","Feburary","March","April","May","June","July","August","September","October","November","December")]
  507. [String]$MonthName,
  508. [Parameter(Mandatory=$True,HelpMessage="Please Enter month day in numbers",ParameterSetName='RecurMonthly')]
  509. [ValidateRange(0,31)]
  510. [Int]$MonthDay,
  511. [Parameter(Mandatory=$True,HelpMessage="Please Enter week ",ParameterSetName='RecurMonthlyWeekDay')]
  512. [ValidateSet("First","Second","Third","Fourth","Last")]
  513. [String]$WeekOrder,
  514. [Parameter(Mandatory=$True,HelpMessage="Please Enter month day in numbers",ParameterSetName='CustomDay')]
  515. [ValidateRange(0,31)]
  516. [Int]$CustomDay,
  517. [Switch]$String,
  518. [Parameter(Mandatory=$True,HelpMessage="Please Enter Site Server Site code",ParameterSetName='RecurWeekly')]
  519. [Parameter(Mandatory=$True,HelpMessage="Please Enter Site Server Site code",ParameterSetName='RecurMonthlyWeekDay')]
  520. [Parameter(Mandatory=$True,HelpMessage="Please Enter Site Server Site code",ParameterSetName='CustomDay')]
  521. [Parameter(Mandatory=$True,HelpMessage="Please Enter Site Server Site code",ParameterSetName='RecurMonthly')]
  522. $SiteCode,
  523. [Parameter(Mandatory=$True,HelpMessage="Please Enter Site Server Name",ParameterSetName='RecurWeekly')]
  524. [Parameter(Mandatory=$True,HelpMessage="Please Enter Site Server Name",ParameterSetName='RecurMonthly')]
  525. [Parameter(Mandatory=$True,HelpMessage="Please Enter Site Server Name",ParameterSetName='RecurMonthlyWeekDay')]
  526. [Parameter(Mandatory=$True,HelpMessage="Please Enter Site Server Name",ParameterSetName='CustomDay')]
  527. $SiteServer
  528. )
  529.  
  530. Switch($PsCmdlet.ParameterSetName)
  531. {
  532. "RecurWeekly"
  533. {
  534. $Class = "SMS_ST_RecurWeekly"
  535. $ScheduledToken = ([WMIClass]"\\$SiteServer\root\SMS\Site_$($SiteCode):$Class").CreateInstance()
  536. $ScheduledToken.Day = Convert-DayNameToNumbers -Day $Day
  537. $ScheduledToken.ForNumberOfWeeks = $NumberOfWeeks
  538.  
  539. If($String){
  540. Write-SchedToString -sitecode $siteCode -siteserver $Siteserver -Tokendata $ScheduledToken
  541. }
  542. Else{
  543. Return $ScheduledToken
  544. }
  545. }
  546. "RecurMonthlyWeekDay"
  547. {
  548. $Class = "SMS_ST_RecurMonthlyByWeekDay"
  549. $ScheduledToken = ([WMIClass]"\\$SiteServer\root\SMS\Site_$($SiteCode):$Class").CreateInstance()
  550. $ScheduledToken.Day = Convert-DayNameToNumbers -Day $Day
  551. $ScheduledToken.WeekOrder = Convert-WeekOrder -WeekOrder $WeekOrder
  552. $ScheduledToken.ForNumberOfMonths = Convert-MonthToNumbers -MonthName $MonthName
  553.  
  554. If($String){
  555. Write-SchedToString -sitecode $siteCode -siteserver $Siteserver -Tokendata $ScheduledToken
  556. }
  557. Else{
  558. Return $ScheduledToken
  559. }
  560.  
  561. }
  562. "RecurMonthly"
  563. {
  564. $Class = "SMS_ST_RecurMonthlyByDate"
  565. $ScheduledToken = ([WMIClass]"\\$SiteServer\root\SMS\Site_$($SiteCode):$Class").CreateInstance()
  566. $ScheduledToken.MonthDay = $MonthDay
  567. $ScheduledToken.ForNumberOfMonths = Convert-MonthToNumbers -MonthName $MonthName
  568.  
  569. If($String){
  570. Write-SchedToString -sitecode $siteCode -siteserver $Siteserver -Tokendata $ScheduledToken
  571. }
  572. Else{
  573. Return $ScheduledToken
  574. }
  575.  
  576. }
  577. "CustomDay"
  578. {
  579. $Class = "SMS_ST_RecurInterval"
  580. $ScheduledToken = ([WMIClass]"\\$SiteServer\root\SMS\Site_$($SiteCode):$Class").CreateInstance()
  581. $ScheduledToken.DaySpan = $CustomDay
  582.  
  583. If($String){
  584. Write-SchedToString -sitecode $siteCode -siteserver $Siteserver -Tokendata $ScheduledToken
  585. }
  586. Else{
  587. Return $ScheduledToken
  588. }
  589.  
  590. }
  591. }
  592. }
  593.  
  594. ##----------------------------------------------------------------------------------------------------
  595. ## Function: Add-CMCollection
  596. ## Purpose: This function adds collection
  597. ##----------------------------------------------------------------------------------------------------
  598. Function Add-CMCollection
  599. {
  600. [CmdLetBinding(DefaultParameterSetName = "None")]
  601. Param(
  602. [Parameter(Mandatory=$False,HelpMessage="Please Enter Day Name",ParameterSetName='RecurWeekly')]
  603. [Parameter(Mandatory=$False,HelpMessage="Please Enter Day Name",ParameterSetName='RecurMonthlyWeekDay')]
  604. [ValidateSet("Sunday","Monday","TuesDay","WednesDay","ThursDay","FriDay","SaturDay")]
  605. [String]$Day,
  606. [Parameter(Mandatory=$False,HelpMessage="Please Enter week number",ParameterSetName='RecurWeekly')]
  607. [ValidateRange(1,4)]
  608. [Int]$NumberOfWeeks,
  609. [Parameter(Mandatory=$False,HelpMessage="Please Enter month name",ParameterSetName='RecurMonthly')]
  610. [Parameter(Mandatory=$False,HelpMessage="Please Enter month name",ParameterSetName='RecurMonthlyWeekDay')]
  611. [ValidateSet("January","Feburary","March","April","May","June","July","August","September","October","November","December")]
  612. [String]$MonthName,
  613. [Parameter(Mandatory=$False,HelpMessage="Please Enter month day in numbers",ParameterSetName='RecurMonthly')]
  614. [ValidateRange(0,31)]
  615. [Int]$MonthDay,
  616. [Parameter(Mandatory=$False,HelpMessage="Please Enter week ",ParameterSetName='RecurMonthlyWeekDay')]
  617. [ValidateSet("First","Second","Third","Fourth","Last")]
  618. [String]$WeekOrder,
  619. [Parameter(Mandatory=$False,HelpMessage="Please Enter month day in numbers",ParameterSetName='CustomDay')]
  620. [ValidateRange(0,31)]
  621. [Int]$CustomDay,
  622. [Switch]$String,
  623. [Parameter(Mandatory=$True,HelpMessage="Please Enter Site Server Site code")]
  624. $SiteCode,
  625. [Parameter(Mandatory=$True,HelpMessage="Please Enter Site Server Name")]
  626. $SiteServer,
  627. [Parameter(Mandatory=$true,HelpMessage="Please Enter Collection Name")]
  628. $Name,
  629. [Parameter(Mandatory=$true,HelpMessage="Please Enter Limiting Collection ID")]
  630. $LimitToCollectionID,
  631. [Parameter(Mandatory=$true,HelpMessage="Please Enter Collection Type, eg. Device or User")]
  632. [ValidateSet("Device","User")]
  633. $Type,
  634. $Folder,
  635. $Comment = "",
  636. [Switch]$Incremental
  637. )
  638.  
  639. $Class = "SMS_Collection"
  640.  
  641. If($Incremental){
  642. [int]$RefreshType = $RefreshType + 4
  643. }
  644.  
  645. Switch ($Type)
  646. {
  647. "Device" {$ColType = 2}
  648. "User" {$ColType = 1}
  649. }
  650.  
  651. $Arguments = @{Name="$Name";Comment=$Comment;CollectionType="$ColType";LimitToCollectionID=$LimitToCollectionID}
  652.  
  653.  
  654. Switch($PsCmdlet.ParameterSetName)
  655. {
  656. "RecurWeekly"
  657. {
  658.  
  659. [Array]$RefreshScedule = New-ScheduleToken -Day $Day -NumberOfWeeks $NumberOfWeeks -SiteCode $SiteCode -SiteServer $SiteServer
  660. $Arguments += @{RefreshSchedule = $RefreshScedule;RefreshType=$RefreshType+2}
  661. }
  662. "RecurMonthlyWeekDay"
  663. {
  664. [Array]$RefreshScedule = New-ScheduleToken -Day $Day -MonthName $MonthName -WeekOrder $WeekOrder -SiteCode $SiteCode -SiteServer $SiteServer
  665. $Arguments += @{RefreshSchedule = $RefreshScedule;RefreshType=$RefreshType+2}
  666. }
  667. "RecurMonthly"
  668. {
  669. [Array]$RefreshScedule = New-ScheduleToken -MonthName $MonthName -MonthDay $MonthDay -SiteCode $SiteCode -SiteServer $SiteServer
  670. $Arguments += @{RefreshSchedule = $RefreshScedule;RefreshType=$RefreshType+2}
  671. }
  672. "CustomDay"
  673. {
  674. [Array]$RefreshScedule = New-ScheduleToken -CustomDay $CustomDay -SiteCode $SiteCode -SiteServer $SiteServer
  675. $Arguments += @{RefreshSchedule = $RefreshScedule;RefreshType=$RefreshType+2}
  676. }
  677. "None"
  678. {
  679. $Arguments += @{RefreshType=1}
  680. }
  681. }
  682.  
  683.  
  684. If((Get-CMCollection -SiteCode $SiteCode -SiteServer $SiteServer -Filter "Name='$Name'") -ne $Null){
  685.  
  686. Write-Host "Collection with this name already exists"
  687. }
  688. Else{
  689. Try{
  690. Set-WmiInstance -Namespace "root\sms\site_$SiteCode" -Class $Class -Arguments $Arguments -ErrorAction STOP -ComputerName $SiteServer
  691.  
  692. If($Folder.length -gt 0){
  693.  
  694. $Collection = Get-CMCollection -SiteCode $SiteCode -SiteServer $SiteServer -Filter "Name='$Name'"
  695. Start-Sleep 5
  696.  
  697. Switch ($ColType)
  698. {
  699. 1 {$objectType = 5001}
  700. 2 {$objectType = 5000}
  701. }
  702.  
  703. Move-CMItem -SiteCode $SiteCode -SiteServer $SiteServer -objectID $Collection.CollectionID -objectTypeID $objectType -TargetContainerName $Folder
  704. }
  705. }
  706. Catch{
  707. Write-Host "Error: $($_.Exception.Message)"
  708. }
  709. }
  710.  
  711. }
  712.  
  713. ##----------------------------------------------------------------------------------------------------
  714. ## Function: Add-WSUS
  715. ## Purpose: This function installs WSUS
  716. ##----------------------------------------------------------------------------------------------------
  717. Function Add-WSUS
  718. {
  719. [CmdLetBinding()]
  720. Param(
  721. [Parameter(Mandatory=$True)]
  722. [String]$Arguments,
  723. [Parameter(Mandatory=$True)]
  724. [String]$File
  725. )
  726. Try{
  727. $Install = Start-Process $File -ArgumentList $Arguments -Wait -PassThru -ErrorAction STOP
  728.  
  729. If($Install.ExitCode -eq 0){
  730. Write-Host "Installation was successful"
  731. }
  732. Else{
  733. Write-Host "Installation Failed $($Install.ExitCode)"
  734. }
  735. }
  736. Catch{
  737. Write-Host "Error: $($_.Exception.Message)"
  738. }
  739. }
  740.  
  741. ##----------------------------------------------------------------------------------------------------
  742. ## Function: Add-WDS
  743. ## Purpose: This function installs WDS and configures PXE response policy
  744. ##----------------------------------------------------------------------------------------------------
  745. Function Add-WDS
  746. {
  747. [CmdLetBinding()]
  748. Param(
  749. $Folder = "$env:Systemdrive\RemoteInstall"
  750. )
  751.  
  752. $Role = "WDS"
  753.  
  754. Try{
  755. Write-Host " - Loading Server Manager PowerShell Module"
  756. Import-Module servermanager -ErrorAction STOP
  757. }
  758. Catch{
  759. Write-Host "Failed to load Server Manager PowerShell Module"
  760. }
  761.  
  762. Try{
  763. Write-Host " - Adding WDS Server Role"
  764. Add-WindowsFeature $Role -ErrorAction STOP
  765. }
  766. Catch{
  767. Write-Host "Error: $($_.Exception.Message)"
  768. }
  769.  
  770. Write-Host " - Setting up $Folder"
  771. Try{
  772. $SetUpServer = Start-Process WDSUtil -ArgumentList "/Initialize-Server /RemInst:""$($Folder)""" -Wait -PassThru -ErrorAction STOP
  773. If($SetUpServer.ExitCode -eq 0){
  774. Write-Host " - $Folder configured correctly"
  775. }
  776. Else{
  777. Write-Host " - Something went wrong: $($SetUpServer.ExitCode)"
  778. }
  779. }
  780. Catch{
  781. Write-Host "Error: $($_.Exception.Message)"
  782. }
  783.  
  784. Write-Host " - Configuring PXE Response Policy"
  785. Try{
  786. $EnableAllClients = Start-Process WDSUtil -ArgumentList "/set-server /AnswerClients:ALL" -Wait -PassThru -ErrorAction STOP
  787.  
  788. If($EnableAllClients.ExitCode -eq 0){
  789. Write-Host " - PXE Response Policy configured successfully"
  790. }
  791. Else{
  792. Write-Host "-Something went wrong: $($EnableAllClients.ExitCode)"
  793. }
  794. }
  795. Catch{
  796. Write-Host "Error: $($_.Exception.Message)"
  797. }
  798. }
  799.  
  800. ##----------------------------------------------------------------------------------------------------
  801. ## Function: Get-CMBoundary
  802. ## Purpose: This function queries all CM boundaries
  803. ##----------------------------------------------------------------------------------------------------
  804. Function Get-CMBoundary
  805. {
  806. [CmdLetBinding()]
  807. Param(
  808. [Parameter(Mandatory=$True,HelpMessage="Please Enter Primary Server Site code")]
  809. $SiteCode,
  810. [Parameter(Mandatory=$True,HelpMessage="Please Enter Primary Server Name")]
  811. [String]$SiteServer,
  812. [Parameter(Mandatory=$False)]
  813. [String]$Filter
  814. )
  815.  
  816. $Class = "SMS_Boundary"
  817.  
  818. Try{
  819. Get-WmiObject -Namespace "root\SMS\Site_$SiteCode" -Class $Class -Filter $Filter -ErrorAction STOP -ComputerName $SiteServer
  820. }
  821. Catch{
  822. Write-Host "Error: $($_.Exception.Message)"
  823. }
  824. }
  825.  
  826. ##----------------------------------------------------------------------------------------------------
  827. ## Function: Add-CMBoundary
  828. ## Purpose: This function adds CM Boundary
  829. ##----------------------------------------------------------------------------------------------------
  830. Function Add-CMBoundary
  831. {
  832. [CmdLetBinding()]
  833. Param(
  834. [Parameter(Mandatory=$True,HelpMessage="Please Enter Boundary Name")]
  835. [String]$Name,
  836. [Parameter(Mandatory=$True,HelpMessage="Please Enter Boundary value")]
  837. [String]$Value,
  838. [Parameter(Mandatory=$True,HelpMessage="Please Boundary Type eg. IPSubNet,AD,IPV6 or IPRange")]
  839. [ValidateSet("IPSubNet","AD","IPV6","IPRange")]
  840. $Type,
  841. [Parameter(Mandatory=$True,HelpMessage="Please Enter Primary Server Site code")]
  842. $SiteCode,
  843. [Parameter(Mandatory=$True,HelpMessage="Please Enter Primary Server Name")]
  844. [String]$SiteServer
  845. )
  846.  
  847. Switch($Type)
  848. {
  849. "IPSubNet" {$TypeNumber = 0}
  850. "AD" {$TypeNumber = 1}
  851. "IPV6" {$TypeNumber = 2}
  852. "IPRange" {$TypeNumber = 3}
  853. }
  854.  
  855. $Class = "SMS_Boundary"
  856.  
  857. $Arguments = @{BoundaryType=$TypeNumber;DisplayName=$Name;Value=$Value}
  858.  
  859. If((Get-CMBoundary -SiteCode $SiteCode -SiteServer $SiteServer -Filter "Value='$Value'") -ne $Null){
  860.  
  861. Write-Host "The specified boundary already exists!"
  862. }
  863. Else{
  864. Try{
  865. Set-WmiInstance -Namespace "root\sms\site_$SiteCode" -Class $Class -Arguments $Arguments -ComputerName $SiteServer -ErrorAction STOP
  866. }
  867. Catch{
  868. Write-Host "Error: $($_.Exception.Message)"
  869. }
  870. }
  871. }
  872.  
  873. ##----------------------------------------------------------------------------------------------------
  874. ## Function: Get-CMBoundaryGroup
  875. ## Purpose: This function queries CM Boundary groups
  876. ##----------------------------------------------------------------------------------------------------
  877. Function Get-CMBoundaryGroup
  878. {
  879. [CmdLetBinding()]
  880. Param(
  881. [Parameter(Mandatory=$True,HelpMessage="Please Enter Primary Server Site code")]
  882. $SiteCode,
  883. [Parameter(Mandatory=$True,HelpMessage="Please Enter Primary Server Name")]
  884. [String]$SiteServer,
  885. [Parameter(Mandatory=$False)]
  886. [String]$Filter
  887. )
  888.  
  889. $Class = "SMS_BoundaryGroup"
  890.  
  891. Try{
  892. Get-WmiObject -Namespace "root\SMS\Site_$SiteCode" -Class $Class -Filter $Filter -ErrorAction STOP -ComputerName $SiteServer
  893. }
  894. Catch{
  895. Write-Host "Error: $($_.Exception.Message)"
  896. }
  897. }
  898.  
  899. ##----------------------------------------------------------------------------------------------------
  900. ## Function: Add-CMBoundaryGroup
  901. ## Purpose: This function adds CM Boundary group
  902. ##----------------------------------------------------------------------------------------------------
  903. Function Add-CMBoundaryGroup
  904. {
  905. [CmdLetBinding()]
  906. Param(
  907. [Parameter(Mandatory=$True,HelpMessage="Please Enter Boundary Group Name")]
  908. [String]$Name,
  909. [Parameter(Mandatory=$True,HelpMessage="Please Enter Primary Server Site code")]
  910. $SiteCode,
  911. [Parameter(Mandatory=$True,HelpMessage="Please Enter Primary Server Name")]
  912. [String]$SiteServer
  913. )
  914.  
  915.  
  916. $Class = "SMS_BoundaryGroup"
  917.  
  918. $Arguments = @{Name=$Name}
  919.  
  920. If((Get-CMBoundaryGroup -SiteCode $SiteCode -SiteServer $SiteServer -Filter "Name='$Name'") -ne $Null){
  921.  
  922. Write-Host "The Boundary Group Name is already in use. Enter a different name!"
  923. }
  924. Else{
  925. Try{
  926. Set-WmiInstance -Namespace "root\sms\site_$SiteCode" -Class $Class -Arguments $Arguments -ComputerName $SiteServer -ErrorAction STOP
  927. }
  928. Catch{
  929. Write-Host "Error: $($_.Exception.Message)"
  930. }
  931. }
  932. }
  933.  
  934. ##----------------------------------------------------------------------------------------------------
  935. ## Function: Add-CMBoundaryToGroup
  936. ## Purpose: This function adds CM Boundary to Boundary group
  937. ##----------------------------------------------------------------------------------------------------
  938. Function Add-CMBoundaryToGroup
  939. {
  940. [CmdLetBinding()]
  941. Param(
  942. [Parameter(Mandatory=$True,HelpMessage="Please Enter Boundary Group Name")]
  943. [String]$BoundaryGroup,
  944. [Parameter(Mandatory=$True,HelpMessage="Please Enter Boundary Name")]
  945. [String]$Boundary,
  946. [Parameter(Mandatory=$True,HelpMessage="Please Enter Primary Server Site code")]
  947. $SiteCode,
  948. [Parameter(Mandatory=$True,HelpMessage="Please Enter Primary Server Name")]
  949. [String]$SiteServer
  950. )
  951.  
  952. $Class = "SMS_BoundaryGroup"
  953.  
  954. If((Get-CMBoundaryGroup -SiteCode $SiteCode -SiteServer $SiteServer -Filter "Name='$BoundaryGroup'") -eq $Null){
  955.  
  956. Write-Host "There is no such Boundary Group like: $BoundaryGroup"
  957. }
  958. ElseIF(($BoundaryQuery = Get-CMBoundary -SiteCode $SiteCode -SiteServer $SiteServer -Filter "DisplayName='$Boundary'") -eq $Null){
  959.  
  960. Write-Host "There is no such Boundary like: $Boundary"
  961. }
  962. Else{
  963. Try{
  964. $BoundaryGroupQuery = Get-WmiObject -Namespace "root\sms\site_$SiteCode" -Class $Class -ComputerName $SiteServer -ErrorAction STOP -Filter "Name='$BoundaryGroup'"
  965. $ReturnCode = $BoundaryGroupQuery.AddBoundary($BoundaryQuery.BoundaryID)
  966. If($ReturnCode.ReturnValue -eq 0){
  967. Write-Host " - Successfully added $Boundary boundary to $BoundaryGroup group"
  968. }
  969.  
  970. }
  971. Catch{
  972. Write-Host "Error: $($_.Exception.Message)"
  973. }
  974. }
  975.  
  976. }
  977.  
  978. ##----------------------------------------------------------------------------------------------------
  979. ## Function: Get-CMSiteSystem
  980. ## Purpose: This function queries all CM site systems
  981. ##----------------------------------------------------------------------------------------------------
  982. Function Get-CMSiteSystem
  983. {
  984. [CmdLetBinding()]
  985. Param(
  986. [Parameter(Mandatory=$True,HelpMessage="Please Enter Primary Server Site code")]
  987. $SiteCode,
  988. [Parameter(Mandatory=$True,HelpMessage="Please Enter Primary Server Name")]
  989. [String]$SiteServer,
  990. [Parameter(Mandatory=$False)]
  991. [String]$Filter
  992. )
  993.  
  994. $Class = "SMS_SystemResourceList"
  995.  
  996. Try{
  997. Get-WmiObject -Namespace "root\SMS\Site_$SiteCode" -Class $Class -Filter $Filter -ErrorAction STOP -ComputerName $SiteServer | Select-Object ServerName,ServerRemoteName,SiteCode,InternetEnabled,SslState,InternetShared,NALPath,ResourceType,RoleName
  998. }
  999. Catch{
  1000. Write-Host "Error: $($_.Exception.Message)"
  1001. }
  1002. }
  1003.  
  1004. ##----------------------------------------------------------------------------------------------------
  1005. ## Function: Add-CMSiteSystemToBoundaryGroup
  1006. ## Purpose: This function adds CM site system to Boundary group
  1007. ##----------------------------------------------------------------------------------------------------
  1008. Function Add-CMSiteSystemToBoundaryGroup
  1009. {
  1010. [CmdLetBinding()]
  1011. Param(
  1012. [Parameter(Mandatory=$True,HelpMessage="Please Enter Boundary Group Name")]
  1013. [String]$BoundaryGroup,
  1014. [Parameter(Mandatory=$True,HelpMessage="Please Enter Site System FQDN Name")]
  1015. [String]$SiteSystem,
  1016. [Parameter(Mandatory=$False,HelpMessage="Please Enter Site System connection type")]
  1017. [ValidateSet("Fast","Slow")]
  1018. [String]$ConnectionType = "Fast",
  1019. [Parameter(Mandatory=$True,HelpMessage="Please Enter Primary Server Site code")]
  1020. $SiteCode,
  1021. [Parameter(Mandatory=$True,HelpMessage="Please Enter Primary Server Name")]
  1022. [String]$SiteServer
  1023. )
  1024.  
  1025.  
  1026. Switch($ConnectionType)
  1027. {
  1028. "Fast" {$ConnectionNumber = 0}
  1029. "Slow" {$ConnectionNumber = 1}
  1030. }
  1031.  
  1032. $Class = "SMS_BoundaryGroup"
  1033.  
  1034. If((Get-CMBoundaryGroup -SiteCode $SiteCode -SiteServer $SiteServer -Filter "Name='$BoundaryGroup'") -eq $Null){
  1035.  
  1036. Write-Host "There is no such Boundary Group like: $BoundaryGroup"
  1037. }
  1038. ElseIF(($SiteSystemQuery = Get-CMSiteSystem -sitecode $SiteCode -siteserver $SiteServer -Filter "RoleName='SMS Distribution Point' and ServerName='$SiteSystem'") -eq $Null){
  1039.  
  1040. Write-Host "There is no such Site System like: $SiteSystem"
  1041. }
  1042. Else{
  1043. Try{
  1044. $BoundaryGroupQuery = Get-WmiObject -Namespace "root\sms\site_$SiteCode" -Class $Class -ComputerName $SiteServer -ErrorAction STOP -Filter "Name='$BoundaryGroup'"
  1045.  
  1046. $ReturnCode = $BoundaryGroupQuery.AddSiteSystem($SiteSystemQuery.NALPath,$ConnectionNumber)
  1047. If($ReturnCode.ReturnValue -eq 0){
  1048. Write-Host " - Successfully added $($SiteSystemQuery.NALPath) to $BoundaryGroup group"
  1049. }
  1050.  
  1051. }
  1052. Catch{
  1053. Write-Host "Error: $($_.Exception.Message)"
  1054. }
  1055. }
  1056.  
  1057. }
  1058.  
  1059. ##----------------------------------------------------------------------------------------------------
  1060. ## Function: Get-CMCircularDependency
  1061. ## Purpose: This function validates Include & Exclude collection Circular Dependency
  1062. ##----------------------------------------------------------------------------------------------------
  1063. Function Get-CMCircularDependency
  1064. {
  1065. [CmdletBinding()]
  1066. Param(
  1067. [Parameter(Mandatory=$True,HelpMessage="Please Enter Primary Server Site Server")]
  1068. $SiteServer,
  1069. [Parameter(Mandatory=$True,HelpMessage="Please Enter Primary Server Site code")]
  1070. $SiteCode,
  1071. [Parameter(Mandatory=$True,HelpMessage="Please Enter the main collection name ")]
  1072. $CollectionName,
  1073. [Parameter(Mandatory=$True,HelpMessage="Please Enter exclude collection name that you want to verify")]
  1074. $ExcIncCollectionName
  1075. )
  1076.  
  1077. $Method = "VerifyNoCircularDependencies"
  1078. $Class = "SMS_Collection"
  1079.  
  1080. Try{
  1081. $ParentCollection = Get-WmiObject -Namespace "root\sms\Site_$SiteCode" -Class $Class -Filter "Name='$CollectionName'" -ComputerName $SiteServer -ErrorAction STOP
  1082. }
  1083. Catch{
  1084. Write-Host "Error: $($_.Exception.Message)"
  1085. }
  1086.  
  1087. Try{
  1088. $SubCollection = Get-WmiObject -Namespace "root\sms\Site_$SiteCode" -Class $Class -Filter "Name='$ExcIncCollectionName'" -ComputerName $SiteServer -ErrorAction STOP
  1089. }
  1090. Catch{
  1091. Write-Host "Error: $($_.Exception.Message)"
  1092. }
  1093.  
  1094. Try{
  1095. $VerifyDependency = Invoke-WmiMethod -Namespace "root\sms\Site_$SiteCode" -Class $Class -Name $Method -ArgumentList @($ParentCollection.__PATH,$SubCollection.__PATH,$null) -ErrorAction STOP
  1096. Return $VerifyDependency.Result
  1097. }
  1098. Catch{
  1099. Write-Host "Error: $($_.Exception.Message)"
  1100. }
  1101. }
  1102.  
  1103. ##----------------------------------------------------------------------------------------------------
  1104. ## Function: Set-CMCollectionExcludeRule
  1105. ## Purpose: This function adds Exclude collection rule
  1106. ##----------------------------------------------------------------------------------------------------
  1107. Function Set-CMCollectionExcludeRule
  1108. {
  1109. [CmdletBinding()]
  1110. Param(
  1111. [Parameter(Mandatory=$True,HelpMessage="Please Enter Primary Server Site Server")]
  1112. $SiteServer,
  1113. [Parameter(Mandatory=$True,HelpMessage="Please Enter Primary Server Site code")]
  1114. $SiteCode,
  1115. [Parameter(Mandatory=$True,HelpMessage="Please Enter collection name where do you want to set new rule")]
  1116. $CollectionName,
  1117. [Parameter(Mandatory=$True,HelpMessage="Please Enter collection name that you want to exclude")]
  1118. $ExcludeCollectionName
  1119. )
  1120.  
  1121. $Class = "SMS_CollectionRuleExcludeCollection"
  1122. [Array]$ColRules
  1123.  
  1124. If(($RuleCollection = Get-CMCollection -SiteCode $SiteCode -SiteServer $SiteServer -Filter "Name='$CollectionName'") -eq $Null){
  1125. Write-Host "There is no such collection like: $CollectionName"
  1126. }
  1127. ElseIf(($ExcludeCollection = Get-CMCollection -SiteCode $SiteCode -SiteServer $SiteServer -Filter "Name='$ExcludeCollectionName'") -eq $Null){
  1128. Write-Host "There is no such collection like: $ExcludeCollectionName"
  1129. }
  1130. Else{
  1131.  
  1132. If((Get-CMCircularDependency -SiteCode $SiteCode -SiteServer $SiteServer -CollectionName $CollectionName -ExcIncCollectionName $ExcludeCollectionName)){
  1133.  
  1134. $ColRules += ([WMI]$RuleCollection.__PATH).CollectionRules
  1135.  
  1136. Try{
  1137. $NewRule = ([WMIClass]"\\$SiteServer\root\SMS\Site_$($SiteCode):$Class").CreateInstance()
  1138. $NewRule.ExcludeCollectionID = $ExcludeCollection.CollectionID
  1139. $NewRule.RuleName = $ExcludeCollection.Name
  1140.  
  1141. $ColRules += [System.Management.ManagementBaseObject]$NewRule
  1142.  
  1143. $RuleCollection.CollectionRules = $ColRules
  1144. $RuleCollection.Put()
  1145. }
  1146. Catch{
  1147. Write-Host "Error: $($_.Exception.Message)"
  1148. }
  1149. }
  1150. Else{
  1151. Write-Host "The selected collection '$ExcludeCollectionName' will create a circular dependency"
  1152. }
  1153.  
  1154. }
  1155.  
  1156. }
  1157.  
  1158. ##----------------------------------------------------------------------------------------------------
  1159. ## Function: Set-CMCollectionIncludeRule
  1160. ## Purpose: This function adds Include collection rule
  1161. ##----------------------------------------------------------------------------------------------------
  1162. Function Set-CMCollectionIncludeRule
  1163. {
  1164. [CmdletBinding()]
  1165. Param(
  1166. [Parameter(Mandatory=$True,HelpMessage="Please Enter Primary Server Site Server")]
  1167. $SiteServer,
  1168. [Parameter(Mandatory=$True,HelpMessage="Please Enter Primary Server Site code")]
  1169. $SiteCode,
  1170. [Parameter(Mandatory=$True,HelpMessage="Please Enter collection name where do you want to set new rule")]
  1171. $CollectionName,
  1172. [Parameter(Mandatory=$True,HelpMessage="Please Enter collection name that you want to include")]
  1173. $IncludeCollectionName
  1174. )
  1175.  
  1176. $Class = "SMS_CollectionRuleIncludeCollection"
  1177. [Array]$ColRules
  1178.  
  1179. If(($RuleCollection = Get-CMCollection -SiteCode $SiteCode -SiteServer $SiteServer -Filter "Name='$CollectionName'") -eq $Null){
  1180. Write-Host "There is no such collection like: $CollectionName"
  1181. }
  1182. ElseIf(($IncludeCollection = Get-CMCollection -SiteCode $SiteCode -SiteServer $SiteServer -Filter "Name='$IncludeCollectionName'") -eq $Null){
  1183. Write-Host "There is no such collection like: $IncludeCollectionName"
  1184. }
  1185. Else{
  1186.  
  1187. If((Get-CMCircularDependency -SiteCode $SiteCode -SiteServer $SiteServer -CollectionName $CollectionName -ExcIncCollectionName $IncludeCollectionName)){
  1188.  
  1189. $ColRules += ([WMI]$RuleCollection.__PATH).CollectionRules
  1190.  
  1191. Try{
  1192. $NewRule = ([WMIClass]"\\$SiteServer\root\SMS\Site_$($SiteCode):$Class").CreateInstance()
  1193. $NewRule.IncludeCollectionID = $IncludeCollection.CollectionID
  1194. $NewRule.RuleName = $IncludeCollection.Name
  1195.  
  1196. $ColRules += [System.Management.ManagementBaseObject]$NewRule
  1197.  
  1198. $RuleCollection.CollectionRules = $ColRules
  1199. $RuleCollection.Put()
  1200.  
  1201. }
  1202. Catch{
  1203. Write-Host "Error: $($_.Exception.Message)"
  1204. }
  1205. }
  1206. Else{
  1207. Write-Host "The selected collection '$IncludeCollectionName' will create a circular dependency"
  1208. }
  1209.  
  1210. }
  1211.  
  1212. }
  1213.  
  1214. ##----------------------------------------------------------------------------------------------------
  1215. ## Function: Set-CMCollectionIncludeRule
  1216. ## Purpose: This function validates Query Expression
  1217. ##----------------------------------------------------------------------------------------------------
  1218. Function Get-CMQueryValidation
  1219. {
  1220. [CmdletBinding()]
  1221. Param(
  1222. [Parameter(Mandatory=$True,HelpMessage="Please Enter Primary Server Site Server")]
  1223. $SiteServer,
  1224. [Parameter(Mandatory=$True,HelpMessage="Please Enter Primary Server Site code")]
  1225. $SiteCode,
  1226. [Parameter(Mandatory=$True,HelpMessage="Please Enter the query string for validation ")]
  1227. $Query
  1228. )
  1229.  
  1230. $Class = "SMS_CollectionRuleQuery"
  1231. $Method = "ValidateQuery"
  1232.  
  1233. Try{
  1234. $Validate = Invoke-WmiMethod -Namespace "root\sms\site_$SiteCode" -Class $Class -Name $Method -ArgumentList $Query -ComputerName $SiteServer -ErrorAction STOP
  1235. Return $Validate.ReturnValue
  1236.  
  1237. }
  1238. Catch{
  1239. Write-Host "Error: $($_.Exception.Message)"
  1240. }
  1241.  
  1242. }
  1243.  
  1244. ##----------------------------------------------------------------------------------------------------
  1245. ## Function: Get-ResourceID
  1246. ## Purpose: This function queries Resource ID
  1247. ##----------------------------------------------------------------------------------------------------
  1248. Function Get-ResourceID
  1249. {
  1250. [CmdletBinding()]
  1251. Param(
  1252. [Parameter(Mandatory=$True,HelpMessage="Please Enter Primary Server Site Server")]
  1253. $SiteServer,
  1254. [Parameter(Mandatory=$True,HelpMessage="Please Enter Primary Server Site code")]
  1255. $SiteCode,
  1256. [Parameter(Mandatory=$True,HelpMessage="Please Enter the computer name that you want to add")]
  1257. $ResourceName
  1258. )
  1259.  
  1260. $Class = "SMS_R_System"
  1261.  
  1262. Try{
  1263. Get-WmiObject -Namespace "Root\sms\Site_$SiteCode" -Class $Class -Filter "Name='$ResourceName'" -ErrorAction STOP -computername $SiteServer
  1264. }
  1265. Catch{
  1266. Write-Host "Error: $($_.Exception.Message)"
  1267. }
  1268. }
  1269.  
  1270. ##----------------------------------------------------------------------------------------------------
  1271. ## Function: Set-CMUserCollectionQueryRule
  1272. ## Purpose: This function adds standard query rule to users collection
  1273. ##----------------------------------------------------------------------------------------------------
  1274. Function Set-CMCollectionQueryRule
  1275. {
  1276. [CmdletBinding()]
  1277. Param(
  1278. [Parameter(Mandatory=$True,HelpMessage="Please Enter Primary Server Site Server")]
  1279. $SiteServer,
  1280. [Parameter(Mandatory=$True,HelpMessage="Please Enter Primary Server Site code")]
  1281. $SiteCode,
  1282. [Parameter(Mandatory=$True,HelpMessage="Please Enter the query for collection")]
  1283. $Query,
  1284. [Parameter(Mandatory=$True,HelpMessage="Please Enter the query name")]
  1285. $QueryName,
  1286. [Parameter(Mandatory=$True,HelpMessage="Please Enter the query type eg. User or Device")]
  1287. [ValidateSet("User","Device")]
  1288. $QueryType,
  1289. [Parameter(Mandatory=$True,HelpMessage="Please Enter the collection name where do you want to set new rule")]
  1290. $CollectionName
  1291. )
  1292.  
  1293. $Class = "SMS_CollectionRuleQuery"
  1294. [Array]$ColRules
  1295.  
  1296. Switch($QueryType)
  1297. {
  1298. "User" {$QueryTypeNumber = 1}
  1299. "Device" {$QueryTypeNumber = 2}
  1300. }
  1301.  
  1302. If(($RuleCollection = Get-CMCollection -SiteCode $SiteCode -SiteServer $SiteServer -Filter "Name='$CollectionName' and CollectionType='$QueryTypeNumber'") -eq $Null){
  1303. Write-Host "There is no such $QueryType collection like: $CollectionName"
  1304. }
  1305. Else{
  1306.  
  1307. If((Get-CMQueryValidation -SiteCode $SiteCode -SiteServer $SiteServer -Query $Query)){
  1308.  
  1309. $ColRules += ([WMI]$RuleCollection.__PATH).CollectionRules
  1310.  
  1311. Try{
  1312. $NewRule = ([WMIClass]"\\$SiteServer\root\SMS\Site_$($SiteCode):$Class").CreateInstance()
  1313. $NewRule.QueryExpression = $Query
  1314. $NewRule.RuleName = $QueryName
  1315.  
  1316. $ColRules += [System.Management.ManagementBaseObject]$NewRule
  1317.  
  1318. $RuleCollection.CollectionRules = $ColRules
  1319. $RuleCollection.Put()
  1320. }
  1321. Catch{
  1322. Write-Host "Error: $($_.Exception.Message)"
  1323. }
  1324. }
  1325. Else{
  1326. Write-Host "Please check your query rule syntax"
  1327. }
  1328.  
  1329. }
  1330.  
  1331.  
  1332. }
  1333.  
  1334. ##----------------------------------------------------------------------------------------------------
  1335. ## Function: Set-CMCollectionDirectRule
  1336. ## Purpose: This function adds direct membership for collection
  1337. ##----------------------------------------------------------------------------------------------------
  1338. Function Set-CMCollectionDirectRule
  1339. {
  1340. [CmdletBinding()]
  1341. Param(
  1342. [Parameter(Mandatory=$True,HelpMessage="Please Enter Primary Server Site Server")]
  1343. $SiteServer,
  1344. [Parameter(Mandatory=$True,HelpMessage="Please Enter Primary Server Site code")]
  1345. $SiteCode,
  1346. [Parameter(Mandatory=$True,HelpMessage="Please Enter the computer name that you want to add")]
  1347. $ResourceName,
  1348. [Parameter(Mandatory=$True,HelpMessage="Please Enter collection name where do you want to set new rule")]
  1349. $CollectionName
  1350. )
  1351.  
  1352. $Class = "SMS_CollectionRuleDirect"
  1353. [Array]$ColRules
  1354.  
  1355. If(($RuleCollection = Get-CMCollection -SiteCode $SiteCode -SiteServer $SiteServer -Filter "Name='$CollectionName'") -eq $Null){
  1356. Write-Host "There is no such collection like: $CollectionName"
  1357. }
  1358. Else{
  1359.  
  1360. If(($ResourceQuery = Get-ResourceID -SiteServer $SiteServer -SiteCode $SiteCode -ResourceName $ResourceName) -ne $Null){
  1361.  
  1362. $ColRules += ([WMI]$RuleCollection.__PATH).CollectionRules
  1363.  
  1364. Try{
  1365. $NewRule = ([WMIClass]"\\$SiteServer\root\SMS\Site_$($SiteCode):$Class").CreateInstance()
  1366. $NewRule.ResourceClassName = "SMS_R_SYSTEM"
  1367. $NewRule.ResourceID = $ResourceQuery.ResourceID
  1368. $NewRule.Rulename = $ResourceName
  1369.  
  1370. $ColRules += [System.Management.ManagementBaseObject]$NewRule
  1371.  
  1372. $RuleCollection.CollectionRules = $ColRules
  1373. $RuleCollection.Put()
  1374. }
  1375. Catch{
  1376. Write-Host "Error: $($_.Exception.Message)"
  1377. }
  1378. }
  1379. Else{
  1380. Write-Host "There is no such computer like: '$ResourceName'"
  1381. }
  1382.  
  1383. }
  1384.  
  1385. }
  1386.  
  1387. ##----------------------------------------------------------------------------------------------------
  1388. ## Function: Create-CMAccount
  1389. ## Purpose: This function creates new ConfigMgr account
  1390. ##----------------------------------------------------------------------------------------------------
  1391. Function Create-CMAccount
  1392. {
  1393. [CmdletBinding()]
  1394. Param(
  1395. [Parameter(Mandatory=$True,HelpMessage="Please Enter Primary Server Site Server")]
  1396. $SiteServer,
  1397. [Parameter(Mandatory=$True,HelpMessage="Please Enter Primary Server Site code")]
  1398. $SiteCode,
  1399. [Parameter(Mandatory=$True,HelpMessage="Please Enter the CM account name")]
  1400. $AccountName,
  1401. [Parameter(Mandatory=$True,HelpMessage="Please Enter the CM account MAC Address")]
  1402. [ValidatePattern('^([0-9a-fA-F]{2}[:-]{0,1}){5}[0-9a-fA-F]{2}$')]
  1403. $MACAddress,
  1404. [Parameter(Mandatory=$True,HelpMessage="Please Enter the collecton name")]
  1405. $CollectionName
  1406. )
  1407.  
  1408. $Class = "SMS_Site"
  1409. $Method = "ImportMachineEntry"
  1410.  
  1411. Try{
  1412. $WMIConnection = ([WMIClass]"\\$SiteServer\root\SMS\Site_$($SiteCode):$Class")
  1413. $NewEntry = $WMIConnection.psbase.GetMethodParameters($Method)
  1414. $NewEntry.MACAddress = $MACAddress
  1415. $NewEntry.NetbiosName = $AccountName
  1416. $NewEntry.OverwriteExistingRecord = $True
  1417.  
  1418. $WMIConnection.psbase.InvokeMethod($Method,$NewEntry,$null)
  1419.  
  1420. }
  1421. Catch{
  1422. Write-Host "Error: $($_.Exception.Message)"
  1423. }
  1424.  
  1425. Set-CMCollectionDirectRule -SiteServer $SiteServer -SiteCode $SiteCode -ResourceName $AccountName -CollectionName $CollectionName
  1426.  
  1427. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement