如何控制 Windows 中的文件访问?
How to control file access in Windows?
Go 提供 os.Chmod()
用于设置文件和目录权限。例如,如果我想确保一个文件只能被当前用户访问,我可以这样做:
os.Chmod("somefile.txt", 0600)
这在 Linux 上非常有效,但在 Windows 上完全没有作用。在深入研究 Go 源代码后,我遇到了 its implementation。似乎 S_IWRITE
是唯一受支持的属性。
如何使用 Go 控制对 Windows 上的文件或目录的访问?
说明
Windows 不使用传统的 Unix 权限。相反,Windows 通过 access control. Each object has an ACL (Access Control List)* 控制对文件和目录的访问,后者控制对对象的访问。
每个 ACL 基本上都是 ACEs (Access Control Entries) 的列表,它确定授予特定受托人(用户、组等)的访问权限。例如,文件可能包含授予特定用户对该文件的读取访问权限 (GENERIC_READ
) 的 ACE。
操作 ACL 和 ACE 是通过 Windows API 中的 authorization functions 完成的。
* 从技术上讲,每个对象都有两个 ACL——一个 DACL 和一个 SACL
解决方案
值得庆幸的是,无需学习所有这些功能。我将 a small Go package named "go-acl" 放在一起完成所有繁重的工作,并公开了一个名为(还有什么?)Chmod
的函数。基本用法如下:
import "github.com/hectane/go-acl"
err := acl.Chmod("C:\path\to\file.txt", 0755)
if err != nil {
panic(err)
}
结果
Chmod()
函数在文件的 ACL 中创建三个 ACE:
- 一个给所有者 (
WinCreatorOwnerSid
)
- 一组 (
WinCreatorGroupSid
)
- 一个给其他人 (
WinWorldSid
)
Go 提供 os.Chmod()
用于设置文件和目录权限。例如,如果我想确保一个文件只能被当前用户访问,我可以这样做:
os.Chmod("somefile.txt", 0600)
这在 Linux 上非常有效,但在 Windows 上完全没有作用。在深入研究 Go 源代码后,我遇到了 its implementation。似乎 S_IWRITE
是唯一受支持的属性。
如何使用 Go 控制对 Windows 上的文件或目录的访问?
说明
Windows 不使用传统的 Unix 权限。相反,Windows 通过 access control. Each object has an ACL (Access Control List)* 控制对文件和目录的访问,后者控制对对象的访问。
每个 ACL 基本上都是 ACEs (Access Control Entries) 的列表,它确定授予特定受托人(用户、组等)的访问权限。例如,文件可能包含授予特定用户对该文件的读取访问权限 (GENERIC_READ
) 的 ACE。
操作 ACL 和 ACE 是通过 Windows API 中的 authorization functions 完成的。
* 从技术上讲,每个对象都有两个 ACL——一个 DACL 和一个 SACL
解决方案
值得庆幸的是,无需学习所有这些功能。我将 a small Go package named "go-acl" 放在一起完成所有繁重的工作,并公开了一个名为(还有什么?)Chmod
的函数。基本用法如下:
import "github.com/hectane/go-acl"
err := acl.Chmod("C:\path\to\file.txt", 0755)
if err != nil {
panic(err)
}
结果
Chmod()
函数在文件的 ACL 中创建三个 ACE:
- 一个给所有者 (
WinCreatorOwnerSid
) - 一组 (
WinCreatorGroupSid
) - 一个给其他人 (
WinWorldSid
)