[PowerShell] 사용자에게 폴더 권한(읽기/쓰기 등) 부여
개요
파워쉘로 파일(or 폴더)의 사용자 권한을 부여하려면 어떻게 해야할까?
파일과 권한
NTFS 파일 권한의 종류
NTFS 파일(과 폴더) 기준으로 정의된 권한은 아래 enum에 정의되어 있으며,
[System.Enum]::GetNames([System.Security.AccessControl.FileSystemRights])
확인하면 아래와 같이 권한을 보여준다.
PS C:\workspace> [System.Enum]::GetNAmes([System.Security.AccessControl.FileSystemRights])ListDirectoryReadDataWriteDataCreateFilesCreateDirectoriesAppendDataReadExtendedAttributesWriteExtendedAttributesTraverseExecuteFileDeleteSubdirectoriesAndFilesReadAttributesWriteAttributesWriteDeleteReadPermissionsReadReadAndExecuteModifyChangePermissionsTakeOwnershipSynchronizeFullControl
이름을 보면 얼추 어떤 권한인지 확인할 수 있다. 냅다 FullControl을 사용하면 안된다.
GET-ACL - 권한 확인
파일의 권한을 확인한다.
PS C:\workspace\shell> get-acl -path "folderpath"디렉터리: C:\workspacePath Owner Access---- ----- ------folderpath domain\user BUILTIN\Administrators Allow FullControl...
output 형식은 다음과 같다.
- System.Security.AccessControl.FileSecurity,
- System.Security.AccessControl.DirectorySecurity
- System.Security.AccessControl.RegistrySecurity
SetAccessRule
획득한 ACL의 세부 엑세스 룰을 변경한다. SetAccessRule은 지정한 액세스 규칙과 동일한 보안 식별자 및 한정자가 들어 있는 모든 액세스 규칙을 제거한 다음 지정한 액세스 규칙을 추가한다. 여기서 보안 식별자는 유저(아리 예제 중 첫번째 인수)가 되고 한정자는 AccessControlType(세번째 인수)가 된다. A유저의 허가(Allow)를 두번째 타입으로 덮어쓴다는 말. 즉, 새로운 유저 혹은 새로운 한정자(allow룰만 있는데 deny룰을 걸 경우)를 설정하면 신규 AccessRule이 ACL에 추가된다.
$AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($domainUserName,"FullControl","ContainerInherit,ObjectInherit","None","Allow")
AddAccessRule이나 ResetAccessRule같은 함수가 많으니 필요에 따라 사용하자. https://docs.microsoft.com/ko-kr/dotnet/api/system.security.accesscontrol.filesystemsecurity?view=net-5.0
SET-ACL - 권한 설정
SET-ACL은 액세스 컨트롤을 설정하는 명령으로 만들어진 권한 오브젝트(ACL)를 파일에 할당해준다.
SET-ACL -Path "FILEPATH" -AclObject $ACL
예제
FILEPATH라는 경로의 파일에 DOMAIN\USERNAME 유저가 FullControl할 수 있도록 하는 스크립트를 만들어보면 다음과 같다.
$ACL = Get-ACL -Path "FILEPATH"$AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($domainUserName,"FullControl","ContainerInherit,ObjectInherit","None","Allow")$ACL.SetAccessRule($AccessRule)$ACL | Set-Acl -Path "FILEPATH"
참조
[1] https://petri.com/how-to-use-powershell-to-manage-folder-permissions [2] https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.security/get-acl?view=powershell-7.1 [3] https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.security/set-acl?view=powershell-7.1