如何在.NET中启用SeCreateGlobalPrivilege而不诉诸P/Invoke或反射?

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

当服务器运行非提升权限时,我的 net.pipe WCF 绑定不起作用。这个博客帮助我找到了答案 - http://weblogs.thinktecture.com/cweyer/2007/12/dealing-with-os-privilege-issues-in-wcf-named-pipes-scenarios.html

因此,我向相关非管理员用户添加了 SeCreateGlobalPrivilege 权限,但现在我必须在 .NET 中以编程方式启用该权限

现在,互联网上有几个如何在 .NET 中执行此操作的示例,但它们本质上都是使用 P/Invoke 将纯 C 代码重写为 C#。

我希望知道如何使用专用的 .NET 系统类型(例如 ObjectSecurity、Privilege 等)来完成此操作,以便我的代码不执行任何 P/Invoke - 让系统代码为我执行此操作。

可以吗?

谢谢。

编辑1

是什么让我认为这是可能的?好吧,我使用 Reflector 在 .NET 中搜索了 AdjustTokenPrivileges P/Inovke API 的用法,发现有一个 ObjectSecurity.Persist 方法,它最终调用了这个 P/Invoke。接下来,此 ObjectSecurity 有一个受保护的构造函数,这意味着非 MS 代码可以从它派生并调用此方法。

因此,使用类型安全的 .NET 代码(即无反射)似乎是可行的。

c# security privileges
1个回答
7
投票

如果你不想自己使用 P/Invoke,你仍然可以使用内部

System.Security.AccessControl.Privilege
类,使用 Reflection 机制,如下所示:

    // => privilege = new Privilege("SeCreateGlobalPrivilege");
    // this is for .NET Framework
    var privilegeType = Type.GetType("System.Security.AccessControl.Privilege");

    // this for .NET Core and above (you need to add the "System.Security.AccessControl" nuget package)
    var privilegeType = Type.GetType("System.Security.AccessControl.Privilege, System.Security.AccessControl");

    var privilege = Activator.CreateInstance(privilegeType, "SeCreateGlobalPrivilege");

    // => privilege.Enable();
    privilegeType.GetMethod("Enable").Invoke(privilege, null);

    // =>  privilege.Revert();
    privilegeType.GetMethod("Revert").Invoke(privilege, null);

然后,您必须以管理员身份运行此代码。

我不确定它真的更好,因为它或多或少是一个黑客,不支持等,但是好吧,这对于懒人来说很容易:-)

© www.soinside.com 2019 - 2024. All rights reserved.