Guias e Tutoriais

Antes de liberar uma pasta para um agente de IA: faça um inventário local

Ilustração editorial de uma pasta sendo inventariada, com arquivos ocultos, um link externo e uma barreira humana antes de um núcleo de IA

Conceder acesso a uma pasta inteira parece mais simples do que selecionar arquivos, mas o alcance real pode ser bem maior do que o nome da pasta sugere. Arquivos ocultos, caches, bancos locais, cópias antigas, chaves, links e junctions podem colocar dados fora da tarefa ao alcance de uma ferramenta. Este guia mostra como criar um inventário somente de leitura no Windows, revisar os pontos de atenção e montar uma pasta de trabalho mínima antes de autorizar um agente de IA.

O procedimento usa PowerShell 7 e não abre o conteúdo dos arquivos. Ele lista nomes, caminhos relativos, extensões, tamanhos, datas, atributos e destinos de links quando o sistema os informa. Isso reduz a exposição durante a triagem, mas o próprio inventário ainda pode revelar nomes de clientes, projetos e sistemas. Guarde-o no mesmo nível de proteção dos arquivos originais.

Resultado esperado

Ao final, você terá quatro evidências: uma contagem de arquivos e bytes, um resumo por extensão, uma lista de itens ocultos ou de sistema e uma relação de links ou pontos de nova análise. Também terá uma pasta separada, contendo somente os arquivos aprovados para a tarefa. O original permanece no lugar e nenhuma permissão é alterada por este roteiro.

A decisão final deve ser explícita: escopo aprovado, quando a pasta separada contém apenas o necessário; revisão pendente, quando nomes, links ou permissões exigem confirmação; ou não conceder acesso, quando não é possível delimitar o alcance com segurança.

Pré-requisitos

  • Windows com PowerShell 7 disponível.
  • Permissão legítima para listar a pasta e examinar suas permissões.
  • Um caminho de saída fora da pasta que será analisada pelo agente.
  • Espaço suficiente para criar uma cópia reduzida dos arquivos aprovados.
  • Uma finalidade clara, como revisar três documentos, ajustar um script ou resumir um conjunto definido de relatórios.

Os exemplos usam C:\Trabalho\Projeto. Substitua esse caminho por uma pasta de teste antes de aplicar o método a material real. Use sempre -LiteralPath para que caracteres como colchetes não sejam interpretados como curingas. A documentação do Get-ChildItem no Microsoft Learn explica a diferença e os parâmetros de profundidade, recursão e inclusão de itens ocultos.

Passo 1: defina a finalidade e o limite

Antes do comando, escreva uma frase que descreva a tarefa. Um limite bom seria: “o agente pode ler quatro arquivos Markdown da documentação e criar um resumo em outra pasta”. “Pode acessar o projeto” não é um limite, porque não diz quais entradas são necessárias, onde a saída será gravada nem se mudanças são permitidas.

Registre também o tipo de acesso. Ler, criar uma nova saída, alterar arquivos existentes e executar comandos são capacidades diferentes. Este guia trata da seleção de arquivos para leitura. Ele não concede autorização para executar conteúdo, instalar dependências, acessar rede, modificar o original ou seguir links para outros locais.

Passo 2: valide o caminho sem usar curingas

$pasta = 'C:\Trabalho\Projeto'

if (-not (Test-Path -LiteralPath $pasta -PathType Container)) {
    throw 'A pasta informada não existe ou não é um diretório.'
}

$raiz = (Resolve-Path -LiteralPath $pasta).Path
$raiz

O resultado esperado é um caminho absoluto. Pare se ele apontar para uma raiz ampla, como o perfil inteiro do usuário, a unidade C:\, uma pasta sincronizada completa ou um compartilhamento corporativo. O escopo deve começar no menor diretório que contém o material da tarefa.

Não monte o caminho concatenando texto recebido de uma conversa. Digite ou selecione o destino conscientemente. Uma pasta com nome parecido não é necessariamente a pasta correta, especialmente em áreas sincronizadas ou cópias antigas.

Passo 3: liste tudo, inclusive itens ocultos

$itens = Get-ChildItem -LiteralPath $raiz -Force -Recurse -ErrorAction Stop
$arquivos = $itens | Where-Object { -not $_.PSIsContainer }
$pastas = $itens | Where-Object { $_.PSIsContainer }

[pscustomobject]@{
    Pastas   = $pastas.Count
    Arquivos = $arquivos.Count
}

O parâmetro -Force é importante porque o comportamento padrão não mostra itens ocultos. A página oficial about_FileSystem_Provider documenta os atributos e as propriedades adicionais apresentadas pelo provedor de arquivos, incluindo indicadores de links.

-ErrorAction Stop evita que uma falha de acesso passe despercebida no meio da enumeração. Se o comando parar por permissão negada, o inventário está incompleto. Não conclua que a pasta é segura com base em uma lista parcial. Registre o bloqueio e peça ao responsável pelo dado que delimite outra origem.

Passo 4: meça volume e encontre arquivos grandes

$medida = $arquivos | Measure-Object -Property Length -Sum

[pscustomobject]@{
    Arquivos = $medida.Count
    Bytes    = [int64]$medida.Sum
    GiB      = [math]::Round($medida.Sum / 1GB, 3)
}

$arquivos |
    Sort-Object Length -Descending |
    Select-Object -First 20 FullName, Length, LastWriteTime

O Measure-Object calcula contagem e soma das propriedades numéricas. O tamanho ajuda a perceber dumps, vídeos, modelos, arquivos de banco e backups que não deveriam entrar por acidente. Ele não prevê custo, limite de contexto ou tempo de processamento de uma ferramenta específica.

Um arquivo pequeno também pode ser sensível. Tamanho é um sinal operacional, não uma classificação de segurança. Chaves privadas, tokens e arquivos de configuração costumam ocupar poucos quilobytes.

Passo 5: resuma extensões sem abrir o conteúdo

$arquivos |
    Group-Object {
        if ([string]::IsNullOrWhiteSpace($_.Extension)) {
            '[sem extensão]'
        } else {
            $_.Extension.ToLowerInvariant()
        }
    } |
    Sort-Object Count -Descending |
    Select-Object Count, Name

O resumo mostra a mistura real da pasta. Um diretório descrito como “documentação” pode conter .zip, .sqlite, .pfx, .env, imagens ou arquivos sem extensão. Não deduza o conteúdo somente pela extensão, mas use a lista para decidir o que precisa de inspeção adicional.

Se houver arquivos de formato desconhecido, não os execute nem os envie só para descobrir o que são. O Guia Extensão não basta: como verificar o tipo real de um arquivo apresenta uma triagem separada por assinatura e contêiner.

Passo 6: destaque nomes que exigem revisão

$nomesRevisao = @(
    '.env', '.env.local', '.npmrc', '.pypirc',
    'id_rsa', 'id_ed25519', 'credentials.json'
)

$extensoesRevisao = @(
    '.pem', '.key', '.pfx', '.p12', '.kdbx',
    '.sqlite', '.sqlite3', '.db', '.bak', '.zip', '.7z'
)

$arquivos |
    Where-Object {
        $nomesRevisao -contains $_.Name.ToLowerInvariant() -or
        $extensoesRevisao -contains $_.Extension.ToLowerInvariant()
    } |
    Select-Object FullName, Length, LastWriteTime

Essa lista não é um detector de segredos. Ela só cria uma fila de revisão. Um segredo pode estar em qualquer arquivo, e um .zip pode ser perfeitamente legítimo. A decisão depende da finalidade, da propriedade do material e da política da organização.

Se o projeto usa Git, não trate .gitignore como controle de acesso. A documentação oficial de gitignore diz que o arquivo especifica itens não rastreados que o Git deve ignorar. Isso não impede outro programa, processo ou agente de ler o arquivo existente no disco.

Passo 7: localize arquivos ocultos e de sistema

$itens |
    Where-Object {
        ($_.Attributes -band [IO.FileAttributes]::Hidden) -or
        ($_.Attributes -band [IO.FileAttributes]::System)
    } |
    Select-Object FullName, PSIsContainer, Attributes, Length

Itens ocultos podem incluir configuração, cache, histórico, metadados do editor ou arquivos de sincronização. O atributo não significa que o conteúdo é malicioso ou confidencial, mas mostra que uma inspeção visual comum no Explorador pode não ter revelado tudo.

Revise também diretórios como .git, .vscode, .idea, caches de ferramentas e pastas de dependências. Eles podem ampliar muito o volume e revelar histórico, caminhos locais, URLs internas ou configurações que não participam da tarefa.

Passo 8: identifique links, junctions e pontos de nova análise

$links = $itens |
    Where-Object {
        $_.Attributes -band [IO.FileAttributes]::ReparsePoint
    } |
    Select-Object FullName, LinkType, LinkTarget, Attributes

$links

No NTFS, links simbólicos, junctions e outros pontos de nova análise podem redirecionar o acesso. O provedor de arquivos do PowerShell expõe propriedades como LinkType e LinkTarget quando disponíveis. O material técnico da Microsoft sobre reparse points explica que esses itens carregam dados interpretados pelo sistema de arquivos ou por filtros.

Hard links não são pontos de nova análise e, por isso, não aparecem nesse filtro. Detectá-los de forma abrangente exige uma verificação separada. O objetivo deste passo é impedir que um redirecionamento visível por atributos seja aceito sem revisão, não certificar que todos os vínculos possíveis foram encontrados.

A pergunta prática é simples: o destino continua dentro do limite aprovado? Não siga, copie ou autorize um link até confirmar o destino. Se o valor estiver vazio ou inconclusivo, trate o item como revisão pendente. Uma árvore que parece pequena pode apontar para outro volume, pasta compartilhada ou diretório com propriedade diferente.

Passo 9: confira quem já tem acesso à pasta

$acl = Get-Acl -LiteralPath $raiz

[pscustomobject]@{
    Caminho = $raiz
    Dono    = $acl.Owner
}

$acl.Access |
    Select-Object IdentityReference, FileSystemRights, AccessControlType, IsInherited

O Get-Acl lê o descritor de segurança e as listas de controle de acesso. O comando acima não muda permissões. Ele ajuda a perceber se o diretório já tem acesso mais amplo do que o esperado.

Não altere ACLs durante uma triagem editorial. Herança, grupos, compartilhamentos e sincronização podem tornar a mudança mais ampla do que parece. Se a pasta precisa de outra política de acesso, encaminhe a decisão ao responsável pelo armazenamento ou à equipe de segurança.

Passo 10: exporte um inventário com caminhos relativos

$saida = 'C:\Trabalho\inventario-projeto.csv'

$inventario = $arquivos | ForEach-Object {
    [pscustomobject]@{
        CaminhoRelativo = [IO.Path]::GetRelativePath($raiz, $_.FullName)
        Extensao        = $_.Extension.ToLowerInvariant()
        Bytes           = $_.Length
        ModificadoEm    = $_.LastWriteTimeUtc.ToString('o')
        Atributos       = $_.Attributes.ToString()
    }
}

$inventario |
    Export-Csv -LiteralPath $saida -NoTypeInformation -Encoding utf8NoBOM

Grave a saída fora da pasta candidata, para que o relatório não vire mais um arquivo acessível ao agente. O Export-Csv preserva as propriedades selecionadas como colunas. Evite usar Format-Table antes da exportação, pois objetos formatados não representam os dados originais.

O inventário não contém o texto dos arquivos, mas os nomes podem revelar clientes, sistemas, incidentes, pessoas e assuntos. Se precisar compartilhar o relatório, reduza ou substitua nomes sensíveis antes. Não cole a lista inteira em um chat só porque ela foi gerada localmente.

Passo 11: monte uma pasta de escopo separada

Crie manualmente um diretório novo fora do original, por exemplo C:\Trabalho\Escopo-IA. Copie somente os arquivos aprovados, preservando o original. Não copie a árvore completa para depois excluir itens, porque caches, ocultos e links podem escapar da revisão inicial.

Abra a nova pasta e repita os Passos 2 a 8. A contagem final deve corresponder à lista aprovada. Se a tarefa precisa de três documentos, o resultado esperado não é uma pasta com centenas de arquivos e regras de exclusão. É uma pasta com aqueles três documentos, nomes claros e nenhum link não explicado.

Defina uma pasta de saída diferente quando a ferramenta permitir. Assim, fica mais fácil revisar o que foi criado sem misturar resultado e fonte. O Guia Como revisar permissões antes de conectar agentes de IA ajuda a separar leitura, escrita, execução e rede.

Passo 12: faça um primeiro uso controlado

Comece com uma instrução limitada: peça ao agente para listar os nomes dos arquivos que consegue ver e descrever o plano, sem abrir conteúdo, executar comandos ou criar saídas. Compare a resposta com o inventário aprovado. Se aparecer um caminho fora do escopo, pare e revise a configuração.

Depois, autorize a menor tarefa útil, usando um arquivo sem dados críticos. Confirme onde a saída foi gravada e quais ferramentas foram acionadas. Só amplie o conjunto quando o comportamento observado corresponder ao limite documentado.

Erros comuns

  • Listar sem -Force: o inventário omite itens ocultos.
  • Usar uma pasta ampla: a tarefa recebe mais contexto do que precisa.
  • Confiar no .gitignore: ele orienta o Git, não bloqueia leitura por outros processos.
  • Ignorar links: o destino pode ficar fora da árvore visualizada.
  • Gravar o CSV dentro do escopo: o relatório passa a ser mais um item exposto.
  • Confundir nome de arquivo com classificação: extensões e nomes só sinalizam revisão.
  • Alterar permissões durante a triagem: uma mudança de ACL pode afetar usuários e heranças.
  • Autorizar execução para uma tarefa de leitura: a capacidade concedida excede a finalidade.

Solução de problemas

Acesso negado durante a recursão: não use -ErrorAction SilentlyContinue para esconder a falha. O resultado seria parcial. Reduza o escopo ou peça ao proprietário uma pasta de exportação aprovada.

O inventário demora ou consome muita memória: comece com -Depth 2 para entender a estrutura, mas não trate essa primeira visão como inventário completo. Depois, enumere separadamente somente as subpastas candidatas. A documentação do Get-ChildItem registra que -Depth limita os níveis percorridos.

LinkTarget aparece vazio: não presuma que o item é comum. Registre o caminho, o tipo exibido e encaminhe a revisão. Alguns tipos e sistemas de arquivos não expõem todas as propriedades da mesma forma.

O agente vê arquivos que não estão na pasta reduzida: confira a raiz configurada, diretórios de trabalho herdados, volumes montados, integrações, conectores e permissões da sessão. Interrompa o uso até entender a origem do acesso adicional.

O que este inventário não garante

Listar metadados não prova que os arquivos são seguros, corretos ou livres de segredos. Também não revela automaticamente conteúdo incorporado, versões anteriores, dados dentro de bancos, arquivos compactados ou informações recuperáveis por outra ferramenta. O método reduz o escopo e torna a decisão verificável, mas não substitui classificação da informação, política de retenção, análise jurídica ou avaliação de segurança.

A pasta separada também não controla o que o provedor de IA faz com entradas e saídas. Antes do uso real, confirme conta, contrato, retenção, localização, treinamento, compartilhamento e acesso administrativo conforme as regras da organização. Quando houver dados pessoais, sigilosos ou regulados, envolva os responsáveis antes do envio.

Checklist antes de conceder acesso

  • A finalidade e o tipo de acesso foram escritos em uma frase?
  • O caminho absoluto aponta para o menor diretório necessário?
  • O inventário incluiu itens ocultos e parou diante de erros?
  • Contagem, volume, extensões e arquivos grandes foram revisados?
  • Nomes sensíveis, bancos, chaves, compactados e backups foram triados?
  • Links, junctions e pontos de nova análise têm destino conhecido?
  • O inventário CSV ficou fora da pasta candidata?
  • A pasta de escopo contém somente os arquivos aprovados?
  • Leitura, escrita, execução e rede foram tratadas como permissões distintas?
  • O primeiro teste confirmou exatamente o alcance esperado?

Fontes consultadas

RADAR BASTIDORES

IA muda rápido. Critério não.

Estamos preparando uma seleção editorial de novidades, ferramentas e guias que realmente merecem atenção.

Escolha apenas o canal pelo qual deseja receber novidades. Nome e demais campos são opcionais.

Os dados ficam privados no WordPress e não são vendidos. Informe ao menos e-mail, celular ou rede social.