Get-GPPFile.ps1
Function Get-GPPFile { <# .SYNOPSIS Find GPP File preference items in your current domain. .DESCRIPTION Find GPP File preference items in your current domain. If no parameter is specified, we search all GPOs Requires GroupPolicy module. Get it in the RSAT, enable the Windows Feature. The filters property will be an array of all filters .PARAMETER GUID If specified, search this GUID .PARAMETER Name If specified, search this Name .FUNCTIONALITY Group Policy .EXAMPLE #Get all group policy preferences with file preference items Get-GPPFile .EXAMPLE #Get all unique files covered by GP file preference items Get-GPPFile | select -ExpandProperty frompath | sort -unique .EXAMPLE #Find an outdated reference to a file! Get-GPPFile | ?{$_.frompath -eq "\\Path\To\Outdated.exe"} .NOTES Thanks to Johan Dahlbom for the workflow this command borrows: http://365lab.net/2013/12/31/getting-all-gpp-drive-maps-in-a-domain-with-powershell/ #> [cmdletbinding(DefaultParameterSetName='Name')] param( [Parameter( Position=0, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='Name' )] [string[]]$Name = $null, [Parameter( Position=1, ParameterSetName='GUID' )] [string[]]$GUID = $null ) Begin { try { Import-Module GroupPolicy -ErrorAction Stop If(-not (Get-Module GroupPolicy)) { throw "GroupPolicy module not Installed" break } } catch { throw "Error importing GroupPolicy module: $_" break } $xmlProps = "NamespaceURI", "Prefix", "NodeType", "ParentNode", "OwnerDocument", "IsEmpty", "Attributes", "HasAttributes", "SchemaInfo", "InnerXml", "InnerText", "NextSibling", "PreviousSibling", "Value", "ChildNodes", "FirstChild", "LastChild", "HasChildNodes", "IsReadOnly", "OuterXml", "BaseURI" } Process { #if name or guid isn't specified, get them all if(-not $GUID -and -not $Name) { Write-Verbose "Getting all GPOs" $GPO = Get-GPO -all } #If a GUID or Name is specified, add it to the list of GPOs if ( $Name -and $PsCmdlet.ParameterSetName -eq "Name" ) { $GPO = foreach($nam in $Name) { Get-GPO -Name $Nam } } if( $GUID -and $PsCmdlet.ParameterSetName -eq "GUID" ) { $GPO = foreach($ID in $GUID) { Get-GPO -Guid $ID } } foreach ($Policy in $GPO){ $GPOID = $Policy.Id $GPODom = $Policy.DomainName $GPODisp = $Policy.DisplayName #we want to check both user and computer configurations $configTypes = "User", "Machine" foreach($configType in $configTypes) { #Test the path in sysvol where drive maps would be... $path = "\\$($GPODom)\SYSVOL\$($GPODom)\Policies\{$($GPOID)}\$configType\Preferences\Files\Files.xml" if (Test-Path $path -ErrorAction SilentlyContinue) { [xml]$xml = Get-Content $path #Pull relevant data from the xml foreach ( $prefItem in $xml.Files.File ) { #Get all filters for this preference item $childNodes = $prefItem.filters.childnodes New-Object PSObject -Property @{ GPOName = $GPODisp ConfigType = $configType action = $prefItem.Properties.action.Replace("U","Update").Replace("C","Create").Replace("D","Delete").Replace("R","Replace") FromPath = $prefItem.Properties.FromPath targetPath = $prefItem.Properties.targetPath readOnly = $prefItem.Properties.readOnly archive = $prefItem.Properties.archive hidden = $prefItem.Properties.hidden suppress = $prefItem.Properties.suppress disabled = $prefItem.disabled changed = $( Try { Get-Date "$( $prefItem.changed )"} Catch {"Err"} ) filters = $( #Here we loop through each filter, only select the non-XML properties foreach($filter in $childNodes){ Try { $filter | select -Property * -ExcludeProperty $xmlProps } Catch { Continue } } ) } | Select GPOName, ConfigType, action, FromPath, targetPath, readOnly, archive, hidden, suppress, disabled, changed, filters } } } } } } |