1

編集:代わりにこれをserverfaultに投稿する必要がありましたか? stackoverflow には dfs-r のカテゴリすらありませんが、これはスクリプトやプログラミングに関する質問だと思いました。代わりにこれをサーバーフォールトに置くべきかどうか教えてください。

DfsrIdRecordInfo クラスを使用して、やや大きな (6000 ファイル) DFSR データベースのすべてのファイルを取得しようとしましたが、WMI クォータ エラーが発生していました。

サーバーの wmi クォータを 2 倍、さらには 3 倍にしても、これは解決しませんでした。

ここを見ると、このクラスのインデックス プロパティは次のようになっていることがわかりました。「レコードのランタイム インデックス。この値は、大きなクエリの結果を分割するために使用されます。」これはまさに私が望んでいたもののように聞こえましたが、このプロパティの動作は私が期待したものではありません。

このプロパティを使用してページングを実行しようとすると、powershell を使用した次の例のようにすべてのレコードが取得されないことがわかりました。

クォータ エラーをスローしない 700 未満のファイルを含む DFSR データベースでこれをテストしました。これは小さなデータベースなので、次のようなすべてのファイルを 1 秒もかからずに取得できます。

$DFSRFiles = 
    gwmi `
    -Namespace root\microsoftdfs `
    -ComputerName 'dfsrserver' `
    -Query "SELECT *
            FROM DfsrIdRecordInfo                 
            WHERE replicatedfolderguid = '$guid'" 

PS F:\> $DFSRFiles.count
680

したがって、この DFSR DB には 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 から既に返されたレコードに対して使用されることを意味します。

任意のガイダンスをいただければ幸いです。前もって感謝します。

4

0 に答える 0