在 Linux 上的 c# 中设置主组

Setting primary group in c# on Linux

提问人:Bigjim 提问时间:11/18/2023 更新时间:11/18/2023 访问量:37

问:

在 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(不允许操作)。 我做错了什么?

C# Linux .NET 核心 libc

评论


答:

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 只是为了有一个线索。