Update DFSR

This commit is contained in:
Przemyslaw Klys
2020-08-02 16:54:16 +02:00
parent 97a189eda5
commit 1941577b24
3 changed files with 43 additions and 27 deletions
+1 -1
View File
@@ -4,7 +4,7 @@ Import-Module "$PSScriptRoot\..\GPoZaurr.psd1" -Force
# Get dfsr information
$DFSR = Get-GPOZaurrSysvolDFSR
$DFSR | Format-Table
$DFSR | Format-Table *
# Cleanup DFSR Conflict Path
Clear-GPOZaurrSysvolDFSR -WhatIf
+16 -7
View File
@@ -3,8 +3,12 @@ function Clear-GPOZaurrSysvolDFSR {
param(
[alias('ForestName')][string] $Forest,
[string[]] $ExcludeDomains,
[string[]] $ExcludeDomainControllers,
[alias('Domain', 'Domains')][string[]] $IncludeDomains,
[System.Collections.IDictionary] $ExtendedForestInformation
[alias('DomainControllers')][string[]] $IncludeDomainControllers,
[switch] $SkipRODC,
[System.Collections.IDictionary] $ExtendedForestInformation,
[int] $LimitProcessing = [int32]::MaxValue
)
# Based on https://techcommunity.microsoft.com/t5/ask-the-directory-services-team/manually-clearing-the-conflictanddeleted-folder-in-dfsr/ba-p/395711
$StatusCodes = @{
@@ -21,12 +25,17 @@ function Clear-GPOZaurrSysvolDFSR {
#WMIC.EXE /namespace:\\root\microsoftdfs path dfsrreplicatedfolderinfo where "replicatedfolderguid='70bebd41-d5ae-4524-b7df-4eadb89e511e'" call cleanupconflictdirectory
# https://docs.microsoft.com/en-us/previous-versions/windows/desktop/dfsr/dfsrreplicatedfolderinfo
$ForestInformation = Get-WinADForestDetails -Forest $Forest -IncludeDomains $IncludeDomains -ExcludeDomains $ExcludeDomains -ExtendedForestInformation $ExtendedForestInformation
foreach ($Domain in $ForestInformation.Domains) {
Write-Verbose "Clear-GPOZaurrSysvolDFSR - Processing $Domain"
$QueryServer = $ForestInformation['QueryServers']["$Domain"].HostName[0]
$DFSR = Get-GPOZaurrSysvolDFSR -IncludeDomains $Domain -ExtendedForestInformation $ForestInformation
$Executed = Invoke-CimMethod -InputObject $DFSR.DFSR -MethodName 'cleanupconflictdirectory' -CimSession $QueryServer
$getGPOZaurrSysvolDFSRSplat = @{
Forest = $Forest
IncludeDomains = $IncludeDomains
ExcludeDomains = $ExcludeDomains
ExtendedForestInformation = $ExtendedForestInformation
ExcludeDomainControllers = $ExcludeDomainControllers
IncludeDomainControllers = $IncludeDomainControllers
SkipRODC = $SkipRODC
}
Get-GPOZaurrSysvolDFSR @getGPOZaurrSysvolDFSRSplat | Select-Object -First $LimitProcessing | ForEach-Object {
$Executed = Invoke-CimMethod -InputObject $_.DFSR -MethodName 'cleanupconflictdirectory' -CimSession $_.ComputerName
if ($Executed) {
[PSCustomObject] @{
Status = $StatusCodes["$($Executed.ReturnValue)"]
+26 -19
View File
@@ -3,31 +3,38 @@ function Get-GPOZaurrSysvolDFSR {
param(
[alias('ForestName')][string] $Forest,
[string[]] $ExcludeDomains,
[string[]] $ExcludeDomainControllers,
[alias('Domain', 'Domains')][string[]] $IncludeDomains,
[alias('DomainControllers')][string[]] $IncludeDomainControllers,
[switch] $SkipRODC,
[System.Collections.IDictionary] $ExtendedForestInformation,
[string] $SearchDFSR = 'SYSVOL Share'
)
$ForestInformation = Get-WinADForestDetails -Forest $Forest -IncludeDomains $IncludeDomains -ExcludeDomains $ExcludeDomains -ExtendedForestInformation $ExtendedForestInformation
$ForestInformation = Get-WinADForestDetails -Forest $Forest -IncludeDomains $IncludeDomains -ExcludeDomains $ExcludeDomains -ExcludeDomainControllers $ExcludeDomainControllers -IncludeDomainControllers $IncludeDomainControllers -SkipRODC:$SkipRODC -ExtendedForestInformation $ExtendedForestInformation
foreach ($Domain in $ForestInformation.Domains) {
Write-Verbose "Get-GPOZaurrSysvolDFSR - Processing $Domain"
$QueryServer = $ForestInformation['QueryServers']["$Domain"].HostName[0]
$DFSRConfig = Get-CimInstance -Namespace 'root\microsoftdfs' -Class 'dfsrreplicatedfolderconfig' -ComputerName $QueryServer | Where-Object { $_.ReplicatedFolderName -eq $SearchDFSR }
$DFSR = Get-CimInstance -Namespace 'root\microsoftdfs' -Class 'dfsrreplicatedfolderinfo' -ComputerName $QueryServer | Where-Object { $_.ReplicatedFolderName -eq $SearchDFSR }
if ($DFSR -and $DFSRConfig -and ($DFSR.ReplicatedFolderGuid -eq $DFSRConfig.ReplicatedFolderGuid)) {
[PSCustomObject] @{
ComputerName = $DFSR.PSComputerName
DomainName = $Domain
ConflictPath = $DFSRConfig.ConflictPath
LastConflictCleanupTime = $DFSR.LastConflictCleanupTime
CurrentConflictSizeInMb = $DFSR.CurrentConflictSizeInMb
MaximumConflictSizeInMb = $DFSRConfig.ConflictSizeInMb
LastErrorCode = $DFSR.LastErrorCode
LastErrorMessageId = $DFSR.LastErrorMessageId
LastTombstoneCleanupTime = $DFSR.LastTombstoneCleanupTime
ReplicatedFolderGuid = $DFSR.ReplicatedFolderGuid
DFSRConfig = $DFSRConfig
DFSR = $DFSR
foreach ($DC in $ForestInformation.DomainDomainControllers[$Domain]) {
Write-Verbose "Get-GPOZaurrSysvolDFSR - Processing $Domain \ $($DC.HostName)"
#$QueryServer = $ForestInformation['QueryServers']["$Domain"].HostName[0]
$DFSRConfig = Get-CimInstance -Namespace 'root\microsoftdfs' -Class 'dfsrreplicatedfolderconfig' -ComputerName $($DC.HostName) | Where-Object { $_.ReplicatedFolderName -eq $SearchDFSR }
$DFSR = Get-CimInstance -Namespace 'root\microsoftdfs' -Class 'dfsrreplicatedfolderinfo' -ComputerName $($DC.HostName) | Where-Object { $_.ReplicatedFolderName -eq $SearchDFSR }
if ($DFSR -and $DFSRConfig -and ($DFSR.ReplicatedFolderGuid -eq $DFSRConfig.ReplicatedFolderGuid)) {
[PSCustomObject] @{
ComputerName = $DFSR.PSComputerName
DomainName = $Domain
ConflictPath = $DFSRConfig.ConflictPath
LastConflictCleanupTime = $DFSR.LastConflictCleanupTime
CurrentConflictSizeInMb = $DFSR.CurrentConflictSizeInMb
MaximumConflictSizeInMb = $DFSRConfig.ConflictSizeInMb
LastErrorCode = $DFSR.LastErrorCode
LastErrorMessageId = $DFSR.LastErrorMessageId
LastTombstoneCleanupTime = $DFSR.LastTombstoneCleanupTime
ReplicatedFolderGuid = $DFSR.ReplicatedFolderGuid
DFSRConfig = $DFSRConfig
DFSR = $DFSR
}
} else {
Write-Warning "Get-GPOZaurrSysvolDFSR - Couldn't process $($DC.HostName). Conditions not met."
}
}
}