Bem-vindo a esta aula sobre usuários e permissões no Windows! Aqui você vai entender como o sistema operacional controla o acesso a recursos, como arquivos e pastas, e como o PowerShell pode ser usado para gerenciar contas locais e permissões de forma eficiente. Este é um tema fundamental para administradores de sistemas e para quem deseja automatizar tarefas de segurança.

Vamos explorar desde os conceitos de contas locais até a manipulação de ACLs (Access Control Lists), passando por exemplos práticos e cuidados importantes. Ao final, você terá uma base sólida para administrar permissões com segurança e precisão.

Contas locais

Contas locais são usuários e grupos definidos no próprio computador, utilizados para autenticação e autorização em sistemas que não pertencem a um domínio. No Windows, essas contas são armazenadas no SAM (Security Account Manager) e podem ser gerenciadas por meio de ferramentas gráficas ou via PowerShell.

Com o PowerShell, podemos listar, criar, modificar e remover contas locais usando os cmdlets do módulo Microsoft.PowerShell.LocalAccounts (disponível no Windows 10/11 e Windows Server 2016+). Vamos ver alguns exemplos:

# Listar todos os usuários locais
Get-LocalUser

# Listar todos os grupos locais
Get-LocalGroup

# Criar um novo usuário
New-LocalUser -Name "novo_usuario" -Password (ConvertTo-SecureString "SenhaForte!123" -AsPlainText -Force) -FullName "Novo Usuário" -Description "Conta criada para teste"

# Adicionar um usuário a um grupo
Add-LocalGroupMember -Group "Administradores" -Member "novo_usuario"

# Remover um usuário
Remove-LocalUser -Name "novo_usuario"

É importante notar que a criação de usuários exige privilégios de administrador. Além disso, o cmdlet New-LocalUser exige que a senha seja fornecida como uma string segura. Você também pode usar Set-LocalUser para alterar propriedades, como a senha ou a descrição.

ACLs (Get-Acl)

ACL (Access Control List) é uma lista de permissões associada a um objeto (arquivo, pasta, chave de registro, etc.) que define quem pode acessá-lo e de que forma. No PowerShell, o cmdlet Get-Acl permite visualizar a ACL de um item, retornando um objeto System.Security.AccessControl.FileSecurity ou similar.

Com Get-Acl, você pode inspecionar as permissões atuais, como listar as regras de acesso (Access Rules) e identificar proprietários. Veja um exemplo:

# Obtém a ACL de um arquivo
$acl = Get-Acl -Path "C:\Exemplo\arquivo.txt"

# Exibe o proprietário
$acl.Owner

# Exibe todas as regras de acesso
$acl.Access | Format-Table IdentityReference, FileSystemRights, AccessControlType, IsInherited -AutoSize

As regras de acesso mostram a identidade (usuário ou grupo), os direitos (como FullControl, Read, Write), o tipo (Allow ou Deny) e se a permissão é herdada. Essas informações são essenciais para auditar e corrigir permissões indevidas.

Para modificar a ACL, utilizamos Set-Acl em conjunto com Get-Acl e métodos como AddAccessRule ou RemoveAccessRule. Isso permite um controle fino sobre permissões, como veremos na próxima seção.

Permissões de arquivo

As permissões de arquivo no Windows são controladas por ACLs, que podem ser herdadas de pastas pai. O PowerShell oferece várias maneiras de gerenciar essas permissões, seja usando cmdlets nativos ou a classe System.Security.AccessControl.

Um dos métodos mais comuns é usar Get-Acl para obter a ACL, modificar as regras e aplicar com Set-Acl. Vamos ver um exemplo de como adicionar uma permissão de leitura para um usuário específico:

# Caminho do arquivo
$path = "C:\Exemplo\arquivo.txt"

# Obter a ACL atual
$acl = Get-Acl -Path $path

# Definir a regra de permissão
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule("DOMINIO\usuario", "Read", "Allow")

# Adicionar a regra à ACL
$acl.AddAccessRule($rule)

# Aplicar a nova ACL
Set-Acl -Path $path -AclObject $acl

Também é possível remover permissões usando RemoveAccessRule ou substituir completamente a ACL com SetAccessRuleProtection para controlar a herança. Para tarefas mais simples, alguns administradores usam icacls (uma ferramenta de linha de comando) invocada do PowerShell, mas os cmdlets nativos são mais integrados.

Outra abordagem é usar o módulo NtfsSecurity (de terceiros) que simplifica a gestão de permissões, mas para fins de aprendizado, os cmdlets nativos são suficientes.

Cuidados

Ao trabalhar com permissões, alguns cuidados são essenciais para evitar problemas de segurança ou indisponibilidade de serviços. Primeiro, sempre teste em um ambiente de desenvolvimento antes de aplicar em produção. Erros de permissão podem bloquear o acesso a arquivos críticos.

Evite conceder permissões excessivas, como FullControl para todos. O princípio do menor privilégio deve ser seguido: dê apenas as permissões necessárias para cada usuário ou grupo. Além disso, tenha cuidado com a herança de permissões: alterar permissões em uma pasta pode afetar todos os subitens.

Outra recomendação é usar grupos em vez de usuários individuais para facilitar a administração. E sempre documente as alterações feitas, para que outros administradores possam entender o que foi modificado e por quê.

Por fim, lembre-se de que a execução de comandos de permissão exige privilégios elevados. Portanto, execute o PowerShell como administrador quando necessário.

Boas práticas

Para finalizar, aqui vão algumas boas práticas ao gerenciar usuários e permissões:

  • Use nomes de usuários e grupos padronizados e significativos.
  • Desative contas que não são mais utilizadas em vez de excluí-las, para preservar auditoria.
  • Revise periodicamente as permissões de arquivos sensíveis.
  • Utilize o PowerShell para automatizar a aplicação de permissões consistentes.
  • Considere usar o Just Enough Administration (JEA) para limitar o que os usuários podem fazer com o PowerShell.

Referências

Exercícios

  1. Liste todos os usuários locais do seu sistema usando PowerShell e exiba apenas os nomes e a descrição.
  2. ✓ Resposta:
    Get-LocalUser | Select-Object Name, Description
  3. Crie um novo usuário local chamado "teste_perm" com a senha "P@ssw0rd" e adicione-o ao grupo "Usuários".
  4. ✓ Resposta:
    $password = ConvertTo-SecureString "P@ssw0rd" -AsPlainText -Force
    New-LocalUser -Name "teste_perm" -Password $password
    Add-LocalGroupMember -Group "Usuários" -Member "teste_perm"
  5. Obtenha a ACL de um arquivo de sua escolha e exiba o proprietário e as regras de acesso em formato de tabela.
  6. ✓ Resposta:
    $acl = Get-Acl -Path "C:\caminho\para\arquivo.txt"
    $acl.Owner
    $acl.Access | Format-Table IdentityReference, FileSystemRights, AccessControlType, IsInherited -AutoSize
  7. Adicione uma permissão de leitura para o usuário "teste_perm" em um arquivo específico (use um caminho fictício).
  8. ✓ Resposta:
    $path = "C:\dados\arquivo.txt"
    $acl = Get-Acl -Path $path
    $rule = New-Object System.Security.AccessControl.FileSystemAccessRule("teste_perm", "Read", "Allow")
    $acl.AddAccessRule($rule)
    Set-Acl -Path $path -AclObject $acl
  9. Explique por que é importante seguir o princípio do menor privilégio ao atribuir permissões e dê um exemplo de como aplicá-lo no PowerShell.
  10. ✓ Resposta: O princípio do menor privilégio reduz riscos de segurança, pois limita o acesso apenas ao necessário. No PowerShell, podemos aplicá-lo concedendo permissões específicas em vez de FullControl, por exemplo:
    $rule = New-Object System.Security.AccessControl.FileSystemAccessRule("usuario", "ReadAndExecute", "Allow")
    Isso permite leitura e execução, mas não escrita, minimizando danos potenciais.