提问人:Bigjim 提问时间:11/18/2023 更新时间:11/18/2023 访问量:37
在 Linux 上的 c# 中设置主组
Setting primary group in c# on Linux
问:
在 Linux 中,我以 bj:bj 身份以非 root 用户:group 的身份登录。
bj@pc-bj:~$ id
uid=1000(bj) gid=1000(bj) groups=1000(bj),5(tty),20(dialout),24(cdrom),25(floppy),29(audio),1006(internetallowed)
我想暂时将我的主要组更改为我所属的另一个组“internetallowed”。在 bash 中,我可以通过 newgrp 命令成功执行此操作:
bj@pc-bj:~$ newgrp internetallowed
bj@pc-bj:~$ id
uid=1000(bj) gid=1006(internetallowed) groups=1006(internetallowed),5(tty),20(dialout),24(cdrom),25(floppy),29(audio),1000(bj)
现在我也想在 C# / DotNet 7.0 中执行此操作。我发现newgrp使用libc中的setgid()函数。所以我试了一下:
public static class LinuxAPI
{
[DllImport ("libc", SetLastError = true)]
public static extern int setgid (UInt32 gid);
public static int GetLastError()
{
return Marshal.GetLastSystemError();
}
}
static void Main(string[] args)
{
var result = LinuxAPI.setgid(1006); // returns -1 (error)
var error = LinuxAPI.GetLastError(); // returns 1 (Operation not permitted)
}
setgid() 失败,错误 1(不允许操作)。 我做错了什么?
答:
0赞
Charles Henington
11/18/2023
#1
尝试将
public static int GetLastError()
{
return Marshal.GetLastSystemError();
}
跟
public static int GetLastError()
{
return Marshal.GetLastWin32Error();
}
评论
0赞
Bigjim
11/18/2023
在 Linux 系统上,应根据 .net 手册使用 GetLastSystemError()。即使我使用 GetLastWin32Error,这也不会修复错误。
0赞
Charles Henington
11/18/2023
您使用的是哪个版本的 .net Framework?
0赞
Bigjim
11/18/2023
使用 .NET 7.0.403
0赞
Charles Henington
11/18/2023
stackoverflow.com/questions/70479269/......看看这是否有帮助
0赞
Bigjim
11/18/2023
我的问题不在于GetLastError。函数 setgid() 失败,因为它返回 -1。GetLastError 只是为了有一个线索。
评论