共计 1142 个字符,预计需要花费 3 分钟才能阅读完成。
Go 操作文件权限在 linux 下很简单,使用 os.Chown() 方法就可以实现,但是 windows 下面却不能这样使用。
用于在 Windows 上操作 ACL 的 Go 库
https://github.com/hectane/go-acl
这个库使用也很简单,比如更改目录下全部文件权限为当前用户
var (Username string) | |
func init() {u, err := user.Current() | |
if err != nil {fmt.Println("获取当前用户失败!") | |
os.Exit(2) | |
} | |
Username = u.Username | |
} | |
func WindowsAclFile(file_path string) error { | |
if err := acl.Apply( | |
file_path, | |
false, | |
false, | |
acl.GrantName(windows.GENERIC_ALL, Username), | |
); err != nil {fmt.Println("文件权限失败!") | |
return err | |
} | |
return nil | |
} | |
// 获取目录下所有文件 | |
func FixAllFile() { | |
filepath.Walk(basedir, | |
func(filepath string, info os.FileInfo, err error) error { | |
if err != nil {return err} | |
if !info.IsDir() {if err := WindowsAclFile(filepath); err != nil {fmt.Println(filepath + "修复失败") | |
}else{fmt.Println(filepath + "修复成功") | |
} | |
} | |
return nil | |
}) | |
} |
授予 ddn 读权限,授予 test 拒绝权限
if err := acl.Apply( | |
"C:\\path\\to\\file.txt", | |
false, | |
false, | |
acl.GrantName(windows.GENERIC_READ, "ddn"), | |
acl.DenyName(windows.GENERIC_WRITE, "test"), | |
); err != nil {panic(err) | |
} |
Windows 相关权限
DELETE
READ_CONTROL
WRITE_DAC
WRITE_OWNER
SYNCHRONIZE
STANDARD_RIGHTS_REQUIRED
STANDARD_RIGHTS_READ
STANDARD_RIGHTS_WRITE
STANDARD_RIGHTS_EXECUTE
STANDARD_RIGHTS_ALL
SPECIFIC_RIGHTS_ALL
ACCESS_SYSTEM_SECURITY
MAXIMUM_ALLOWED
GENERIC_READ
GENERIC_WRITE
GENERIC_EXECUTE
GENERIC_ALL
正文完