Board logo

标题: 【分享】cacls权限设置 使用心得 [打印本页]

作者: plp626     时间: 2009-9-13 05:24    标题: 【分享】cacls权限设置 使用心得

ntfs分区设置权限的工具我现在又三个:
cacls.exe(xp自带)
xcacls.exe(windows service 资源工具包中提取)
xcacls.vbs (官方下载的)
这三个工具用法一个比一个细致,对与大部分用户cacls.exe基本满足,当然为了赋予目录某些特殊权限还得用xcacls
我对xcacls掌握得不好,仅就cacls的使用与大家分享下,然后希望大家踊跃参与下面贴子的讨论,(重点讨论xcacls的使用)
点击进入http://www.cn-dos.net/forum/viewthread.php?tid=48799
下面用法都是我在admin账户下对其他账户进行设置,任何情况下我都让admin对任何文件目录具有完全控制的权限.
下面的注释写的很紧凑,建议新手请动手测试(别到C盘试验,找个U盘,用convert转换为ntfs格式测试 具体请参考命令行下convert /?)
================命令行下 键入 cacls /? 查看 帮助信息 =====================

  Quote:
CACLS filename [/T] [/E] [/C] [/G user:perm] [/R user [...]]
               [/P user:perm [...]] [/D user [...]]

注释:: "[]"里的内容表示可以省略,大些字母的参数使用时保持原样,小写字母的参数只是对参数的描述,具体要根据实际替换

   filename      显示 ACL。
注释:: 比如键入cacls a.txt 将显示当前目录内各账户对a.txt文件的权限(前提是你所在账户得具备查看a.txt文件acl信息的权限,

如何让所在账户具备此权限,看/G 参数)

   /T【Tree】            更改当前目录及其所有子目录中指定文件的 ACL。               
注释:: 这个类似与dir 命令的 /s 参数,后面再详细说

   /E【Edit】           编辑 ACL 而不替换。
注释:: 什么叫编辑而不替换?用了/G参数后就理解勒

   /C【Continue】           在出现拒绝访问错误时继续。
注释::前面说了/T参数,比如在C盘根目录下键入cacls *.* /t 时他表示查看对C盘所有目录内的文件(包括目录)的acl信息,但是如

果其中又某个目录是拒绝当前账户访问(此拒绝访问对目录和文件各有含义,下面详细说)的时候,当cacls遍历到该目录时,他会

退出,后面的目录都跳过了,为了防治cacls直接退出,就有了这个/C 参数 比如现在根目录下键入cacls *.* /t /c 如果 windows

目录是拒绝访问的 cacls将会显示windows目录为 C:\Windows\*.* ACCESS_DENIED:

   /G【Grant】 user:perm  赋予指定用户访问权限。
                 Perm 可以是: R  读取
                              W  写入
                              C  更改(写入)
                              F  完全控制
注释::计算机一般不止一个账户,为方便起见我们假设又三个账户,admin,tmp-adm,(前两个账户都是管理员用户组的)guest,
重装系统格式化磁盘后,建立的文件默认是当前用户与管理员用户组的账户具备F权限的,(当我们以admin登陆系统后建立的文件,

默认guest只有只读权限),如果我们以guest账户登陆,新建一个文件c:\a.txt(此时三个账户对此文件的权限皆为F) 然后执行命

令 echo y|cacls c:\a.txt /g guest:R 后,他将删除guest用户外的所有账户的访问权限,只有guest对此文件又且仅有R权限。
那么怎么防治删除admin的访问权限呢,就得用上面说的/E参数 但是执行echo y|cacls c:\a.txt /e /g guest:R 的执行结果是
(管理原用户组的权限未必)而是给guset账户"添加" R权限,(我们不妨把/e /g参数组合解释为“添加”)由于原来guest为F权限,再

添加个R,虽然是只读,但是F权限仍然可以让guest为所欲为。
注意这里的W权限不是针对gui(图形用户界面)操作的,而是命令行操作,比如执行cacls c:\a.txt /g guest:w 后鼠标点击a.txt会

弹出拒绝访问的,而我们在命令行下却可以通过重定向来给他添加或覆盖数据,那为了让a.txt获得访问,写入权限我们这次又得

又/E参数勒,执行cacls c:\a.txt /g guest:w再执行 cacls c:\a.txt /e /g guest:R 就可以了,对于cacls c:\a /g guest:RW 这种写法cacls.exe 暂不支持(升级版本的cacls:xcacls.exe 与xcacls.vbs都支持这一写法)
有时候我们会要某个文件具备可访问可编辑但不可删的权限,方法同上,分三步,父目录权限设为C(只要不是F),然后 cacls a.txt /g everyone:R 再 cacls a.txt /e /g everyone:W

   /R【Revoke】user       撤销指定用户的访问权限(仅在与 /E 一起使用时合法)。
注释:: 这里的撤销直接就是拒绝访问,示例:cacls filename /e /r admin

   /P【Replace】user:perm  替换指定用户的访问权限。
                 Perm 可以是: N  无
                              R  读取
                              W  写入
                              C  更改(写入)
                              F  完全控制
注释:: 理解勒/G 参数 与/E 参数这个不难推理了,不过真正的替换参数应该为/e/p ,
cacls ... /P user:perm 应该解释为撤销其他用户的权限再替换"user"账户现有的权限为perm
这个/e/p 还用可以用来提权,比如D盘现在被guest设置勒everyone只读或拒绝访问,那么用cacls d: /e /p everyone:F即可解除

   /D【Deny】user       拒绝指定用户的访问。
注释:: 我们经常建立免疫autorun.inf目录,比如执行cacls C:\autorun.inf /d everyone 就可以起到不可改名不可删除不可访问的效果 (相当于N权限)

在命令中可以使用通配符指定多个文件。
也可以在命令中指定多个用户。
注释:: 这个通配符就是?*, 指定多个用户示例:Cacls yourfilename /G admin:F everyone:R


缩写:
   CI 【Container Inherit】- 容器继承。
        ACE 会由目录继承。
   OI 【Object Inherit】- 对象继承。
        ACE 会由文件继承。
   IO 【Inherit Only】- 只继承。
        ACE 不适用于当前文件/目录。
注释:,这些信息你只有被动地去接受,cacls貌似不可主动实现

不过这里不得不强调的是对目录设置的权限与文件不同,上面的例子都是对文件设置权限,下面讲一讲对目录设置权限
执行cacls d: /g everyone:C 是对D盘(一个磁盘也可看做目录)跟目录设置更改权限,执行此命令后,当前账户在D盘建立的任何文

件都会具有C权限(这就是对象继承),当前账户在D盘建立的任何目录也都具有C权限(着就是容器继承,目录可以看做一个盒子,容器

大概就是这个意思吧),(对于上面说的只继承要用xcacls里的特殊参数),而在执行改命令前,D盘的任何文件与目录对账户的权限

并不改变!
我们使用cacls就是为了磁盘文件的安全性,但是纵观cacls所有参数没有涉及到文件的建立与删除,对文件的建立删除的单独权限

cacls确实没有给出(详细请参考xcacls.vbs),但是他确实可以实现防删除的权限,比如我们常常给exe等(非文本阅读文件)设置只

读权限,但是设置之后有时候却发现可以删除,这是因为该文件所在目录没又设置相应的权限限制,比如当文件所在目录对当前账户

为F权限时,即使文件设置R权限,当前账户虽然不能修改文件但仍然可以删除,为了达到只读不可删的效果,得分两步,先给文件所

在目录设置C权限(/g参数perm的C,这个权限使得目录内的文件有接近于完全控制的权限)然后再对该文件设置R。
另外,如果一个目录显示F权限,然后直接给该目录设定N(拒绝访问),但是文件里面的文件仍然是可以访问的,只要你知道里面文件的绝对路径,你就可以在地址栏或命令行打开或访问他!
============================================================

以上注释均为本人个人观点,定有许多不准确之处,如若发现错误,或又不同意见欢迎发帖指出或讨论!
                               知识大家分享,希望共同提高!

[ Last edited by plp626 on 2009-9-13 at 07:05 ]
作者: 523066680     时间: 2009-9-13 06:52
文章很长,很花心思的,所以现献上一点分。
plp大哥这句话小心害到启动盘的朋友哦

  Quote:
别到C盘试验,找个U盘,用convert转换为ntfs格式测试 具体请参考命令行下convert /?

上次我把启动盘convert 成了ntfs, 结果电脑出了问题,想在u盘启动
怎么也启动不了。
弄了很久才想到,原来是上次转换成了ntfs的。不知道怎么直接转回去,
只好重格,重做了……

[ Last edited by 523066680 on 2009-9-13 at 07:02 ]
作者: plp626     时间: 2009-9-13 07:23


  Quote:
Originally posted by 523066680 at 2009-9-13 06:52 AM:
文章很长,很花心思的,所以现献上一点分。
plp大哥这句话小心害到启动盘的朋友哦


上次我把启动盘convert 成了ntfs, 结果电脑出了问题,想在u盘 ...

写教程是为了有更多人研究cacls以便此贴
http://www.cn-dos.net/forum/viewthread.php?tid=48799
早早结了
我一个人孤军奋战已经穷途末路
作者: 523066680     时间: 2009-9-13 08:36
说到穷途末路的份上了……

既然vbs可以做出xcacls.vbs 也许了解vbs这类操作后能做出更细节的操作。

[ Last edited by 523066680 on 2009-9-13 at 08:37 ]
作者: qinchun36     时间: 2009-9-13 23:10
给出一个我常用的代码:
CODE:  [Copy to clipboard]
cscript xcacls.vbs "文件夹" /G Everyone:14A;123A /S /T /I REMOVE
假设此 NTFS 分区上的文件夹名字叫 “文件夹” ,它下面有一些子文件夹,里面都放了东西,执行此命令过后的效果是:

此文件夹下面的所有已经存在即将要放进去的文件和文件夹的属性以及内容都不能修改;

所有可执行的操作:复制,剪切,查看,重命名,删除;
不能执行的操作包括:编辑内容,编辑属性,覆盖文件;

在这个目录下的后缀为 .bat .exe .com .pif 的文件都不能运行,但是可以用其他软件例如记事本查看他们的内容,不过 .vbs .vbe 可以运行。

因此,这样处理过后的文件夹具有防病毒,防修改的功效,非常适合做仓库!

[ Last edited by qinchun36 on 2009-9-14 at 04:52 ]
作者: loquat     时间: 2009-9-14 08:06


  Quote:
Originally posted by qinchun36 at 2009-9-13 23:10:
给出一个我常用的代码:
CODE:  [Copy to clipboard]
cscript xcacls.vbs "文件夹" /G Everyone:14A;123A /S /T /I REMOVE
假设此 NTFS 分区上的文件夹名字叫 “文件夹”  ...

如果要撤销呢?

看了半天xcacls太难了,现在我把文件全部移动到其他文件夹下,"文件夹"下的文件还是没有恢复正常。必须切换到system用户一个一个编辑修改属性。太麻烦了。
2G的txt啊。。。
作者: qinchun36     时间: 2009-9-14 22:38
Re 6: 改成继承它的父文件夹权限就行了
CODE:  [Copy to clipboard]
cscript xcacls.vbs "文件夹" /S /T /I COPY

作者: loquat     时间: 2009-9-15 01:40
楼上的代码不行。嗨呀。真不该好奇啊。。。要改回来太浪费时间了啊。。。
作者: qinchun36     时间: 2009-9-15 03:41
不会吧,实在不行你直接赋予全部权限,不过这样就跟你原来的权限不一样了:
CODE:  [Copy to clipboard]
cscript xcacls.vbs "文件夹" /G Everyone:F;F /S /T /I REMOVE

作者: loquat     时间: 2009-9-15 08:59
可怜的娃,还是不行。只能在system用户下逐个修复了。。。汗啊。。。
菜鸟就 不应该尝试这么多的参数。唉。。。
作者: loquat     时间: 2009-9-15 09:09
最终这样解决了。汗一个!!!


先用at命令切换到system权限的explorer下。


  Quote:
先用任务管理器或者taskkill命令关掉,explorer.exe进程。
在cmd中输入:
CODE:  [Copy to clipboard]
at time /interactive "%systemroot%\explorer.exe"
time为一个稍后于当前时间的时间。


然后进入被更改权限的文件夹。
搜索*.*
选中所有的文件,右键属性,安全,高级,所有者-选择Administrator,确定退出就可以了。
如果以上对某些文件还不行,再在右键属性-安全那个框里,添加,输入当前的用户民。我的是loquat
添加成功后,自己选择完全控制保存即可了。

菜鸟不要玩这么先进的东西啊。以后不敢玩了。


[ Last edited by loquat on 2009-9-16 at 09:47 ]
作者: lpk130     时间: 2009-9-16 11:42
右击文件夹,属性,安全,高级,父继承,子继承
如果不行,就换到“所有者”页,替换子容器
再执行上一步
注意要先确认“父继承”能够得到的权限(一般就是上一级目录的权限)
作者: weasel     时间: 2009-9-16 12:38
cacls现在使用的例子不少,在对服务器的管理中经常都在用,主要是简单实用。

细致的设置还是需要XCACLS.vbs。不过对一般用户用处不大。

以前做了个“系统文件&注册表保护”

其中用CACLSZ做的系统文件保护部分的代码给大家交流。
CODE:  [Copy to clipboard]
@echo off
color 2f
Set Prog=瓦斯曲-自启动(目录&注册表键值)保护
Set L1=         ╭───────────────────╮
Set L2=      ╭─┤%Prog% ├─╮
Set L3=      │  ╰───────────────────╯ │
Set L4=      │==============================================│
Set L5=      │       仅供网友们交流      翻版不究          │
Set L6=      ╰───────────────────────╯
Title 瓦斯曲-自启动(目录&注册表键值)保护
set ofn=[1 17 8]reg query "HKEY_LOCAL_MACHINE\SOFTWARE\WSQ" /s  |find /I "AUTORUNR" >nul 2>nul||set ofn=[8]if "%ofn%"=="[1 17 8]" (
reg delete "HKEY_LOCAL_MACHINE\SOFTWARE\WSQ" /f /v "AUTORUNR" >nul 2>nul
set caclsRF=F
set endr=取消
)
if "%ofn%"=="[8]" (
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\WSQ" /v "AUTORUNR" /t reg_sz /d "瓦斯曲-自启动(目录&注册表键值)保护" /f >nul 2>nul
set caclsRF=R
set endr=启动
)
:::===============================================================
Echo %endr%自启动目录权限保护 ……
Echo %endr%自启动目录权限保护 ……>>list
echo Y|cacls "%USERPROFILE%\「开始」菜单\程序\启动" /T /C /P everyone:R Administrators:%caclsRF% SYSTEM:%caclsRF%>nul 2>nul
echo Y|cacls "%ALLUSERSPROFILE%\「开始」菜单\程序\启动" /T /C /P everyone:R Administrators:%caclsRF% SYSTEM:%caclsRF%>nul 2>nul
:::===============================================================
Echo %endr%重要文件权限保护 ……
Echo %endr%重要文件权限保护 ……>>list
echo Y|cacls "%SystemRoot%\system32\autoexec.nt" /C /P everyone:R Administrators:%caclsRF% SYSTEM:%caclsRF%>nul 2>nul
echo Y|cacls "%SystemRoot%\system32\config.nt" /C /P everyone:R Administrators:%caclsRF% SYSTEM:%caclsRF%>nul 2>nul
echo Y|cacls "%SystemRoot%\system32\winstart.bat" /C /P everyone:R Administrators:%caclsRF% SYSTEM:%caclsRF%>nul 2>nul
echo Y|cacls "%SystemRoot%\system32\dosstart.bat" /C /P everyone:R Administrators:%caclsRF% SYSTEM:%caclsRF%>nul 2>nul
echo Y|cacls "%SystemDrive%\autoexec.bat" /C /P everyone:R Administrators:%caclsRF% SYSTEM:%caclsRF%>nul 2>nul
echo Y|cacls "%SystemDrive%\config.sys" /C /P everyone:R Administrators:%caclsRF% SYSTEM:%caclsRF%>nul 2>nul
echo Y|cacls "%SystemDrive%\NTDETECT.COM" /C /P everyone:R Administrators:%caclsRF% SYSTEM:%caclsRF%>nul 2>nul
echo Y|cacls "%SystemDrive%\ntldr" /C /P everyone:R Administrators:%caclsRF% SYSTEM:%caclsRF%>nul 2>nul
echo Y|cacls "%SystemDrive%\boot.ini" /C /P everyone:R Administrators:%caclsRF% SYSTEM:%caclsRF%>nul 2>nul
echo Y|cacls "%SystemRoot%\win.ini" /C /P everyone:R Administrators:%caclsRF% SYSTEM:%caclsRF%>nul 2>nul
echo Y|cacls "%SystemRoot%\system.ini" /C /P everyone:R Administrators:%caclsRF% SYSTEM:%caclsRF%>nul 2>nul
echo Y|cacls "%SystemRoot%\system32\system32\drivers\etc\hosts"  /C /P everyone:R Administrators:%caclsRF% SYSTEM:%caclsRF%>nul 2>nul
Echo %endr%%SystemRoot%目录权限保护 ……
Echo %endr%%SystemRoot%目录权限保护 ……>>list
Cacls "%SystemRoot%" /T /E /C /R Administrator >nul 2>nul
echo Y|cacls "%SystemRoot%" /T /C /E /P Administrators:%caclsRF%>nul 2>nul
echo Y|cacls "%SystemRoot%\Temp" /T /C /E /P Administrators:F>nul 2>nul
:::===============================================================
Echo %endr%策略权限保护 ……
Echo %endr%策略权限保护 ……>>list
echo Y|cacls "%SystemRoot%\system32\grouppolicy" /T /C /P everyone:R Administrators:%caclsRF% SYSTEM:%caclsRF%>nul 2>nul
:::===============================================================
Echo %endr%危险命令权限保护 ……
CALL :end
echo 请按任意键退出. . .&&pause>nul

:end
Echo.
Echo.
Echo.
Echo.
Echo %L1%
Echo %L2%
Echo %L3%
Echo             │                                              │
Echo             │你的自启动(目录&注册表键值)保护已经%endr% !  │
Echo             │                                              │
Echo %L4%
Echo %L5%
Echo %L6%
goto :eof
这只是部分测试代码
感兴趣的朋友可以到我的窝:http://linux.jgxx.com去看。
作者: radem     时间: 2009-9-17 01:36
受教了,多谢分享!




欢迎光临 中国DOS联盟论坛 (http://cndos.fam.cx/forum/) Powered by Discuz! 2.5