# encoding: ascii
# api: powershell
# title: Remove-SCCMDPContent
# description: The Function Remove-SCCMDPContent will remove a list of PackageIDs from a Distribution Point.
# version: 3.0
# type: function
# author: DexterPOSH
# license: CC0
# function: Remove-SCCMDPContent
# x-poshcode-id: 5048
# x-archived: 2014-04-06T17:34:23
# x-published: 2014-04-03T05:13:00
#
# Have to specify the SCCM Server with SMS namespace installed.
# The big advantage is you don’t need any Module for this, standalone function and works for both ConfigMgr 07 & 12 (tested).
# It uses WQL filters to first get all the Packages distributed to a DP and the iterates over the list specified and finally removes the WMI Instances of the SMS_Distribution Class matching the PackageIDs.
#
function Remove-SCCMDPContent
{
<#
.Synopsis
Function to Remove Packages from the DP
.DESCRIPTION
THis Function will connect to the SCCM Server SMS namespace and then remove the Package IDs
passed to the Function from the specified DP name.
.EXAMPLE
PS> Remove-SCCMDPContent -PackageID DEX123AB,DEX145CD -DPname DexDP -Computername DexSCCMServer
This will remove the Packages with Package IDs [ DEX123AB,DEX145CD] from the Distribution Point "DexDP".
.INPUTS
System.String[]
.OUTPUTS
System.Management.Automation.PSCustomObject
.NOTES
Author - DexterPOSH (Deepak Singh Dhami)
BlogLink - http://dexterposh.blogspot.com/2014/02/use-powershell-to-remove-packages-from.html
#>
#requires -version 3.0
#requires -RunAsAdministrator
[CmdletBinding()]
[OutputType([PSObject])]
Param
(
# Specify the Package IDs which need to be removed from the DP
[Parameter(Mandatory,
ValueFromPipelineByPropertyName,
Position=0)]
[string[]]$PackageID,
# Pass the DP name where cleanup is to be done
[Parameter(Mandatory=$true)]
[String]$DPName,
#Supply the SCCM Site Server hosting SMS Namespace Provider
[Parameter()]
[Alias("SCCMServer")]
[String]$ComputerName
)
Begin
{
Write-Verbose -Message "[BEGIN]"
try
{
$sccmProvider = Get-WmiObject -query "select * from SMS_ProviderLocation where ProviderForLocalSite = true" -Namespace "root\sms" -computername $ComputerName -errorAction Stop
# Split up the namespace path
$Splits = $sccmProvider.NamespacePath -split "\\", 4
Write-Verbose "Provider is located on $($sccmProvider.Machine) in namespace $($splits[3])"
# Create a new hash to be passed on later
$hash= @{"ComputerName"=$ComputerName;"NameSpace"=$Splits[3];"Class"="SMS_DistributionPoint";"ErrorAction"="Stop"}
#add the filter to get the packages there in the DP only
$hash.Add("Filter","ServerNALPath LIKE '%$DPname%'")
}
catch
{
Write-Warning "Something went wrong while getting the SMS ProviderLocation"
throw $Error[0].Exception
}
}
Process
{
Write-Verbose -Message "[PROCESS] Working to remove packages from DP --> $DPName "
#get all the packages in the Distribution Point
$PackagesINDP = Get-WmiObject @hash
#Filter the packages based on the PackageID
$RemovePackages = $PackagesINDP | where {$PackageID -contains $_.packageid }
$Removepackages | ForEach-Object -Process {
try
{
Remove-WmiObject -InputObject $_ -ErrorAction Stop -ErrorVariable WMIRemoveError
Write-Verbose -Message "Removed $($_.PackageID) from $DPname"
[pscustomobjet]@{"DP"=$DPname;"PackageId"=$($_.PackageID);"Action"="Removed"}
}
catch
{
Write-Warning "[PROCESS] Something went wrong while removing the Package from $DPname"
$WMIRemoveError.Exception
}
}#End Foreach-Object
}#End Process
End
{
Write-Verbose "[END] Ending the Function"
}
}