编辑:显然,我没有足够的代表回答我自己的问题,所以答案就在这里。
好的!
所以! 我没有完全解决问题…但我停止使用cacls.exe并开始使用icacls.exe,现在它似乎再次工作。
batch file现在看起来像这样:
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
显然,cacls是在2k8贬值,并不像你期望它的行为了…
无论如何,我可能正在研究Mathieu的PowerShell解决scheme,因为这将是未来可能必须要做的事情,而且他的方式似乎更加清晰。
谢谢大家的帮助!
好吧,这应该是一个非常简单的任务,但它certificate比我认为应该更复杂。 我显然做错了什么,并希望别人的意见。
我想要做的是parsing通过包含目录path的文件,并设置这些目录的权限。
input文件的示例行。 有几行,所有格式都是相同的,具有到目录的不同path。
E:\stuff\Things\something else (X)\
(有问题的文件是在Cygwin下使用find生成的,在名称中列出所有带有“(X)”的目录,然后通过unix2win传递给它,以使它兼容Windows。我也尝试从内部手动创buildinput文件窗口来排除文件的创build方法的问题。)
这里是我被卡住的地方…我在Windows XP中写了下面的快速和肮脏的batch file,它工作没有任何问题,但它不会在服务器2k8中工作。
batch file代码来运行文件并设置权限:
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
这是什么SUPPOSED做(并在XP中)是通过指定的文件(dirlist.txt)循环,并运行cacls.exe从文件中拉出的每个目录。 “回声y” 是在那里自动确认当cacls有用地询问“你确定吗?” 为列表中的每个目录。
不幸的是,它所做的是陷入无限循环。 我已经尝试过围绕“DO”引用后面的所有内容,这可以防止无尽的循环,但会混淆cacls,所以会引发错误。
有趣的是,我试着在命令提示符下手动运行“DO”之后的代码(显然用完整pathreplacevariables,直接从文件中复制),并按预期运行。 我不认为这是文件或循环,作为将要执行的命令添加引号阻止循环继续过去的地方应该…我真的不知道在这一点上。 任何帮助,将不胜感激。 我有一种感觉,这将是一个愚蠢的东西…但我拉我的头发,所以我想我会问。
你会接受使用PowerShell? 它可以完成整个工作,甚至可以避开cygwin部分。
第一种方法是通过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 }
利用更多的PowerShell来改变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) }
更多细节可以在这里find: http : //technet.microsoft.com/en-us/library/ff730951.aspx