使用 PowerShell 管理 Azure Data Lake Storage Gen2 中的 ACL

此文章說明如何使用 PowerShell 來取得、設定及更新目錄和檔案的存取控制清單。

在上層目錄底下新建的下層項目已可使用 ACL 繼承。 但是您也可以在父目錄的現有子項目上以遞迴方式新增、更新和移除 ACL,而不需要針對每個子項目個別進行這些變更。

參考 | 提供意見反應

必要條件

  • Azure 訂用帳戶。 如需詳細資訊,請參閱取得 Azure 免費試用

  • 已啟用階層命名空間 (HNS) 的儲存體帳戶。 遵循下列指示以建立帳戶。

  • Azure CLI 2.6.0 版或更高版本。

  • 下列其中一個安全性權限:

    • 已佈建的 Microsoft Entra ID 安全性主體,該主體已獲派儲存體 Blob 資料擁有者角色,且範圍設定為目標容器、儲存體帳戶、上層資源群組或訂用帳戶。

    • 您計劃套用 ACL 設定的目標容器或目錄的擁有使用者。 若要以遞迴方式設定 ACL,這包括目標容器或目錄中的所有子項目。

    • 儲存體帳戶金鑰。

安裝 PowerShell 模組

  1. 使用下列命令,確認已安裝的 PowerShell 版本為 5.1 或更高版本。

    echo $PSVersionTable.PSVersion.ToString()
    

    若要升級您的 PowerShell 版本,請參閱升級現有的 Windows PowerShell

  2. 安裝 Az.Storage 模組。

    Install-Module Az.Storage -Repository PSGallery -Force  
    

    如需如何安裝 PowerShell 模組的詳細資訊,請參閱安裝 Azure PowerShell 模組

連線到帳戶

選擇您要命令如何取得儲存體帳戶的授權。

選項 1:使用 Microsoft Entra ID 取得授權

注意

如果您使用 Microsoft Entra ID 來授權存取,則需確定已將儲存體 Blob 資料擁有者角色指派給安全性主體。 若要深入了解如何套用 ACL 權限以及變更權限的效果,請參閱 Azure Data Lake Storage Gen2 中的存取控制模型 (部分機器翻譯)。

使用這個方法時,系統會確保您的使用者帳戶具有適當的 Azure 角色型存取控制 (Azure RBAC) 指派和 ACL 權限。

  1. 開啟 Windows PowerShell 命令視窗,然後使用 Connect-AzAccount 命令登入您的 Azure 訂用帳戶,並且遵循畫面上的指示。

    Connect-AzAccount
    
  2. 若身分識別與多個訂用帳戶相關聯,請將使用中訂用帳戶設為您想要在其中建立和管理目錄的儲存體帳戶訂用帳戶。 在此範例中,使用訂用帳戶識別碼取代 <subscription-id> 預留位置值。

    Select-AzSubscription -SubscriptionId <subscription-id>
    
  3. 取得儲存體帳戶內容。

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

選項 2:使用儲存體帳戶金鑰取得授權

使用此方法時,系統不會檢查 Azure RBAC 或 ACL 權限。 使用帳戶金鑰取得儲存體帳戶內容。

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

取得 ACL

使用 Get-AzDataLakeGen2Item Cmdlet 取得目錄或檔案的 ACL。

此範例會取得容器根目錄的 ACL,然後將 ACL 列印到主控台。

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

此範例會取得目錄的 ACL,然後將 ACL 列印到主控台。

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

此範例取得檔案的 ACL,然後將 ACL 列印到主控台。

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

下圖顯示取得目錄的 ACL 之後的輸出。

Get ACL output for directory

在此範例中,擁有使用者具有讀取、寫入和執行權限。 擁有群組只有讀取和執行權限。 如需存取控制清單的詳細資訊,請參閱 Azure Data Lake Storage Gen2 中的存取控制

設定 ACL

當您設定 ACL 時,將會取代整個 ACL,包括其所有項目。 如果您想要變更安全性主體的權限層級,或將新的安全性主體新增至 ACL,而不會影響其他現有的項目,您應該改為更新 ACL。 若要更新 ACL 而非取代,請參閱本文的更新 ACL 一節。

如果您選擇設定 ACL,則必須新增擁有使用者的項目、擁有群組的項目,以及所有其他使用者的項目。 若要深入了解擁有使用者、擁有群組和所有其他使用者,請參閱使用者和身分識別

本節說明如何:

  • 設定 ACL
  • 以遞迴方式設定 ACL

設定 ACL

使用 Set-AzDataLakeGen2ItemAclObject Cmdlet 來建立擁有使用者、擁有群組或其他使用者的 ACL。 然後,使用 Update-AzDataLakeGen2Item Cmdlet 來認可 ACL。

此範例會針對擁有使用者、擁有群組,或其他使用者,在容器的根目錄上設定 ACL,然後將 ACL 列印到主控台。

$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

此範例會針對擁有使用者、擁有群組,或其他使用者,在目錄上設定 ACL,然後將 ACL 列印到主控台。

$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

注意

如果您想要設定預設 ACL 項目,請在執行 Set-AzDataLakeGen2ItemAclObject 命令時使用 -DefaultScope 參數。 例如: $acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType user -Permission rwx -DefaultScope

此範例會針對擁有使用者、擁有群組,或其他使用者,在檔案上設定 ACL,然後將 ACL 列印到主控台。

$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

注意

若要設定特定群組/使用者、服務主體或受控識別的 ACL,請使用各自的物件識別碼。 例如,若要設定群組的 ACL,請使用 group:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx。 若要設定使用者的 ACL,請使用 user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

下圖顯示設定檔案的 ACL 之後的輸出。

Get ACL output for file

在此範例中,擁有使用者和擁有群組只有讀取和寫入權限。 所有其他使用者具備寫入和執行權限。 如需存取控制清單的詳細資訊,請參閱 Azure Data Lake Storage Gen2 中的存取控制

以遞迴方式設定 ACL

使用 Set-AzDataLakeGen2AclRecursive Cmdlet 以遞迴方式設定 ACL。

此範例會設定名為 my-parent-directory 目錄的 ACL。 這些項目會為擁有使用者提供讀取、寫入及執行權限,僅為擁有群組提供讀取和執行權限,對所有其他人員不提供任何權限。 此範例的最後一個 ACL 項目會提供物件識別碼 "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" 讀取和執行權限給特定使用者。

$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

注意

如果您想要設定預設 ACL 項目,請在執行 Set-AzDataLakeGen2ItemAclObject 命令時使用 -DefaultScope 參數。 例如: $acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType user -Permission rwx -DefaultScope

若要查看藉由指定批次大小以遞迴方式批次設定 ACL 的範例,請參閱 Set-AzDataLakeGen2AclRecursive 參考文章。

更新 ACL

當您更新 ACL 時,您會修改 ACL 而不是取代 ACL。 例如,您可以將新的安全性主體新增至 ACL,而不會影響 ACL 中列出的其他安全性主體。 若要取代 ACL 而不是更新,請參閱這篇文章的設定 ACL 一節。

本節說明如何:

  • 更新 ACL
  • 以遞迴方式更新 ACL

更新 ACL

首先,取得 ACL。 然後,使用 Set-AzDataLakeGen2ItemAclObject Cmdlet 來新增或更新 ACL 項目。 使用 Update-AzDataLakeGen2Item Cmdlet 來認可 ACL。

此範例會為使用者建立或更新目錄上的 ACL。

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

注意

如果您想要更新預設 ACL 項目,請在執行 Set-AzDataLakeGen2ItemAclObject 命令時使用 -DefaultScope 參數。 例如: $acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType user -EntityID xxxxxxxx-xxxx-xxxxxxxxxxx -Permission r-x -DefaultScope

以遞迴方式更新 ACL

使用 Update-AzDataLakeGen2AclRecursive Cmdlet 以遞迴方式更新 ACL。

此範例會使用寫入權限更新 ACL 項目。

$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

注意

若要設定特定群組/使用者、服務主體或受控識別的 ACL,請使用各自的物件識別碼。 例如,若要設定群組的 ACL,請使用 group:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx。 若要設定使用者的 ACL,請使用 user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

若要查看藉由指定批次大小以遞迴方式批次更新 ACL 的範例,請參閱 Update-AzDataLakeGen2AclRecursive 參考文章。

移除 ACL 項目

本節說明如何:

  • 移除 ACL 項目
  • 以遞迴方式移除 ACL 項目

移除 ACL 項目

此範例會從現有的 ACL 中移除項目。

$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

以遞迴方式移除 ACL 項目

您能以遞迴方式移除一或多個 ACL 項目。 若要移除 ACL 項目,請為要移除的 ACL 項目建立新 ACL 物件,然後在移除 ACL 作業中使用該物件。 請勿取得現有的 ACL,只提供要移除的 ACL 項目。

使用 Remove-AzDataLakeGen2AclRecursive Cmdlet 移除 ACL 項目。

此範例會從容器的根目錄移除 ACL 項目。

$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

注意

如果您想要移除預設 ACL 項目,請在執行 Set-AzDataLakeGen2ItemAclObject 命令時使用 -DefaultScope 參數。 例如: $acl = Set-AzDataLakeGen2ItemAclObject -AccessControlType user -EntityId $userID -Permission "---" -DefaultScope

若要查看藉由指定批次大小以遞迴方式批次移除 ACL 的範例,請參閱 Remove-AzDataLakeGen2AclRecursive 參考文章。

從失敗中復原

以遞迴方式修改 ACL 時,您可能會遇到執行階段或權限錯誤。

如果是執行階段錯誤,請從頭開始重新啟動程序。 如果安全性主體沒有足夠的權限可修改要修改的目錄階層中目錄或檔案的 ACL,則可能會發生權限錯誤。 解決權限問題,然後選擇使用接續權杖從失敗點繼續處理程序,或從頭開始重新啟動程序。 如果您想要從頭開始重新啟動,就不需要使用接續權杖。 您可以重新套用 ACL 項目,而不會產生負面影響。

此範例會將結果傳回給變數,然後將失敗的項目傳送至格式化的資料表。

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

根據資料表的輸出,您可以修正任何權限錯誤,然後使用接續權杖來繼續執行。

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

若要查看藉由指定批次大小以遞迴方式批次設定 ACL 的範例,請參閱 Set-AzDataLakeGen2AclRecursive 參考文章。

如果您想要讓程序完成而不受權限錯誤干擾,您可以指定。

這個範例會使用 ContinueOnFailure 參數,即使作業遇到權限錯誤,還是會繼續執行。

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

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

若要查看藉由指定批次大小以遞迴方式批次設定 ACL 的範例,請參閱 Set-AzDataLakeGen2AclRecursive 參考文章。

最佳作法

本節提供您以遞迴方式設定 ACL 的一些最佳做法指導方針。

處理執行階段錯誤

有許多原因可能會發生執行階段錯誤 (例如:中斷或用戶端連線問題)。 如果您遇到執行階段錯誤,請重新啟動遞迴 ACL 程序。 ACL 可以重新套用至項目,而不會造成負面影響。

處理權限錯誤 (403)

如果您在執行遞迴 ACL 程序時遇到存取控制例外狀況,則您的 AD 安全性主體可能沒有足夠權限可將 ACL 套用至目錄階層中的一或多個子項目。 發生權限錯誤時,程序會停止,並提供接續權杖。 修正權限問題,然後使用接續權杖來處理剩餘的資料集。 已成功處理的目錄和檔案不需要重新處理。 您也可以選擇重新啟動遞迴 ACL 程序。 ACL 可以重新套用至項目,而不會造成負面影響。

認證

建議您在目標儲存體帳戶或容器的範圍中,佈建已獲指派儲存體 Blob 資料擁有者角色的 Microsoft Entra 安全性主體。

效能

若要減少延遲,建議您在位於與儲存體帳戶相同區域中的 Azure 虛擬機器 (VM) 中執行遞迴 ACL 程序。

ACL 限制

您可以套用至目錄或檔案的 ACL 數目上限是 32 個存取 ACL 和 32 個預設 ACL。 如需詳細資訊,請參閱 Azure Data Lake Storage Gen2 中的存取控制

另請參閱