Gerenciar Permissões NTFS com PowerShell: Um Tutorial

Se você é um profissional de TI e encontra dificuldades em definir permissões de sistema de arquivos para sua organização, você está com sorte. Gerenciar permissões NTFS usando uma GUI é demorado, especialmente quando se trabalha com muitos usuários ou grupos. Felizmente, temos o PowerShell para tornar tudo melhor. Como? O módulo Microsoft.PowerShell.Security.

O PowerShell possui dois cmdlets especificamente para trabalhar com ACLs chamados Get-ACL e Set-ACL. Esses dois cmdlets podem recuperar e atribuir qualquer número de permissões NTFS, o que você aprenderá tudo sobre neste tutorial. Se você quer se tornar mais eficiente e imediatamente útil na gestão de permissões NTFS, continue lendo.

Sem tempo para ler? Não tem problema! Assista a este vídeo complementar de TechSnips.io de Anthony Howell abaixo:

Gerencie e Reporte o Active Directory, Exchange e Microsoft 365 com ManageEngine ADManager Plus. Baixe a Versão de Teste Gratuita!

Pré-requisitos

Para seguir com os exemplos neste tutorial, você precisa de:

Criando Arquivos/Pastas para Testar

Este tutorial será construído em torno de um simples “laboratório” ou uma única pasta. Você aprenderá a trabalhar com permissões NTFS no PowerShell do zero; não é necessário nenhum trabalho extra da sua parte.

  1. Para começar, abra uma sessão do PowerShell como Administrador.
  2. Crie uma pasta vazia chamada Share em algum lugar no seu sistema de arquivos. Nos exemplos a seguir, vamos supor que essa pasta esteja localizada em C:\Share. Isso manterá os exemplos mais curtos e fáceis de seguir. Você pode criar este diretório copiando o código abaixo:
New-Item -ItemType Directory -Path 'C:\Share'

3. Crie uma pasta chamada C:\Share\Assets.

New-Item -ItemType Directory -Path 'C:\Share\Assets'

4. Crie um arquivo chamado client_list.txt na pasta C:\Share.

New-Item -ItemType File -Path 'C:\Share\Client_list.txt'

5. Crie um arquivo chamado client_projects.txt na pasta C:\Share.

New-Item -ItemType File -Path 'C:\Share\Client_projects.txt'

6. Em seguida, atribua uma variável para o caminho da pasta Share. Criar variáveis reduz a digitação e torna o caminho mais fácil de reutilizar. Supondo que você esteja usando C:\Share, copie o seguinte exemplo de código na sua sessão do PowerShell:

$dir = 'C:\Share'

7. Pressione Enter. Agora você tem um diretório vazio e salvou esse caminho como uma variável.

Visualizando Permissões NTFS Com Get-Acl

O PowerShell permite que você visualize rapidamente as permissões NTFS usando o cmdlet Get-Acl. Nas seções seguintes, você aprenderá como usar o cmdlet para visualizar as permissões NTFS para um arquivo ou pasta.

Uma lista de controle de acesso (ACL é uma lista de entradas de controle de acesso (ACE). Cada ACE em uma ACL identifica um trustee e especifica os direitos de acesso permitidos, negados ou auditados. O descritor de segurança para um objeto securável pode conter dois tipos de ACLs: uma DACL e uma SACL.

Exibindo Permissões do NTFS

Tradicionalmente, você pode visualizar uma ACL clicando com o botão direito na pasta C:\Share, clicando em Propriedades, selecionando a guia Segurança e clicando no botão Avançado. Você pode ver um exemplo de como a GUI exibe as permissões abaixo.

Access Control List using Advanced Security Settings for Share

O exemplo acima possui algumas entradas de permissão numeradas. Observe-as cuidadosamente, pois você verá a comparação posteriormente nesta seção.

Usando o diretório que você criou anteriormente, exiba as permissões NTFS atuais para o diretório usando Get-Acl.

Get-Acl -Path $dir

Agora você deve ver o caminho, proprietário e detalhes do nível de acesso na captura de tela a seguir.

Access Control List

A propriedade Access mostrada na captura de tela acima contém informações adicionais sobre o ACL, mas ela rola para fora da tela conforme mostrado pelos três pontos no final de FullControl acima. Existe uma maneira melhor de visualizar essa propriedade, colocando o comando anterior entre parênteses para visualizar as propriedades do objeto Access. Procure apenas pela propriedade Access neste objeto executando o código abaixo.

(Get-Acl -Path $dir).Access

O comando acima também pode ser expresso usando o objeto Access e o parâmetro -ExpandProperties: Get-Acl -Path $dir | Select-Object -ExpandProperty Access

Conforme mostrado na captura de tela a seguir, a saída é formatada para facilitar a visualização das propriedades individuais do Access:

Access Control Entities

Visualizar as propriedades de acesso da maneira acima pode fazer com que a saída do terminal role pela tela rapidamente se você tiver muitas Entidades de Controle de Acesso (ACE). Cada entidade contém propriedades FileSystemRights, AccessControlType, IdentityReference, IsInherited, InheritenceFlags e PropagationFlags. Para tornar tudo isso um pouco mais legível, encaminhe os objetos para Format-Table -AutoSize. Execute o seguinte comando.

(Get-Acl -Path $dir).Access | Format-Table -AutoSize

Como você pode ver na captura de tela abaixo, as propriedades de acesso ficam mais limpas e organizadas ao usar Format-Table -AutoSize:

Cleaner output when piping to Format-Table

Examine as propriedades e o número da coluna. Note que essas são as mesmas propriedades que você viu na GUI no início do tutorial.

Access Control List using Advanced Security Settings for Share

Filtrando Objetos de Acesso

Existem momentos em que você vai querer ser mais preciso ao descobrir permissões NTFS. Para fazer isso, você pode filtrar um ACE específico ou encontrar resultados particulares que tenham permissões NTFS herdadas ou explícitas dentro de uma ACL usando o PowerShell. Em vez de rolar a janela do terminal com os olhos linha por linha, você pode usar o cmdlet Where-Object para fazer alguns filtros.

O exemplo de código abaixo filtra objetos que não herdam permissões NTFS. Isso é feito usando Where-Object com o operando -Not olhando para o objeto atual no pipeline $_. membro da propriedade do objeto IsInherited, que indica se o ACE é o resultado de herança e não é definido explicitamente:

(Get-Acl -Path $dir).Access | Where-Object {$_.IsInherited -eq $true} | Format-Table -AutoSize

Lembre-se de encaminhar objetos para Format-Table -AutoSize ou a saída irá rolar para baixo na tela. Faça disso um novo hábito; você vai me agradecer depois!

Usando o código abaixo, substitua 'NOMEDOUSUÁRIO' por outro nome de usuário para ver resultados específicos:

(Get-Acl -Path $dir).Access | Where-Object {$_.IdentityReference -like 'USERNAME'} | Format-Table -AutoSize

Abaixo está um exemplo de como os resultados poderiam parecer:

Sample output from the filtering

O exemplo acima mostra todos os ACEs em que a propriedade IdentityReference é o usuário ou grupo de segurança que possui permissões atribuídas.

Vá em frente e pratique o que aprendeu até agora sobre Get-Acl. Examine diferentes arquivos e pastas em seu sistema. Isso ajudará você a ver muitos descritores de segurança diferentes para contextos diversos. Também ajudará a construir alguma memória muscular.

Vamos elevar um pouco as coisas e atribuir permissões NTFS.

Modificando Permissões NTFS Com Set-Acl

Agora que você pode visualizar as permissões NTFS, é hora de atribuir e modificar as permissões NTFS usando o PowerShell. O cmdlet Set-Acl torna isso possível. As seções a seguir demonstrarão como usar este cmdlet em conjunto com Get-Acl para copiar, modificar herança e remover permissões NTFS de um arquivo ou pasta.

Copiando Permissões NTFS

Você pode ter um arquivo ou pasta que contenha o nível apropriado de permissões NTFS que você precisa usar para um novo ACL. Você pode economizar tempo copiando permissões de um arquivo ou pasta para outro.

Copiar ACLs/ACEs existentes pode reduzir erros humanos ao configurar permissões NTFS, assumindo que o descritor de segurança que você está copiando está correto e apropriado para o destino em primeiro lugar. Como diz o ditado, “Com grande poder, vem grande responsabilidade.”. Mantenha isso em mente.

Considere a seguinte captura de tela. Aqui você está dando uma olhada no ACL de um arquivo em C:\Share chamado Client_List.txt. O ACL tem o nível correto de permissões NTFS que você deseja:

Client list with appropriate NTFS permissions for Bill, the new employee.

Agora, considere a próxima captura de tela. Desta vez, você está dando uma olhada no ACL de outro arquivo em C:\Share chamado Client_Projects.txt. Este arquivo não possui as permissões NTFS que você deseja:

Client Projects with no access for Bill.

Você precisa copiar as permissões NTFS de Client_List.txt para Client_Projects.txt. Como você pode fazer isso? Você irá modificar as permissões obtendo o ACL de Client_List.txt e então usando o cmdlet Set-Acl com o parâmetro -AclObject. Quando você executa o código abaixo, o ACL inteiro de Client_List.txt é copiado para Client_Projects.txt :

# Copiar Descrições de Segurança de Client_list.txt para Client_Projects.txt
$Acl = Get-Acl -Path 'C:\Share\Client_list.txt'
Set-Acl -AclObject $Acl -Path 'C:\Share\Client_Projects.txt'

Como você pode ver na captura de tela numerada abaixo, o arquivo Client_Projects.txt agora possui os mesmos descritores de segurança que Client_list.txt.

  1. Obtenha um ACL existente de um arquivo existente.
  2. Defina o objeto ACL copiado para o arquivo ou pasta.
  3. Verifique se o ACL foi copiado corretamente para o arquivo ou pasta.
NTFS Permissions Copied

Agora você vê que o ACL é idêntico para o arquivo Client_Projects.txt como o arquivo Client_List.txt na coluna IdentityReference com AccessControlType definido como Allow. Você usa a mesma técnica para atribuir permissões NTFS para pastas também.

Adicionando Permissões NTFS

Na última seção, você copiou as permissões NTFS existentes de um objeto de arquivo para outro. Desta vez, você vai criar permissões NTFS do zero. Isso permitirá que você atribua permissões NTFS que serão designadas a um arquivo ou pasta.

Primeiro, comece atribuindo algumas variáveis para usar na criação de um novo objeto usado por Set-Acl. Fazer dessa maneira torna um pouco mais fácil quando chegar a hora de executar o comando. O código abaixo constrói as propriedades de um ACE que se tornará as permissões NTFS atribuídas a um arquivo ou pasta:

# Criar o ACE
$identity = 'domain\user'
$rights = 'FullControl' # Outras opções: [enum]::GetValues('System.Security.AccessControl.FileSystemRights')
$inheritance = 'ContainerInherit, ObjectInherit' # Outras opções: [enum]::GetValues('System.Security.AccessControl.Inheritance')
$propagation = 'None' # Outras opções: [enum]::GetValues('System.Security.AccessControl.PropagationFlags')
$type = 'Allow' # Outras opções: [enum]::GetValues('System.Security.AccessControl.AccessControlType')
$ACE = New-Object System.Security.AccessControl.FileSystemAccessRule($identity,$rights,$inheritance,$propagation, $type)

Em seguida, atribua mais uma variável que obterá a ACL inicial para a pasta Assets. Depois, usando o membro do tipo método AddAccessRule, adicione uma regra de acesso usando a variável $ACE:

$Acl = Get-Acl -Path "$dir\Assets"
$Acl.AddAccessRule($ACE)

Agora você está pronto para adicionar o ACE recém-criado à ACL de C:\Share\Assets. Agora use Set-Acl para aplicar este novo ACE ao diretório apropriado:

Set-Acl -Path "$dir\Assets" -AclObject $Acl

Em seguida, verifique se o usuário que você escolheu tem as permissões para visualizar o diretório necessário usando o código abaixo:

(Get-Acl -Path "$dir\Assets").Access | Format-Table -Autosize

Removendo permissões NTFS

Haverá um momento em que você precisará remover permissões NTFS de um recurso.

Para remover permissões NTFS, comece obtendo a ACL atual do arquivo ou pasta. Neste exemplo, o arquivo é Client_Projects.txt:

$Acl = Get-Acl -Path "$dir\Client_Projects.txt"

Agora filtre a ACE específica que deseja remover. Você faz isso chamando os objetos membros $Acl e redirecionando esses resultados para Where-Object e alguns operadores:

$Ace = $Acl.Access | Where-Object {($_.IdentityReference -eq 'domain\user') -and -not ($_.IsInherited)}

Em seguida, use a variável $Acl que contém os descritores de segurança da ACL atual, chame o método RemoveAccessRule e passe o objeto ACE criado acima usando o cmdlet New-Object para o método RemoveAccessRule(). Isso removerá a entrada:

$Acl.RemoveAccessRule($Ace)

É importante lembrar que você modificou uma ACL existente aqui e ainda não confirmou as alterações.

Agora, para fazer com que essas alterações sejam permanentes, execute o cmdlet Set-Acl, fornecendo os parâmetros -Path e -AclObject com os valores apropriados de "$dir\Client_Projects.txt" e $Acl. Após digitar o comando abaixo, pressione Enter:

Set-Acl -Path "$dir\Client_Projects.txt" -AclObject $Acl

Gerencie e Relate o Active Directory, Exchange e Microsoft 365 com o ManageEngine ADManager Plus. Baixe a avaliação gratuita!

Resumo

Neste artigo, você aprendeu sobre como gerenciar permissões NTFS com o PowerShell. Você conheceu os dois cmdlets, Get-Acl e Set-Acl, e o que eles fazem com as permissões NTFS.

Você também aprendeu como usar filtros para direcionar um ACE específico em uma ACL para uso nos cmdlets mencionados. Com um pouco de prática, você poderá gerenciar solicitações de permissão NTFS mais facilmente do que nunca.

Leitura adicional

Source:
https://adamtheautomator.com/ntfs-permissions/