使用.NET Core,C#,Linux
我搜索了一下,似乎什么也找不到。也许这是不可能的,我需要一种不同的方法?
有人可以帮我指出如何获取特定用户名给定路径的目录列表吗?
我正在以Root身份运行Web应用程序服务,但需要检查并返回给定用户名的目录和文件(没有密码可用),以报告给定用户名具有读取权限的目录和文件。
以“ / opt / mydata /”为例,在那里,我将拥有许多目录,这些目录将手动创建并设置每个用户组的权限。即当我为user1做目录列表时(因为该用户在各自的权限组中,或者是所有者,或者设置为每个人都可以读取),将返回“ / opt / mydata / user_1_visible”,但对于user2(此用户不在正确的组中)。
本质上,我想“模拟”或在Linux中执行“ sudo su user1”的等效操作,并报告“ / opt / mydata /”中对于给定用户可读的目录/文件。
我可以获得以Root身份运行的目录列表和文件。我不能/不知道如何获取特定用户的目录列表。我找到并尝试过的示例都是特定于Windows身份和Windows安全性的。
例如我找到了这个示例,但它似乎适用于我未运行的“ Mono”,但实际上,我确实想按照以下方式进行操作:
// Impersonate a user
using (WindowsIdentity newId = new WindowsIdentity("user1"))
using (WindowsImpersonationContext impersonatedUser = newId.Impersonate())
{
var content = _fileProvider.GetDirectoryContents(uri);
}
请问有一些第三方图书馆吗?
资源: Change current Linux user in a C# application running with Mono?
答案 0 :(得分:1)
如果您在.net核心存储库Proposal: Expose POSIX functions上看到此问题,则似乎不会在.net core中实现,而只能在Mono.Posix.NETStandard中实现。
该库与.net core 2.0兼容,并且自己实现它应该不难。
您可以使用该软件包尝试类似的操作,以过滤用户可以读取的文件。
public UserHasReadPermission(string username, string file)
{
var user = new UnixUserInfo(username);
var file = new UnixFileInfo(file);
// Everyone has read permission
if (file.FileAccessPermissions.HasFlag(FileAccessPermissions.OtherRead))
return true;
// User owns the file and has read permission
if (file.OwnerUser == user && file.FileAccessPermissions.HasFlag(FileAccessPermissions.UserRead))
return true;
// User group owns the file and has read permission
if (file.OwnerGroup == user.Group && file.FileAccessPermissions.HasFlag(FileAccessPermissions.GroupRead))
return true;
return false;
}
答案 1 :(得分:0)
也许您想读取/etc/passwd
文件以获取用户目录?
一旦有了,就可以在文件夹中获取所有子目录:
List<string> AllFiles = new List<string>();
void ParsePath(string path)
{
string[] SubDirs = Directory.GetDirectories(path);
AllFiles.AddRange(SubDirs);
AllFiles.AddRange(Directory.GetFiles(path));
foreach (string subdir in SubDirs)
ParsePath(subdir);
}