我正在编写一些脚本来检查新创建的 Windows 服务器机器是否符合某些条件,例如用户是否具有管理员权限、是否存在特定的驱动器、用户是否对该驱动器具有读/写访问权限等。
当我开始思考 - 管理员是否可以不是对某个驱动器有权限吗?
我通过尝试在其他管理员的用户目录中创建文件夹来测试这一点,并且能够做到这一点。如果无法以管理员身份获得写入权限,我将放弃这项检查。但如果可能的话,那么我该如何检查我是否没有写权限?
答案1
对的,这是可能的。
我在桌面上创建了一个文件夹“ServerFault”,并删除了“管理员”权限:
我以“测试”用户身份启动 shell,并尝试访问此目录:
因此,即使用户是管理员,单独的文件夹权限也会阻止访问。
如何以编程方式检查您是否具有写权限,很大程度上取决于您使用的编写语言,并且更确切地说是 StackOverflow 的一个问题。
编辑1:..但是嘿,我可以给你指点。例如,在 C++ 中,你可以使用打开文件函数打开一个文件进行写入。
如果该函数失败,您可以调用 GetLastError(),如果此错误值为 5,则您作为运行程序的用户没有写访问权限。
编辑2:由于您使用的是 Powershell,因此您可以使用 CACLS 命令并解析输出。
PS C:\Users\csa> cacls C:\temp | findstr“管理员” C:\Temp BUILTIN\Administrators:(ID)F BUILTIN\管理员:(OI)(CI)(IO)(ID)F
来自“帮助”:
烫发可以是:R 读 写 C 更改(写入) F 完全控制
和
缩写: CI——容器继承。 ACE 将被目录继承。 OI——对象继承。 ACE 将被文件继承。 IO——仅继承。 ACE 不适用于当前文件/目录。 ID——已继承。 ACE 是从父目录的 ACL 继承的。
因此在这种情况下,内置管理员组的用户拥有完全控制权,因为他们从 C:\ 目录中设置的权限继承了它。