GPOWMI.psm1
function Get-GPOWmiFilter { <# .Synopsis Gets all Group Policy Filters or by name .DESCRIPTION This cmdlet depends on the GroupPolicy module .EXAMPLE Get-GPOWmiFilter Lists all (if any) WMIFilter configured in Group Policy Management .EXAMPLE Get-GPOWmiFilter -Name HR Get a WMIFilter named HR .EXAMPLE "HR" | Get-GPOWmiFilter Get a WMIFilter named HR using the pipeline .EXAMPLE "HR","AllClients" | Get-GPOWmiFilter Gets WMIFilters named HR and Allclients using the pipeline .INPUTS String (Name of WMIFilter) .OUTPUTS Microsoft.GroupPolicy.WmiFilter .NOTES Created by Tore.Groneng@firstpoint.no @ToreGroneng 2016 .ROLE Active Directory scripting .FUNCTIONALITY Linking GPOs with WMIFilters #> [cmdletbinding()] Param( [Parameter(ValueFromPipeline)] [string[]]$Name = "*" ) BEGIN { $f = $MyInvocation.InvocationName if(-not (Get-Module -Name GroupPolicy)) { Import-Module -Name GroupPolicy -ErrorAction Stop -Verbose:$false } Write-Verbose -Message "$f - START" $GPdomain = New-Object Microsoft.GroupPolicy.GPDomain $SearchFilter = New-Object Microsoft.GroupPolicy.GPSearchCriteria Write-Verbose -Message "$f - Searching for WmiFilters" $allWmiFilters = $GPdomain.SearchWmiFilters($SearchFilter) Write-Verbose -Message "$f - Found $($allWmiFilters.Count) filters" } PROCESS { foreach($FilterName in $Name) { Write-Verbose -Message "$f - Looking for $FilterName" $allWmiFilters | Where-Object Name -like $FilterName } } END { Write-Verbose -Message "$f - END" } } function Set-GPOWmiFilter { <# .Synopsis Links a Group Policy to a WMIFilter .DESCRIPTION This cmdlet depends on the GroupPolicy module. Apply a WMI filter to any Group Policy configured in Active Directory .EXAMPLE Set-GPOWmiFilter -WMIFilterName HR -GroupPolicyName MyGPO Links the WMIfilter named HR to the Group Policy MyGPO .EXAMPLE Set-GPOWmiFilter -WMIFilterName HR -GroupPolicyGUID ed3119f9-4038-464e-abdc-9202bfd24917 Links the WMIfilter named HR to the Group Policy with the specified GUID .EXAMPLE Get-GPOWmiFilter -Name HR | Set-GPOWmiFilter -GroupPolicyName MyGPO Get a WMIFilter named HR and applies it using the pipeline to the Group Policy MyGPO .OUTPUTS $null .NOTES Created by Tore.Groneng@firstpoint.no @ToreGroneng 2016 .ROLE Active Directory scripting .FUNCTIONALITY Linking GPOs with WMIFilters #> [cmdletbinding()] Param( [Parameter( ValueFromPipeline, ParameterSetName='ByWMIFilterObject')] [Microsoft.GroupPolicy.WmiFilter]$WMIfilter , [Parameter(ParameterSetName='ByWMIFilterName')] [Parameter(ParameterSetName='FilterByPolicyName')] [Parameter(ParameterSetName='FilterByPolicyGUID')] [string]$WMIFilterName , [Parameter(ParameterSetName='FilterByPolicyName')] [Parameter(ParameterSetName='ByWMIFilterObject')] [string]$GroupPolicyName , [Parameter(ParameterSetName='FilterByPolicyGUID')] [Parameter(ParameterSetName='ByWMIFilterObject')] [guid]$GroupPolicyGUID ) BEGIN { $f = $MyInvocation.InvocationName Write-Verbose -Message "$f - START" Write-Verbose -Message "$f - Loading required module GroupPolicy" if(-not (Get-Module -Name GroupPolicy)) { Import-Module -Name GroupPolicy -ErrorAction Stop -Verbose:$false } $GPdomain = New-Object Microsoft.GroupPolicy.GPDomain $SearchFilter = New-Object Microsoft.GroupPolicy.GPSearchCriteria Write-Verbose -Message "$f - Searching for WmiFilters" $allWmiFilters = $GPdomain.SearchWmiFilters($SearchFilter) } PROCESS { if($WMIFilterName) { Write-Verbose -Message "$f - Finding WMI-filter with name $WMIFilterName" $WMIfilter = $allWmiFilters | Where-Object Name -eq $WMIFilterName if(-not $WMIfilter) { $msg = "Did not find a WMIfilter with name '$WMIFilterName'" Write-Verbose -Message "$f - ERROR - $msg" Write-Error -Message $msg -ErrorAction Stop } } $GroupPolicyObject = $null if($GroupPolicyName) { Write-Verbose -Message "$f - Finding Group Policy with name '$GroupPolicyName'" $GroupPolicyObject = Get-GPO -Name $GroupPolicyName if(-not $GroupPolicyObject) { $msg = "Unable to find GPO with Name '$GroupPolicyName'" Write-Verbose -Message "$f - ERROR - $msg" Write-Error -Message $msg -ErrorAction Stop } } if($GroupPolicyGUID) { Write-Verbose -Message "$f - Finding Group Policy with GUID '$GroupPolicyGUID'" $GroupPolicyObject = Get-GPO -Guid $GroupPolicyGUID if(-not $GroupPolicyObject) { $msg = "Unable to find GPO with GUID '$GroupPolicyGUID'" Write-Verbose -Message "$f - ERROR - $msg" Write-Error -Message $msg -ErrorAction Stop } } Write-Verbose -Message "$f - Applying filter with name '$($WMIfilter.Name)' to GPO '$($GroupPolicyObject.DisplayName)'" try { $GroupPolicyObject.WmiFilter = $WMIfilter } catch { $ex = $_.Exception Write-Verbose -Message "$f - EXCEPTION - $($ex.Message)" throw $ex } } END { Write-Verbose -Message "$f - END" } } |