如何控制 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)