Gerenciar Permissões NTFS com PowerShell: Um Tutorial

Se você é um profissional de TI e está enfrentando dificuldades para configurar permissões no sistema de arquivos para suas organizações, está com sorte. Gerenciar permissões NTFS usando uma interface gráfica é demorado, especialmente ao lidar com muitos usuários ou grupos. Felizmente, temos o PowerShell para tornar tudo mais fácil. Como? O módulo Microsoft.PowerShell.Security.

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

Sem tempo para ler? Sem problemas! Assista a este vídeo complementar de TechSnips.io com Anthony Howell abaixo:

Gerencie e Relate o Active Directory, Exchange e o Microsoft 365 com o ManageEngine ADManager Plus. Faça o Download da Avaliação Gratuita!

Pré-requisitos

Para acompanhar os exemplos deste tutorial, você precisa de:

Criando Arquivos/Pastas para Testar

Este tutorial será construído em torno de um “laboratório” simples, ou seja, uma única pasta. Você aprenderá a trabalhar com permissões NTFS no PowerShell desde o início; 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 Compartilhamento em algum lugar do seu sistema de arquivos. Nos exemplos a seguir, vamos assumir que a pasta está localizada em C:\Compartilhamento. Isso tornará os exemplos mais curtos e fáceis de seguir. Você pode criar esse diretório copiando o código abaixo:
New-Item -ItemType Directory -Path 'C:\Share'

3. Crie uma pasta chamada C:\Compartilhamento\Ativos.

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

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

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

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

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

6. Em seguida, atribua uma variável para o caminho da pasta Compartilhamento. Criar variáveis reduz a digitação e facilita o reuso do caminho. Supondo que você esteja usando C:\Compartilhamento, copie o seguinte exemplo de código para a 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 visualizar rapidamente as permissões NTFS usando o cmdlet Get-Acl. Nas seções a seguir, você aprenderá como usar o cmdlet para visualizar as permissões NTFS de 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.

Exibição de Permissões NTFS

Tradicionalmente, você veria uma ACL clicando com o botão direito na pasta C:\Compartilhamento, 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 e propriedades numeradas. Examine-as de perto, 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ê deverá 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. Há uma maneira melhor de visualizar esta propriedade, envolvendo o comando anterior em parênteses para visualizar as Access propriedades do objeto. 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 é agrupada para facilitar a visualização das propriedades individuais de Access:

Access Control Entities

Visualizar 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 FileSystemRights, AccessControlType, IdentityReference, IsInherited, InheritenceFlags e PropagationFlags properties. 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 são 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

Às vezes, você desejará ser mais preciso ao descobrir permissões NTFS. Para fazer isso, você pode filtrar um ACE específico ou encontrar resultados específicos 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 alguma filtragem.

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 $_. propriedade do objeto membro de 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 vai rolar pela tela. Faça disso um hábito; você vai me agradecer depois!

Usando o código abaixo, substitua 'NOMEDEUSUÁ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 ser:

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 atribuído às permissões.

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. Isso também ajudará a construir alguma memória muscular.

Vamos intensificar 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 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.

A cópia de ACLs/ACEs existentes pode reduzir erros humanos ao configurar permissões NTFS, desde que o descritor de segurança que você está copiando seja 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 tem 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 utilizando o cmdlet Set-Acl com o parâmetro -AclObject. Quando você executar o código abaixo, o ACL inteiro de Client_List.txt será copiado para Client_Projects.txt :

# Copiar Descritores 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 tem 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

Você vê agora 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 para um arquivo ou pasta.

Primeiro, comece atribuindo algumas variáveis para usar na criação de um novo objeto usado por Set-Acl. Fazê-lo 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ão 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.Securit y.AccessControl.AccessControlType')
$ACE = New-Object System.Security.AccessControl.FileSystemAccessRule($identity,$rights,$inheritance,$propagation, $type)

Em seguida, atribua mais uma variável que obterá o ACL inicial para a pasta Assets. Em seguida, usando o método membro 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 ao ACL de C:\Share\Assets. Agora, use Set-Acl para aplicar este novo ACE ao diretório correto:

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

Em seguida, verifique se o usuário que você escolheu tem 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á momentos em que será necessário remover as permissões NTFS de um recurso.

Para remover as 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 para o ACE específico que deseja remover. Faça isso chamando os objetos membros $Acl e encaminhando esses resultados para Where-Object e alguns operandos:

$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 ACL atuais, 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 aplicou as alterações.

Agora, para manter essas alterações, 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 inserir 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 PowerShell. Você aprendeu sobre 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 um ACL para uso nos cmdlets acima. Com um pouco de prática, você gerenciará facilmente mais solicitações de permissão NTFS do que nunca.

Leitura adicional

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