C# 如何在.NET中启用SeCreateGlobalPrivilege而不诉诸P/Invoke或反射?
当服务器运行非提升模式时,My net.pipe WCF绑定不起作用。这个博客帮我找到了答案- 因此,我向相关的非管理员用户添加了SeCreateGlobalPrivilege权限,但现在我必须在.NET中以编程方式启用该权限 现在,互联网上有几个例子说明了如何在.NET中实现这一点,但它们基本上都是用p/Invoke将普通的C代码重写为C 我希望知道如何使用专用的.NET系统类型(如ObjectSecurity、Privilege等)来实现这一点,这样我的代码就不会执行任何p/Invoke操作——让系统代码来为我实现 可能吗 谢谢 EDIT1 是什么让我认为这是可能的?我使用Reflector在.NET中搜索了AdjustTokenP/Inovke API的用法,发现有ObjectSecurity.Persist方法,它最终调用了这个P/Invoke。接下来,这个ObjectSecurity有一个受保护的构造函数,这意味着非MS代码可以从中派生并调用此方法C# 如何在.NET中启用SeCreateGlobalPrivilege而不诉诸P/Invoke或反射?,c#,security,privileges,C#,Security,Privileges,当服务器运行非提升模式时,My net.pipe WCF绑定不起作用。这个博客帮我找到了答案- 因此,我向相关的非管理员用户添加了SeCreateGlobalPrivilege权限,但现在我必须在.NET中以编程方式启用该权限 现在,互联网上有几个例子说明了如何在.NET中实现这一点,但它们基本上都是用p/Invoke将普通的C代码重写为C 我希望知道如何使用专用的.NET系统类型(如ObjectSecurity、Privilege等)来实现这一点,这样我的代码就不会执行任何p/Invoke操作
因此,使用类型安全的.NET代码(即无反射)似乎是可行的。如果您不想自己使用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);
我不确定它是否真的更好,因为它或多或少是一种黑客行为,不受支持,等等,但好吧,这对懒惰的人来说很容易:-)pinvoke是实现这一点所必需的。我问题的EDIT1还意味着我相信在.NET中有一个完全受支持的类型安全解决方案。至少这是我的目标。我和其他人一样喜欢使用反射-我不喜欢。我编辑了问题标题以表明反射是不需要的-这是我从一开始的意思,但从未明确表示过的。@标记-这个类是完全功能的,但标记为内部意味着在其他地方没有公共内容的99%可能性。你基本上有你的答案,答案是否定的。但我认为这是最好的,因为它实际上写得很好(处理线程jazz),你很难做到最好。我不是建议直接使用特权类型,而是ObjectSecurity类型,它是公共的。