当服务器运行非提升权限时,我的 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 代码(即无反射)似乎是可行的。
如果你不想自己使用 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);
然后,您必须以管理员身份运行此代码。
我不确定它真的更好,因为它或多或少是一个黑客,不支持等,但是好吧,这对于懒人来说很容易:-)