使用特定组和权限写入文件的服务 C#

问题描述 投票:0回答:1

编辑问题,因为根据下面的评论似乎没有理解该问题。 我最初相当模糊地写了这个问题,希望有人能提供一个与我开始的解决方案完全不同的解决方案,但似乎要求太多,所以根据我到目前为止所拥有的内容重写。 还删除了对权限的引用,因为我找到了答案(将包含在底部)。

我正在编写一个程序,打算使用守护程序/服务/无登录用户运行它

aaa
。 用户
aaa
是组
shareabc
sharedef
的成员。 该程序的配置文件如下所示:

{
   ... other config ...
   "locations": [
      {
         "id": "workflow1",
         "location": "/shr/abc",
         "group": "shareabc"
      },
      {
         "id": "workflow2",
         "location": "/shr/def",
         "group": "sharedef"
      },
   ],
   ... other config ...
}
  • /shr/abc
    属于
    root:shareabc
  • /shr/def
    属于
    root:sharedef

如果在我的程序中调用

Directory.CreateDirectory("/shr/abc/myfolder1");
,那么
/shr/abc/myfolder1
将与所有者
aaa:aaa
一起创建。

我需要什么 C# 代码才能创建所有者为

aaa:shareabc
而不是
aaa:aaa
的文件夹?

以用户

aaa
shareabc
运行程序不是解决方案,如下:

  1. 有些文件应该是
    aaa:aaa
    ,还有一些文件应该是
    aaa:shareabc
    。 更改正在运行的用户/组,或更改文件系统默认值,只会转移问题而不是解决问题。
  2. 当它尝试使用所有者
    /shr/def
    写入文件夹
    aaa:sharedef
    时,我会遇到同样的问题。

至于设置权限,他们似乎几年前就更新了C# API。 我可以调用以下命令来使用 775 创建它:

Directory.CreateDirectory("/shr/abc/myfolder1", UnixFileMode.UserRead | UnixFileMode.UserWrite | UnixFileMode.UserExecute | UnixFileMode.GroupRead | UnixFileMode.GroupWrite | UnixFileMode.GroupExecute | UnixFileMode.OtherRead | UnixFileMode.OtherExecute);

c# linux file permissions
1个回答
0
投票

由于没有权限问题,可以直接运行

chown
命令。

Process.Start("chown", $"aaa:shareabc {directoryPath}").WaitForExit();

如果您更喜欢 C# 方法,可以使用

Mono.Posix.NETStandard
nuget 包来完成这项工作。

using Mono.Unix;
var d = UnixFileSystemInfo.GetFileSystemEntry(directoryPath);
f.SetOwner("abc", "shareabc");

这个方法实际上调用了libc的chown函数,所以你也可以这样做:

[DllImport("libc", SetLastError = true)]
static extern int chown(string path, int owner, int group);

chown(directoryPath, -1, group_id_of_shareabc);
© www.soinside.com 2019 - 2024. All rights reserved.