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

时间:2011-04-03 10:03:17

标签: 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 - 让系统代码为我做。

有可能吗?

感谢。

EDIT1

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

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

1 个答案:

答案 0 :(得分: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);

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