Como conceder permissão aos usuários para um diretório usando a linha de comando no Windows?

277

Como posso conceder permissões para um usuário em um diretório (leitura, gravação, modificação) usando a linha de comando do Windows?

Amitabh
fonte

Respostas:

420

A partir do Vista, caclsestá obsoleta. Aqui estão as duas primeiras linhas de ajuda:

C:\>cacls
NOTE: Cacls is now deprecated, please use Icacls.

Displays or modifies access control lists (ACLs) of files

Você deve usar em seu icaclslugar. É assim que você concede a John controle total sobre a D:\testpasta e todas as suas subpastas:

C:\>icacls "D:\test" /grant John:(OI)(CI)F /T

De acordo com a documentação da MS:

  • F = Controle total
  • CI = Herança de contêiner - esse sinalizador indica que os contêineres subordinados herdarão essa ACE.
  • OI = Herança de objeto - Este sinalizador indica que os arquivos subordinados herdarão o ACE.
  • /T= Aplicar recursivamente aos arquivos e subpastas existentes. ( OIe se CIaplica apenas a novos arquivos e subpastas). Crédito: comentário de @AlexSpence.

Para documentação completa, você pode executar " icacls" sem argumentos ou consulte a documentação da Microsoft aqui e aqui

Călin Darie
fonte
4
Felipe: Os parâmetros (OI) e (CI) tornam isso recursivo #
Chris Miller
22
Eu tive problemas com o acesso negado ao tentar alterar as permissões na interface do usuário do Windows Explorer. Adicionar o sinalizador / T ao final substituiu os objetos existentes e conseguiu resolver o problema para mim. C:> icacls "D: \ test" / conceder John: (OI) (CI) F / T
Alex Spence
9
@AlexSpence Ótimo ponto! O / T é necessário para atualizar as permissões de arquivos e pastas existentes . O (OI) e (CI) se aplica somente a arquivos e pastas criados no futuro.
Jesse
5
Vindo do mundo * nix e sendo usado para 'chown / chmod' para dar acesso e definir permissões via CLI, esse segmento tem sido muito útil.
bgarlock
5
Se você executar isso no Powershell no Windows 10, receberá o erro "OI não reconhecido". Solução: coloque o argumento user + perms entre aspas. Por exemplo:C:\>icacls "D:\test" /grant "John:(OI)(CI)F" /T
JDS
78

Você também pode usar o ICACLS.

Para conceder controle total ao grupo Usuários a uma pasta:

>icacls "C:\MyFolder" /grant Users:F

Para conceder permissão de modificação aos usuários do IIS para C:\MyFolder(se você precisar que o seu IIS tenha a capacidade de arquivos R / W em uma pasta específica):

>icacls "C:\MyFolder" /grant IIS_IUSRS:M

Se você faz o ICACLS /? você poderá ver todas as opções disponíveis.

Vin.X
fonte
E, como isso caclsse foi, é ainda mais motivo para usar icacls .
Ian Boyd
2
Adicionar controle total não funcionou para mim até ser /grant Users:(OI)(CI)Fusado
Jan Zahradník
Preciso substituir Userspor outra coisa ou NÃO? De acordo comicacls "C:\MyFolder" /grant Users:F
iori 13/01
Se o usuário atual for um membro do grupo de usuários chamado "Usuários" (que normalmente é o caso no Windows 7), conceder uma permissão a esse grupo afetará os direitos de acesso do usuário atual. Em qualquer outro caso, substitua o nome Users pelo nome real do usuário atual (por exemplo, John), assim: / conceda a John: (OI) (CI) F
Ed999 6/18/18
24

Abra um prompt de comando e execute este comando:

icacls "c:\somelocation\of\path" /q /c /t /grant Users:F

F dá acesso total.

/q /c /t aplica as permissões às subpastas.

Nota: Às vezes, "Executar como administrador" ajudará.

Sireesh Yarlagadda
fonte
"Executar como administrador" é necessário, simplesmente a melhor resposta!
precisa saber é o seguinte
20

Use o caclscomando Veja informações aqui .

Arquivos CACLS / e / p {USERNAME}: {PERMISSION}

Onde,

/ p: define nova permissão

/ e: Edite a permissão e mantenha a permissão antiga como é, ou seja, edite a ACL em vez de substituí-la.

{USERNAME}: nome do usuário

{PERMISSÃO}: a permissão pode ser:

R - Ler

W - Escrever

C - Alterar (gravação)

F - Controle total

Por exemplo, conceda o controle Rocky Full (F) com o seguinte comando (digite no prompt de comando do Windows):

C:> arquivos CACLS / e / p rochoso: f

Leia a ajuda completa digitando o seguinte comando:

C:> cacls /?

Jorge Ferreira
fonte
Ótima resposta! A única coisa a observar é que arquivos são os arquivos reais nos quais você deseja alterar as permissões. Talvez [arquivos] ou {arquivos} sejam uma explicação melhor.
Connor Ross
14
Cacls está obsoleto!
Hardik Thaker
caclsé relevante; ainda está disponível em Windows 10; A Microsoft também se tornaria obsoleta cmd.exeem favor do Powershell.
1
@ Chinggis6 Estar "ainda disponível" não significa que é uma boa ideia usar ou recomendar outras pessoas. Além disso, cmd.exenão é preterido e provavelmente não será, portanto, esse não é um ponto a favor de icaclstodo, pelo contrário.
underscore_d
1
Eu sei. Não indiquei se é uma boa ideia usar ou recomendar cacls.exe. Também não mencionei que cmd.exejá está obsoleto. Acho que as pessoas devem estar cientes de sua disponibilidade em versões superiores, mesmo apenas para compatibilidade com versões anteriores ou qualquer outro motivo.
12

Eu tento da maneira abaixo e funciona para mim:
1. abra cmd.exe
2. takeown /R /F *.*
3. icacls * /T /grant [username]:(D)
4.del *.* /S /Q

Para que os arquivos possam se tornar meu próprio acesso e atribua a "Excluir" e eu possa excluir os arquivos e pastas.

Ray Huang
fonte
7

Permissões corrompidas: recuperando o acesso a uma pasta e seus subobjetos

Embora a maioria das respostas postadas em resposta à pergunta tenha algum mérito, IMHO nenhuma delas fornece uma solução completa. A seguinte (pode ser) uma solução perfeita para o Windows 7 se você estiver bloqueado em uma pasta por configurações de permissão corrompidas:

icacls "c:\folder" /remove:d /grant:r Everyone:(OI)(CI)F /T  

No Windows 10, o usuário / SID deve ser especificado após a /remove:dopção:

icacls "c:\folder" /remove:d Everyone /grant:r Everyone:(OI)(CI)F /T  

.
Notas :

  1. O comando é aplicado ao diretório especificado.

  2. A especificação do usuário "Todos" define a permissão mais ampla possível, pois inclui todos os usuários possíveis.

  3. A opção "/ remove: d" exclui as configurações DENY explícitas que possam existir, pois elas substituem as configurações ALLOW explícitas: uma preliminar necessária para criar uma nova configuração ALLOW. Isso é apenas uma precaução, pois muitas vezes não há configuração DENY presente, mas é melhor prevenir do que remediar.

  4. A opção "/ grant" cria uma nova configuração de ALLOW, uma permissão explícita que substitui (": r") toda e qualquer configuração explícita de ALLOW que possa existir.

  5. O parâmetro "F" (ou seja, a permissão criada) torna isso uma concessão do controle COMPLETO.

  6. O parâmetro "/ T" adiciona recursão, aplicando essas alterações a todos os subobjetos atuais no diretório especificado (por exemplo, arquivos e subpastas), bem como à própria pasta.

  7. Os parâmetros "(OI)" e "(CI)" também adicionam recursão, aplicando essas alterações aos subobjetos criados posteriormente.
    .

ADENDA (10/02/2019) -

A linha de comando do Windows 10 acima foi gentilmente sugerida para mim hoje, então aqui está. Eu não tenho o Windows 10 para testá-lo, mas tente se tiver (e faça um comentário abaixo).

A alteração refere-se apenas à remoção da configuração DENY como primeira etapa. Pode não haver nenhuma configuração DENY presente, portanto essa opção pode não fazer diferença. No meu entender, no Windows 7, você não precisa especificar um usuário após / remover: d, mas posso estar errado sobre isso!

.

ADENDA (21/11 2019) -

O usuário astark recomenda substituir Todos pelo termo * S-1-1-0, para que o comando seja independente do idioma. Eu só tenho uma instalação em inglês do Windows, então não posso testar esta proposta, mas parece razoável.

Ed999
fonte
Nenhuma provisão é necessária para permissões INHERITED, porque as permissões EXPLICIT as substituem. Portanto, a criação da nova configuração explícita anula quaisquer configurações herdadas que possam existir (porque a nova configuração explícita inclui recursão).
Ed999 19/03/19
Invalid parameter "/remove:d"
DFSFOT
Estou executando (só pode executar) icacls.exe no Windows 7. Não posso comentar nem testar nenhuma alteração que possa existir no Windows 8 ou 10. Conforme testado por mim no Windows 7 de 64 bits, a remoção A opção é eficaz para remover as configurações de DENY. Seu uso pode resultar em uma mensagem de erro se NÃO houver configurações de negação presentes, mas se não houver nenhuma, não será possível removê-las.
Ed999 #
A falha em reproduzir exatamente a linha de comando na minha resposta original (exceto o caminho do diretório) resultará na falha do comando. Em particular, NÃO adicione aspas que não apareçam na minha resposta. Se você colocar (por exemplo) a opção / remove: d entre aspas, é claro que o comando falhará.
Ed999 #
1
@ DFSFOT Bem, eu simpatizo. Mas eu uso o Windows 7. Com a graça de Deus, nunca vou usar o Windows 10. Prefiro migrar para o Ubuntu! Eu suspeito que / remove: g provavelmente removerá todos os direitos, tanto as entradas ALLOW quanto DENY (embora com a possibilidade de que 'concedido' nesse contexto signifique apenas ALLOW e, portanto, não processe nenhuma entrada DENY); Considerando que / remove: d presumivelmente removerá apenas as entradas DENY, deixando as entradas ALLOW inalteradas. Mas é claro que não tenho certeza.
Ed999
5

Lutei com isso por um tempo e só combinando as respostas neste tópico funcionou para mim (no Windows 10):
1. Abra cmd ou PowerShell e vá para a pasta com arquivos
2. takeown / R / F .
3. icacls * / T / grant dan: F

Boa sorte!

Daniil Shevelev
fonte
3

Apenas no caso de haver mais alguém que tropeça nesta página, se você deseja agrupar várias permissões no único comando, usei o seguinte:

icacls "c:\TestFolder" /grant:r Test_User:(OI)(CI)(RC,RD,RX)

Observe a cadeia csv para as várias permissões.

Publicidades
fonte
Muito obrigado. Isso me ajudou a definir a permissão para o RX & RD. Na maior parte do exemplo dado na Internet, foi explicado com / F permissão total, o que não deve ser o caso.
Mani
2

Com um script vba do Excel para provisionar e criar contas. Eu estava precisando conceder permissões de direitos totais para a pasta e subpastas criadas pela ferramenta usando a conta 'x' de nossos administradores para nosso novo usuário.

cacls tinha algo parecido com isto: cacls \ FileServer \ Users \ Nome de usuário / e / g Domínio \ Nome de usuário: C

Eu precisava migrar esse código para o Windows 7 e além. Minha solução acabou sendo:

icacls \ FileServer \ Users \ Nome de usuário / concessão: r Domínio \ Nome de usuário: (OI) (CI) F / t

/ grant: r - concede direitos de acesso de usuário especificados. As permissões substituem as permissões explícitas concedidas anteriormente. Sem: r, as permissões são adicionadas a quaisquer permissões explícitas concedidas anteriormente

(OI) (CI) - esta pasta, subpastas e arquivos.

F - Acesso total

/ t - Atravessa todas as subpastas para corresponder aos arquivos / diretórios.

O que isso me deu foi uma pasta neste servidor em que o usuário só podia ver essa pasta e criou subpastas, que eles podiam ler e gravar arquivos. Além de criar novas pastas.

Gus
fonte
1

O XCACLS.VBS é um script muito poderoso que altera / edita as informações da ACL. A ajuda c: \ windows \ system32 \ cscript.exe xcacls.vbs retorna todas as opções e opções.

Você pode obter distribuição oficial na Página de Suporte da Microsoft

g222
fonte
3
Você pode fornecer uma referência onde XCACLS.VBSpode ser encontrado?
Jeremy J Starcher
1

A criação de pastas em massa e a permissão de concessão funcionam comigo, usando o script do PowerShell abaixo.

Import-Csv "D:\Scripts\foldernames.csv" | foreach-object {
    $username = $_.foldername 

    # foldername is the header of csv file

    $domain = “example.com”

    $folder= "D:\Users"

    $domainusername = $domain+“\”+$username

    New-Item $folder\$username –Type Directory

    Get-Acl $folder\$username  

    $acl = Get-Acl $folder\$username

    $acl.SetAccessRuleProtection($True, $False)

    $rule = New-Object System.Security.AccessControl.FileSystemAccessRule("Administrators","FullControl", "ContainerInherit, ObjectInherit", "None", "Allow")
    $acl.AddAccessRule($rule)

    $rule = New-Object System.Security.AccessControl.FileSystemAccessRule("SYSTEM","FullControl", "ContainerInherit, ObjectInherit", "None", "Allow")
    $acl.AddAccessRule($rule)

    $rule = New-Object System.Security.AccessControl.FileSystemAccessRule("$domain\Domain Admins","Read", "ContainerInherit, ObjectInherit", "None", "Allow")
    $acl.AddAccessRule($rule)

    $rule = New-Object System.Security.AccessControl.FileSystemAccessRule($domainusername,"Modify", "ContainerInherit, ObjectInherit", "None", "Allow")
    $acl.AddAccessRule($rule)

    Set-Acl $folder\$username $acl
}

Nota: Você deve criar o mesmo nome de usuário de domínio no arquivo csv, caso contrário, obterá problemas de permissão

user2934980
fonte
0
attrib +r +a +s +h <folder name> <file name> to hide
attrib -r -a -s -h <folder name> <file name> to unhide
Yashwanth
fonte
2
Esses são atributos do arquivo (somente leitura, arquivamento, sistema, oculto) e não de permissões, vinculados a contas de usuário.
Robin Bennett
0

excelente ponto Călin Darie

Eu tinha muitos scripts para usar cacls. Movo-os para icacls, como sempre. Não consegui encontrar um script para alterar o exemplo de volumes de montagem raiz: d: \ datafolder. Finalmente criei o script abaixo, que monta o volume como uma unidade temporária e aplica-se em segundos. depois desmonta-o. É a única maneira que descobri que você pode atualizar a segurança de montagem raiz.

1 obtém o GUID de montagem da pasta em um arquivo temporário e, em seguida, lê o GUID para montar o volume como uma unidade temporária X: aplica seg. E registra as alterações e desmonta o Volume apenas da unidade X: para que a pasta montada não seja alterada ou interrompida. então o segundo aplicado.

Aqui está um exemplo do meu script:

**mountvol "d:\%1" /L >tempDrive.temp && FOR /f "tokens=*" %%I IN (tempDrive.temp) DO mountvol X: %%I 
D:\tools\security\icacls.exe  %~2 /grant domain\group:(OI)(CI)F /T /C >>%~1LUNsec-%TDWEEK%-%TMONTH%-%TDAY%-%TYEAR%-%THOUR%-%TMINUTE%-%TAM%.txt
if exist x:\*.* mountvol X: /d**
HandyMannyHE
fonte
0

Sou Administrador e algum script colocou a permissão "Negar" em meu nome em todos os arquivos e subpastas em um diretório. A execução do icacls "D:\test" /grant John:(OI)(CI)F /Tcomando não funcionou, porque parecia não remover o "Negar" diretamente do meu nome nesta lista.

A única coisa que funcionou para mim é redefinir todas as permissões com o icacls "D:\test" /reset /Tcomando

B. Zoli
fonte
É possível superar o problema sem usar o comando reset, especificando '' / remove: d '' para excluir quaisquer configurações DENY explícitas que possam existir - veja minha solução perfeita (acima).
Ed999
-1

no windows 10 funcionando sem "c:>" e ">"

Por exemplo:

F = Full Control
/e : Edit permission and kept old permission
/p : Set new permission

cacls "caminho do arquivo ou da pasta" / e / p UserName: F

(também corrige os erros 2502 e 2503)

cacls "C: \ Windows \ Temp" / e / p Nome de usuário: F

Dao1988
fonte
-5

Isto é o que funcionou para mim:

  1. Abra manualmente a pasta para a qual o acesso foi negado.

  2. Selecione o arquivo executável / aplicativo nessa pasta.

  3. Clique com o botão direito do mouse e vá para Properties->Compatibility

  4. Agora veja o Privilege Levele verifiqueRun As Administrator

  5. Clique em Change Settings for all users.

O problema está resolvido agora.

MAIO
fonte
A questão é fazer o acima através da linha de comando. Enquanto sua sugestão pode funcionar bem, não é aplicável se você só tem acesso ao terminal (SSH) a um sever que precisa ser configurado, portanto, você precisará usar um script cmd
Ivaylo Slavov