[PowerShell] 사용자에게 폴더 권한(읽기/쓰기 등) 부여

개요

파워쉘로 파일(or 폴더)의 사용자 권한을 부여하려면 어떻게 해야할까?

파일과 권한

NTFS 파일 권한의 종류

NTFS 파일(과 폴더) 기준으로 정의된 권한은 아래 enum에 정의되어 있으며,

[System.Enum]::GetNames([System.Security.AccessControl.FileSystemRights])

확인하면 아래와 같이 권한을 보여준다.

PS C:\workspace> [System.Enum]::GetNAmes([System.Security.AccessControl.FileSystemRights])
ListDirectory
ReadData
WriteData
CreateFiles
CreateDirectories
AppendData
ReadExtendedAttributes
WriteExtendedAttributes
Traverse
ExecuteFile
DeleteSubdirectoriesAndFiles
ReadAttributes
WriteAttributes
Write
Delete
ReadPermissions
Read
ReadAndExecute
Modify
ChangePermissions
TakeOwnership
Synchronize
FullControl

이름을 보면 얼추 어떤 권한인지 확인할 수 있다. 냅다 FullControl을 사용하면 안된다.

GET-ACL - 권한 확인

파일의 권한을 확인한다.

PS C:\workspace\shell> get-acl -path "folderpath"
디렉터리: C:\workspace
Path 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