微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Mono中运行的C#应用​​程序中更改当前的Linux用户?

我正在为Linux系统开发一个库(CLI程序集)。 我想为库的用户提供一种切换当前有效的用户和组的方法。 主要原因是提供访问控制(某些用户只允许某些操作),其次是以特定的用户修改文件系统。

我已经确定了两种可能的方法

1.以root用户身份启动Mono,并调用像seteuid等libc例程

通过设置/ usr / bin / mono的位来实现这一点,然后从我的库中(即在Mono运行时启动之后)设置有效的用户,会在Mono终止时导致崩溃:

使用单声道在Linux中获取MAC地址

NAnt和双平台构build – 在Windows和Mono / Linux上构build的最佳方式

以root身份运行时以用户身份启动外部进程

Process.Start()创build的进程在父应用程序closures时终止

这是Linux Mono应用程序中的内存泄漏吗?

ERROR:handles.c:1940:_wapi_handle_update_refs: assertion Failed: (thr_ret == 0) Native stacktrace: mono2 [0x8bb6c] /lib/libc.so.6(__default_rt_sa_restorer_v2+0) [0x4020a5a0] /lib/libc.so.6(gsignal+0x40) [0x4020920c]

从逻辑上讲,我知道在更换Mono的有效用户方面可能存在问题,因为它正在pipe理大量资源,并且可能会导致问题发生。

2.在本地守护进程中处理身份validation,不要更改单声道有效用户

我不确定是否有任何现成的解决scheme,但在概念上,我想有一个守护进程作为根运行,库将通信(例如通过POSIX消息队列)来执行身份validation。 守护程序以root用户身份运行,以便能够读取/ etc / shadow。 Mono的有效用户不会改变,但是我的图书馆会跟踪哪个“等效用户”进程正在运行。 不幸的是,这种方法不允许库作为不同的用户访问文件系统。

我坚持第二个选项,还是有一些方法来真正改变一个单声道进程的有效用户

谢谢!

使用Mono 4.3.3在Debian / Jessie上构buildMonoDevelop

在CentOS 5.x / 6.x上安装Mono和Monodevelop

单声道有没有关于ASP.NET的真正的限制?

将Mono应用程序部署到Windows

单声道+ Linux + sqlite->坏习惯 – >导致无法打开数据库文件

以下作品在我的盒子:)

编辑#1:这应该作为根执行。 (片段取自: http : //msdn.microsoft.com/en-us/library/w070t6ka.aspx )

using System; using System.Security.Permissions; using System.Security.Principal; public class ImpersonationDemo { // Test harness. // If you incorporate this code into a DLL,be sure to demand FullTrust. [PermissionSetAttribute(SecurityAction.Demand,Name = "FullTrust")] public static void Main (string[] args) { try { // Check the identity. Console.WriteLine ("Before impersonation: " + WindowsIdentity.GetCurrent ().Name); // Impersonate a user using (WindowsIdentity newId = new WindowsIdentity("Your user name")) using (WindowsImpersonationContext impersonatedUser = newId.Impersonate()) { // Check the identity. Console.WriteLine ("After impersonation: " + WindowsIdentity.GetCurrent ().Name); } // Releasing the context object stops the impersonation // Check the identity. Console.WriteLine ("After closing the context: " + WindowsIdentity.GetCurrent ().Name); } catch (Exception ex) { Console.WriteLine ("Exception occurred. " + ex.Message); } } }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐