Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在.NET中启用SeCreateGlobalPrivilege而不诉诸P/Invoke或反射?_C#_Security_Privileges - Fatal编程技术网

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

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操作

当服务器运行非提升模式时,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代码可以从中派生并调用此方法


因此,使用类型安全的.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类型,它是公共的。