Använda PowerShell för att hantera ACL:er i Azure Data Lake Storage

Den här artikeln visar hur du använder PowerShell för att hämta, sätta och uppdatera åtkomstkontrolllistor (ACL) över kataloger och filer.

Nya barnobjekt som du skapar under en föräldrakatalog ärver automatiskt ACL:er. Du kan dock också lägga till, uppdatera och ta bort ACL:er rekursivt på befintliga barnobjekt i en föräldrakatalog utan att göra dessa ändringar individuellt för varje barnobjekt.

Referens | Ge feedback

Förutsättningar

  • Ett Azure-abonnemang. Mer information finns i Hämta kostnadsfri utvärderingsversion av Azure.

  • Ett lagringskonto med hierarkisk namnrymd (HNS) aktiverat. Följ dessa instruktioner för att skapa en.

  • En av följande säkerhetsbehörigheter:

    • En provisionerad Microsoft Entra ID-säkerhetsprincip som tilldelas rollen Storage Blob Data Owner, begränsad till målcontainern, lagringskontot, föräldraresursgruppen eller prenumerationen.

    • Ägande användare av målcontainern eller katalogen som du planerar att tillämpa ACL-inställningar på. För att sätta ACL:er rekursivt inkluderar denna användare alla underordnade objekt i målbehållaren eller katalogen.

Installera PowerShell-modulen

  1. Verifiera att den version av PowerShell du installerade är 5.1 eller högre genom att använda följande kommando.

    echo $PSVersionTable.PSVersion.ToString()
    

    För att uppgradera din version av PowerShell, se Uppgradera befintlig Windows PowerShell.

  2. Installera Az.Storage-modulen .

    Install-Module Az.Storage -Repository PSGallery -Force  
    

    För mer information om hur man installerar PowerShell-moduler, se Installera Azure PowerShell-modulen.

Ansluta till kontot

  1. Öppna ett Windows PowerShell-kommandofönster och logga sedan in på din Azure-prenumeration med kommandot Connect-AzAccount och följ anvisningarna på skärmen.

    Connect-AzAccount
    
  2. Om din identitet är kopplad till mer än en prenumeration och du inte blir ombedd att välja prenumerationen, ställ in din aktiva prenumeration på prenumerationen på det lagringskonto du vill använda. I det här exemplet ersätter du <subscription-id> platshållarvärdet med ID:t för din prenumeration.

    Select-AzSubscription -SubscriptionId <subscription-id>
    
  3. Hämta kontexten för lagringskontot.

    $ctx = New-AzStorageContext -StorageAccountName '<storage-account-name>' -UseConnectedAccount
    

Hämta ACL:er

Hämta ACL för en katalog eller fil med hjälp av cmdleten Get-AzDataLakeGen2Item .

I Azure Data Lake Storage kallas en container också för ett filsystem. Parametern -FileSystem som används i följande exempel tar namnet på din container.

Följande exempel hämtar ACL från rotkatalogen i en container och skriver sedan ut ACL:en till konsolen.

$filesystemName = "my-file-system"
$filesystem = Get-AzDataLakeGen2Item -Context $ctx -FileSystem $filesystemName
$filesystem.ACL

Följande exempel hämtar ACL för en katalog och skriver sedan ut ACL till konsolen.

$filesystemName = "my-file-system"
$dirname = "my-directory/"
$dir = Get-AzDataLakeGen2Item -Context $ctx -FileSystem $filesystemName -Path $dirname
$dir.ACL

Följande exempel hämtar ACL för en fil och skriver sedan ut ACL till konsolen.

$filePath = "my-directory/upload.txt"
$file = Get-AzDataLakeGen2Item -Context $ctx -FileSystem $filesystemName -Path $filePath
$file.ACL

Följande bild visar utdata när du har hämtat ACL för en katalog.

Skärmdump av ACL-utdata för en katalog i Azure Data Lake Storage.

I det här exemplet har den ägande användaren läs-, skriv- och körningsbehörigheter. Ägandegruppen har endast läs- och körbehörigheter. Mer information om åtkomstkontrollistor finns i Åtkomstkontroll i Azure Data Lake Storage.

Ange ACL:er

När du sätter ett ACL byter du ut hela ACL:n, inklusive alla dess poster. Om du vill ändra behörighetsnivån för en säkerhetsprincip eller lägga till en ny säkerhetsprincip i ACL utan att påverka andra befintliga poster, uppdatera ACL istället. Information om hur du uppdaterar en ACL i stället för att ersätta den finns i avsnittet Uppdatera ACL:er i den här artikeln.

Om du väljer att ställa in ACL måste du lägga till en post för ägaren, en post för ägandegruppen och en post för alla andra användare. Mer information om den ägande användaren, ägande gruppen och alla andra användare finns i Användare och identiteter.

Det här avsnittet visar hur du:

  • Ställ in en ACL
  • Ange ACL:er rekursivt

Ställ in en ACL

Använd cmdleten Set-AzDataLakeGen2ItemAclObject för att skapa en ACL för den ägande användaren, ägande gruppen eller andra användare. Använd sedan cmdleten Update-AzDataLakeGen2Item för att bekräfta ändringarna i ACL:en.

I det här exemplet ställs ACL in på rotkatalogen för en container för den ägande användaren, den ägande gruppen eller andra användare och sedan skrivs ACL:en ut till konsolen.

$filesystemName = "my-file-system"
$acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType user -Permission rw-
$acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType group -Permission rw- -InputObject $acl
$acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType other -Permission -wx -InputObject $acl
Update-AzDataLakeGen2Item -Context $ctx -FileSystem $filesystemName -Acl $acl
$filesystem = Get-AzDataLakeGen2Item -Context $ctx -FileSystem $filesystemName
$filesystem.ACL

Det här exemplet anger ACL på en katalog för den ägande användaren, ägande gruppen eller andra användare och skriver sedan ut ACL:en till konsolen.

$filesystemName = "my-file-system"
$dirname = "my-directory/"
$acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType user -Permission rw-
$acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType group -Permission rw- -InputObject $acl
$acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType other -Permission -wx -InputObject $acl
Update-AzDataLakeGen2Item -Context $ctx -FileSystem $filesystemName -Path $dirname -Acl $acl
$dir = Get-AzDataLakeGen2Item -Context $ctx -FileSystem $filesystemName -Path $dirname
$dir.ACL

Kommentar

För att sätta en standard ACL-post, använd parametern -DefaultScope när du kör kommandot Set-AzDataLakeGen2ItemAclObject . Exempel: $acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType user -Permission rwx -DefaultScope.

Det här exemplet anger ACL på en fil för den ägande användaren, ägande gruppen eller andra användare och skriver sedan ut ACL:en till konsolen.

$filesystemName = "my-file-system"
$filePath = "my-directory/upload.txt"
$acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType user -Permission rw-
$acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType group -Permission rw- -InputObject $acl
$acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType other -Permission "-wx" -InputObject $acl
Update-AzDataLakeGen2Item -Context $ctx -FileSystem $filesystemName -Path $filePath -Acl $acl
$file = Get-AzDataLakeGen2Item -Context $ctx -FileSystem $filesystemName -Path $filePath
$file.ACL

Kommentar

Om du vill ange ACL för en viss grupp eller användare, tjänstens huvudnamn eller hanterade identitet använder du deras respektive objekt-ID:n. Om du till exempel vill ange ACL för en grupp använder du group:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx. Om du vill ange en användares ACL använder du user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.

Följande bild visar utdata när du har angett ACL för en fil.

Skärmdump av ACL-utdata för en fil i Azure Data Lake Storage.

I det här exemplet har ägande användare och ägande grupp endast läs- och skrivbehörigheter. Alla andra användare har skriv- och körningsbehörigheter. Mer information om åtkomstkontrollistor finns i Åtkomstkontroll i Azure Data Lake Storage.

Ange ACL:er rekursivt

Ange ACL:er rekursivt med hjälp av cmdleten Set-AzDataLakeGen2AclRecursive .

I det här exemplet anges ACL för en katalog med namnet my-parent-directory. Dessa poster ger den ägande användaren läs-, skriv- och exekveringsbehörigheter, ger den ägande gruppen endast läs- och exekveringsbehörigheter, och ger alla andra inga åtkomst. Den sista ACL-posten i det här exemplet ger en specifik användare med objekt-ID:t "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" läs- och körningsbehörigheter.

$filesystemName = "my-container"
$dirname = "my-parent-directory/"
$userID = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";

$acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType user -Permission rwx
$acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType group -Permission r-x -InputObject $acl
$acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType other -Permission "---" -InputObject $acl
$acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType user -EntityId $userID -Permission r-x -InputObject $acl

Set-AzDataLakeGen2AclRecursive -Context $ctx -FileSystem $filesystemName -Path $dirname -Acl $acl

Kommentar

För att sätta en standard ACL-post, använd parametern -DefaultScope när du kör kommandot Set-AzDataLakeGen2ItemAclObject . Exempel: $acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType user -Permission rwx -DefaultScope.

Ett exempel som anger ACL:er rekursivt i batchar genom att ange en batchstorlek finns i referensartikeln Set-AzDataLakeGen2AclRecursive .

Uppdatera ACL:er

När du uppdaterar en ACL ändrar du ACL:en i stället för att ersätta ACL:en. Du kan till exempel lägga till ett nytt säkerhetsobjekt till ACL utan att påverka andra säkerhetsobjekt som anges i ACL: n. Om du vill ersätta ACL:en i stället för att uppdatera den läser du avsnittet Ange ACL:er i den här artikeln.

Det här avsnittet visar hur du:

  • Uppdatera en ACL
  • Uppdatera ACL:er rekursivt

Uppdatera en ACL

Hämta först ACL:en. Använd sedan cmdleten Set-AzDataLakeGen2ItemAclObject för att lägga till eller uppdatera en ACL-post. Använd cmdleten Update-AzDataLakeGen2Item för att committera ACL:en.

Det här exemplet skapar eller uppdaterar ACL:en i en katalog för en användare.

$filesystemName = "my-file-system"
$dirname = "my-directory/"
$acl = (Get-AzDataLakeGen2Item -Context $ctx -FileSystem $filesystemName -Path $dirname).ACL
$acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType user -EntityID aaaaaaaa-bbbb-cccc-1111-222222222222 -Permission r-x -InputObject $acl
Update-AzDataLakeGen2Item -Context $ctx -FileSystem $filesystemName -Path $dirname -Acl $acl

Kommentar

För att uppdatera en standard ACL-post, använd parametern -DefaultScope när du kör kommandot Set-AzDataLakeGen2ItemAclObject . Exempel: $acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType user -EntityID aaaaaaaa-bbbb-cccc-1111-222222222222 -Permission r-x -DefaultScope.

Uppdatera ACL:er rekursivt

Uppdatera ACL:er rekursivt med hjälp av cmdleten Update-AzDataLakeGen2AclRecursive .

I det här exemplet uppdateras en ACL-post med skrivbehörighet.

$filesystemName = "my-container"
$dirname = "my-parent-directory/"
$userID = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";

$acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType user -EntityId $userID -Permission rwx

Update-AzDataLakeGen2AclRecursive -Context $ctx -FileSystem $filesystemName -Path $dirname -Acl $acl

Kommentar

Om du vill ange ACL för en viss grupp eller användare, tjänstens huvudnamn eller hanterade identitet använder du deras respektive objekt-ID:n. Om du till exempel vill ange ACL för en grupp använder du group:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx. Om du vill ange en användares ACL använder du user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.

Ett exempel som uppdaterar ACL:er rekursivt i batchar genom att ange en batchstorlek finns i referensartikeln Update-AzDataLakeGen2AclRecursive .

Ta bort ACL-poster

Det här avsnittet visar hur du:

  • Ta bort en ACL-post
  • Ta bort poster från ACL rekursivt

Ta bort en ACL-post

Det här exemplet tar bort en post från en befintlig ACL. Den återanvänder $ctx lagringskontokontexten och variablerna $acl, $filesystemName och $dirname som definierats i tidigare avsnitt av artikeln.

$id = "xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

# Create the new ACL object.
[Collections.Generic.List[System.Object]]$aclnew =$acl

foreach ($a in $aclnew)
{
    if ($a.AccessControlType -eq "User" -and $a.DefaultScope -eq $false -and $a.EntityId -eq $id)
    {
        $aclnew.Remove($a);
        break;
    }
}
Update-AzDataLakeGen2Item -Context $ctx -FileSystem $filesystemName -Path $dirname -Acl $aclnew

Ta bort poster från ACL rekursivt

Du kan ta bort en eller flera ACL-poster rekursivt. För att ta bort en ACL-post, skapa ett nytt ACL-objekt för den ACL-post du vill ta bort, och använd sedan det objektet i funktionen ta bort ACL. Hämta inte den befintliga ACL:en, ange bara de ACL-poster som ska tas bort.

Ta bort ACL-poster med cmdleten Remove-AzDataLakeGen2AclRecursive .

Det här exemplet tar bort en ACL-post från containerns rotkatalog.

$filesystemName = "my-container"
$userID = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

$acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType user -EntityId $userID -Permission "---"

Remove-AzDataLakeGen2AclRecursive -Context $ctx -FileSystem $filesystemName  -Acl $acl

Kommentar

För att ta bort en standard ACL-post, använd parametern -DefaultScope när du kör kommandot Set-AzDataLakeGen2ItemAclObject . Exempel: $acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType user -EntityId $userID -Permission "---" -DefaultScope.

Om du vill se ett exempel som tar bort ACL:er rekursivt i batchar genom att ange en batchstorlek kan du läsa referensartikeln Remove-AzDataLakeGen2AclRecursive .

Återhämta sig från misslyckanden

Du kan stöta på körnings- eller behörighetsfel när du ändrar ACL:er rekursivt. Exemplen i detta avsnitt återanvänder $ctx lagringskontots kontext och $filesystemName, $dirname, samt $acl variabler som fastställts i tidigare avsnitt av denna artikel.

Starta om processen från början vid körningsfel. Behörighetsfel kan uppstå om säkerhetschefen inte har tillräcklig behörighet för att ändra ACL för en katalog eller fil som finns i kataloghierarkin du ändrar. Åtgärda behörighetsproblemet och välj sedan att antingen återuppta processen från felpunkten genom att använda en fortsättningstoken, eller starta om processen från början. Du behöver inte använda fortsättningstoken om du föredrar att starta om från början. Du kan använda ACL-poster igen utan någon negativ inverkan.

Detta exempel returnerar resultat till variabeln och skickar sedan misslyckade poster till en formaterad tabell.

$result = Set-AzDataLakeGen2AclRecursive -Context $ctx -FileSystem $filesystemName -Path $dirname -Acl $acl
$result
$result.FailedEntries | ft

Baserat på tabellens utdata kan du åtgärda eventuella behörighetsfel och sedan återuppta körningen med hjälp av fortsättningstoken.

$result = Set-AzDataLakeGen2AclRecursive -Context $ctx -FileSystem $filesystemName -Path $dirname -Acl $acl -ContinuationToken $result.ContinuationToken
$result

Ett exempel som anger ACL:er rekursivt i batchar genom att ange en batchstorlek finns i referensartikeln Set-AzDataLakeGen2AclRecursive .

Om du vill att processen ska slutföras utan avbrott av behörighetsfel kan du konfigurera den för att göra det.

I det här exemplet används parametern ContinueOnFailure så att körningen fortsätter även om åtgärden påträffar ett behörighetsfel.

$result = Set-AzDataLakeGen2AclRecursive -Context $ctx -FileSystem $filesystemName -Path $dirname -Acl $acl -ContinueOnFailure

echo "[Result Summary]"
echo "TotalDirectoriesSuccessfulCount: `t$($result.TotalDirectoriesSuccessfulCount)"
echo "TotalFilesSuccessfulCount: `t`t`t$($result.TotalFilesSuccessfulCount)"
echo "TotalFailureCount: `t`t`t`t`t$($result.TotalFailureCount)"
echo "FailedEntries:"$($result.FailedEntries | ft)

Ett exempel som anger ACL:er rekursivt i batchar genom att ange en batchstorlek finns i referensartikeln Set-AzDataLakeGen2AclRecursive .

Bästa praxis

Det här avsnittet innehåller några riktlinjer för bästa praxis för att ställa in ACL:er rekursivt.

Hantera körningsfel

Ett körningsfel kan inträffa av många orsaker (till exempel ett avbrott eller ett problem med klientanslutningen). Om du stöter på ett körningsfel startar du om den rekursiva ACL-processen. ACL:er kan tillämpas på objekt igen utan att orsaka en negativ inverkan.

Hantera behörighetsfel (403)

Om du stöter på ett undantag för åtkomstkontroll när du kör en rekursiv ACL-process kanske ditt AD-säkerhetsobjekt inte har tillräcklig behörighet för att tillämpa en ACL på ett eller flera av de underordnade objekten i kataloghierarkin. När ett behörighetsfel inträffar stoppas processen och en fortsättningstoken tillhandahålls. Åtgärda behörighetsproblemet och använd sedan fortsättningstoken för att bearbeta den återstående datauppsättningen. Katalogerna och filerna som redan har bearbetats behöver inte bearbetas igen. Du kan också välja att starta om den rekursiva ACL-processen. ACL:er kan tillämpas på objekt igen utan att orsaka en negativ inverkan.

Referenser

Vi rekommenderar att du etablerar ett Microsoft Entra-säkerhetsobjekt som har tilldelats rollen Storage Blob Data Owner inom mållagringskontots eller behållarens omfång.

Prestanda

För att minska svarstiden rekommenderar vi att du kör den rekursiva ACL-processen på en virtuell Azure-dator (VM) som finns i samma region som ditt lagringskonto.

ACL-gränser

Det maximala antalet ACL:er som du kan använda för en katalog eller fil är 32 åtkomst-ACL:er och 32 standard-ACL:er. Mer information finns i Åtkomstkontroll i Azure Data Lake Storage Gen2.

Se även