celiko
Goto Top

PowerShell - For-Each in Azure FileShare

Moin Administratoren,

ich hab eine Frage bezüglich PowerShell und Azure.

Derzeit versuche ich einen Invoke auszuführen für jeden Ordner in meinem FileShare, der eine ChangeDetection starten soll, damit meine on-prem Server Veränderungen an meinem FileShare mitbekommen und synchronisieren. Microsoft macht das täglich automatisch - aber wir benötigen es in einem Zeitraffer von einer Stunde.

Dafür nutze ich folgenden Code (der prinzipiell auch funktioniert)

<#
.DESCRIPTION
A Runbook example which continuously check for files and directories changes in recursive mode
For a specific Azure File Share in a specific Sync Group / Cloud Endpoint
Using the Run As Account (Service Principal in Azure AD)

.NOTES
Filename : Enable-ImmediateFileSync
Author   : Charbel Nemnom
Version  : 1.0
Date     : 24-August-2019
Updated  : 26-August-2019

.LINK
To provide feedback or for further assistance please visit:
https://charbelnemnom.com 
Yess, habe es aus dem Internet von einem MS-Teacher übernommen.

Param (
    [Parameter(Mandatory = $true)][ValidateNotNullOrEmpty()]
    [String] $AzureSubscriptionId,
    [Parameter(Mandatory = $true)][ValidateNotNullOrEmpty()]
    [String] $ResourceGroupName,
    [Parameter(Mandatory = $true)][ValidateNotNullOrEmpty()]
    [String] $StorageSyncServiceName,
    [Parameter(Mandatory = $true)][ValidateNotNullOrEmpty()]
    [String] $SyncGroupName,
    [Parameter(Mandatory = $true)][ValidateNotNullOrEmpty()]
    [String] $Path
)
#Die Parameter kann man über Eingabefelder in der Azure definieren, um die Skripte flexibler zu gestalten.


$connectionName = "AzureRunAsConnection"  

Try {
    #! Get the connection "AzureRunAsConnection "  
    $servicePrincipalConnection = Get-AutomationConnection -Name $connectionName
    Write-Output "Logging in to Azure..."  
    Connect-AzAccount -ServicePrincipal `
        -TenantId $servicePrincipalConnection.TenantId `
        -ApplicationId $servicePrincipalConnection.ApplicationId `
        -CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint
}
Catch {
    If (!$servicePrincipalConnection) {
        $ErrorMessage = "Connection $connectionName not found..."  
        throw $ErrorMessage
    }
    Else {
        Write-Error -Message $_.Exception
        throw $_.Exception
    }
}

Select-AzSubscription -SubscriptionId $AzureSubscriptionId

#! Get Cloud Endpoint Name
$azsync = Get-AzStorageSyncCloudEndpoint -ResourceGroupName "$ResourceGroupName" -StorageSyncServiceName $StorageSyncServiceName `  
    -SyncGroupName "$SyncGroupName"  
Write-Output "Get Azure StorageSync Cloud Endpoint Name: $($azsync.CloudEndpointName)"  
Write-Output $azsync

#! Invoke-AzStorageSyncChangeDetection - ab hier beginnt die eigentliche Aktion.
Write-Output "Check for files and directories changes for $StorageSyncServiceName in $SyncGroupName"  
Invoke-AzStorageSyncChangeDetection -ResourceGroupName $ResourceGroupName -StorageSyncServiceName $StorageSyncServiceName `
    -SyncGroupName $SyncGroupName -CloudEndpointName $azsync.CloudEndpointName -DirectoryPath $Path 

Write-Output ("")  

Ziel ist es, dass ich auf jedem Ordner in meinem FileShare den "Invoke-AzStorageSyncChangeDetection" separat ausführe, weil lediglich 10.000 Veränderungen pro Durchlauf "erlaubt" sind und die Sub-directories nicht mitgescannt werden (-recursive fehlt, weshalb nur die Ordner & Dateien in meinem übergeordneten Ordner synchronisiert werden)
Das Skript verweist auf den Root-Ordner meines FileShares und von da aus kann man auf die einzelnen Hauptverzeichnisse verweisen.

Wenn ich jetzt jedoch einen Ordner in meinem Root-Verzeichnis mit -recursive (also inkl. Sub-Ordner) synchronisieren möchte erhalte ich diese Meldung:
Invoke-AzStorageSyncChangeDetection : Long running operation failed with status 'Failed'. Additional Info:'Change   
detection operation failed: detection process couldn't complete due to large quantity of items being scanned.  

Additional information:
Error code: 0x80C83095 MgmtChangeDetectionTooManyItems'  
Code: MgmtBadRequest
Message: Change detection operation failed: detection process couldn't complete due to large quantity of items being   
scanned.

Additional information:
Error code: 0x80C83095 MgmtChangeDetectionTooManyItems
Target: 
At line:73 char:1
+ Invoke-AzStorageSyncChangeDetection -ResourceGroupName $ResourceGroup ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : CloseError: (:) [Invoke-AzStorageSyncChangeDetection], StorageSyncCloudException
    + FullyQualifiedErrorId : Microsoft.Azure.Commands.StorageSync.CloudEndpoint.InvokeChangeDetectionCommand
Ta-da - die 10.000 Dateien wurden erreicht :X

Ich bin schon seit 2 Tagen dabei aber habe noch keine Möglichkeit gefunden, die ansatzweise in die richtige Richtung geht.
Bitte nimmt es nicht als Versuch auf, dass ich meine Arbeit nicht machen möchte - ich kriege es wirklich einfach nicht hin :/
Wäre es auf einem lokalen System hätte ich es hinbekommen - aber die Cloud cmdlets verwirren mich extrem

Vielleicht kann mir einer weiterhelfen oder Anreize geben, wie ich das evtl. lösen könnte?

VG
Celiko

Content-ID: 629795

Url: https://administrator.de/contentid/629795

Ausgedruckt am: 21.11.2024 um 14:11 Uhr

146707
Lösung 146707 09.12.2020 aktualisiert um 14:51:51 Uhr
Goto Top
Dann mach dir halt eine Variable mit allen Verzeichnissen und dieses Array teilst du dann auf Blöcke à 10000 Ordner auf (for-Loop) und schickst jeden Block an die "Invoke-AzStorageSyncChangeDetection" Function.
Celiko
Celiko 09.12.2020 um 15:01:12 Uhr
Goto Top
Versuche ich mal, danke
Ist ne super Idee ^^

VG