编辑:我应该把这个发布在 serverfault 上吗?stackoverflow 上甚至没有 dfs-r 类别,但我认为这更像是一个脚本\编程问题。让我知道我是否应该把它放在 serverfault 上。
我尝试使用 DfsrIdRecordInfo 类来检索一个有点大(6000 个文件)DFSR 数据库的所有文件,但遇到了 WMI 配额错误。
将服务器上的 wmi 配额增加一倍甚至三倍并不能解决这个问题。
看这里发现这个类的索引属性是:“记录的运行时索引。这个值是用来对大查询的结果进行分区的。” 这听起来正是我想要的,但是这个属性的行为不是我所期望的。
我发现当我尝试使用此属性进行分页时,它不会按照以下使用 powershell 的示例检索所有记录。
我在一个文件少于 700 个且不会引发配额错误的 DFSR 数据库上对此进行了测试。因为这是一个小型数据库,所以我可以在不到一秒的时间内获得所有这样的文件:
$DFSRFiles =
gwmi `
-Namespace root\microsoftdfs `
-ComputerName 'dfsrserver' `
-Query "SELECT *
FROM DfsrIdRecordInfo
WHERE replicatedfolderguid = '$guid'"
PS F:\> $DFSRFiles.count
680
所以我在这个 DFSR 数据库中有 680 个文件。现在,如果我尝试使用 index 属性进行分页,如下所示:
$starttime = Get-Date;
$i = 0 #index counter
$DfsrIdRecordInfoArr = @()
while ($i -lt 1000) {
$starttimepage = Get-Date
$StartRange = $i
$EndRange = $i += 500
Write-Host -ForegroundColor Green "On range: $StartRange - $EndRange"
$DFSRFiles =
gwmi `
-Namespace root\microsoftdfs `
-ComputerName 'dfsrserver' `
-Query "SELECT *
FROM DfsrIdRecordInfo
WHERE index >= $StartRange
AND index <= $EndRange
AND replicatedfolderguid = '$guid'"
$DfsrIdRecordInfoArr += $DFSRFiles
Write-Host -ForegroundColor Green "Returned $($DFSRFiles.count) objects from range"
(Get-Date) - $starttimepage
write-host -fo yellow "DEBUG: i = $i"
}
(get-date) - $starttime
PS F:\> $DfsrIdRecordInfoArr.count
517
所以它只返回 517 个文件。
这是我的调试消息的完整输出。您还可以看到以这种方式搜索需要很长时间:
On range: 0 - 500
Returned 501 objects from range
Days : 0
Hours : 0
Minutes : 1
Seconds : 29
Milliseconds : 540
Ticks : 895409532
TotalDays : 0.001036353625
TotalHours : 0.024872487
TotalMinutes : 1.49234922
TotalSeconds : 89.5409532
TotalMilliseconds : 89540.9532
DEBUG: i = 500
On range: 500 - 1000
Returned 16 objects from range
Days : 0
Hours : 0
Minutes : 1
Seconds : 35
Milliseconds : 856
Ticks : 958565847
TotalDays : 0.00110945121180556
TotalHours : 0.0266268290833333
TotalMinutes : 1.597609745
TotalSeconds : 95.8565847
TotalMilliseconds : 95856.5847
DEBUG: i = 1000
Days : 0
Hours : 0
Minutes : 3
Seconds : 5
Milliseconds : 429
Ticks : 1854295411
TotalDays : 0.00214617524421296
TotalHours : 0.0515082058611111
TotalMinutes : 3.09049235166667
TotalSeconds : 185.4295411
TotalMilliseconds : 185429.5411
我在做傻事吗?我在想“运行时索引”意味着索引属性不是静态附加到记录的,并且每次运行查询时都会为每条记录重新生成,因为 $DFSRFiles 中对象的索引属性与 $DfsrIdRecordInfoArr 中的索引属性不匹配.
但是,如果每个查询的索引属性都不同,那么我将在 $DfsrIdRecordInfoArr 中有重复项,而我没有。所有记录都是唯一的,但它不会返回所有记录。
index 属性对我的目的完全没用吗?也许当它说“...对大型查询的结果进行分区”时,这意味着它将用于已经从 WMI 返回的记录,而不是 WMI 查询本身。
任何指导将不胜感激。提前致谢。