如何在不借助P / Invoke或反射的情况下在.NET中启用SeCreateGlobalPrivilege?

mar*_*ark 4 c# security privileges

服务器非提升运行时,我的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代码似乎是可行的(即无反射)。

Sim*_*ier 5

如果您不想自己使用P / Invoke,则仍然可以System.Security.AccessControl.Privilege使用反射机制来使用内部类,如下所示:

    // => privilege = new Privilege("SeCreateGlobalPrivilege");
    Type privilegeType = Type.GetType("System.Security.AccessControl.Privilege");
    object privilege = Activator.CreateInstance(privilegeType, "SeCreateGlobalPrivilege");

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

    // =>  privilege.Revert();
    privilegeType.GetMethod("Revert").Invoke(privilege, null);
Run Code Online (Sandbox Code Playgroud)

我不确定它是否真的更好,因为它或多或少是一种hack,不受支持等。但是,好的,对于懒惰的人来说很容易:-)