loop infinito de arquivo em lote ao analisar o arquivo

1

EDIT: Aparentemente eu não tenho representante suficiente para responder a minha própria pergunta, então a resposta está indo aqui.

OK!

SO! Eu não exatamente resolvi o problema ... mas parei de usar o cacls.exe e comecei a usar icacls.exe e agora parece funcionar novamente.

O arquivo em lote agora é assim:

FOR /F "tokens=*" %%A IN (dirlist.txt) DO echo y| icacls "%%A" /T /C /Grant "Domain Admins":f "Some Group":f "some-security-group":f

Aparentemente, o cacls é depreciado em 2k8 e não se comporta da maneira que você esperaria mais ...

Eu posso estar olhando para a solução de PowerShell de Mathieu, já que isso é algo que provavelmente terá que ser feito novamente no futuro, e seu caminho parece muito mais limpo.

Obrigado pela sua ajuda, todos!

Ok, esta deve ser uma tarefa muito simples, mas está sendo mais complicada do que eu acho que deveria ser. Eu estou claramente fazendo algo errado, e gostaria da entrada de outra pessoa.

O que eu gostaria de fazer é analisar um arquivo contendo caminhos para diretórios e definir permissões nesses diretórios.

Uma linha de exemplo do arquivo de entrada. Existem várias linhas, todas formatadas da mesma maneira, com um caminho diferente para um diretório.

E:\stuff\Things\something else (X)\

(O arquivo em questão é gerado sob Cygwin usando find para listar todos os diretórios com "(X)" no nome. O arquivo é então passado por unix2win para torná-lo compatível com o Windows. Eu também tentei criar manualmente a entrada arquivo de dentro do Windows para descartar o método de criação do arquivo como o problema.)

Aqui é onde eu estou preso ... Eu escrevi o seguinte arquivo batch rápido e sujo no Windows XP e ele funcionou sem nenhum problema, mas não funcionará no servidor 2k8.

Código do arquivo em lote para executar o arquivo e definir permissões:

FOR /F "tokens=*" %%A IN (dirlist.txt) DO echo y| cacls "%%A" /T /C /G "Domain Admins":f "Some Group":f "some-security-group":f

O que isto é suposto para fazer (e faz no XP) é percorrer o arquivo especificado (dirlist.txt) e executar cacls.exe em cada diretório que ele puxa do arquivo. O "echo y |" está lá para automagicamente confirmar quando cacls pede perguntando "você tem certeza?" para todos os diretórios da lista.

Infelizmente, no entanto, o que faz é cair em um loop infinito. Eu tentei cercar tudo depois de "DO" com aspas, o que impede o loop infinito, mas confunde cacls para gerar um erro.

Curiosamente, tentei executar o código depois de "DO" manualmente (obviamente substituindo a variável pelo caminho completo, copiado diretamente do arquivo) em um prompt de comando e ele é executado conforme o esperado. Eu não acho que é o arquivo ou o loop, como adicionar citações para o comando a ser executado impede que o loop continue passado onde deveria ... Eu realmente não tenho idéia neste momento. Qualquer ajuda seria apreciada. Tenho a sensação de que vai ser algo incrivelmente estúpido ... mas estou arrancando o cabelo, então pensei em perguntar.

    
por Bart 03.04.2012 / 18:15

1 resposta

3

Você aceitaria usar o powershell? Ele poderia fazer todo o trabalho, até mesmo evitando a parte do cygwin.

A primeira maneira é apenas fazer o loop através do powershell:

$dirlist=Get-Content dirlist.txt
foreach ($dir in $dirlist)
{
    write-output "doing $dir"
    echo y | cacls "$dir" /T /C /G "Domain Admins":f "Some Group":f "some-security-group":f
}

Aproveitaria muito mais o powershell usando-o para alterar a ACL:

$dirlist=Get-Content dirlist.txt
foreach ($dir in $dirlist)
{
  write-output "doing $dir"
  $acl=(get-item $dir).GetAccessControl()
  $colRights = [System.Security.AccessControl.FileSystemRights]::FullControl
  $InheritanceFlag = [System.Security.AccessControl.InheritanceFlags]::None
  $PropagationFlag = [System.Security.AccessControl.PropagationFlags]::None 
  $objType =[System.Security.AccessControl.AccessControlType]::Allow 
  $objUser = New-Object System.Security.Principal.NTAccount("wingroup\kenmyer") 
  $objACE = New-Object System.Security.AccessControl.FileSystemAccessRule ($objUser, $colRights, $InheritanceFlag, $PropagationFlag, $objType) 
  $acl.AddAccessRule($objACE)
}

Mais detalhes podem ser encontrados aqui: link

    
por 03.04.2012 / 19:16