【发布时间】:2017-09-09 09:04:19
【问题描述】:
我有 C# Windows 服务类:
class MyService : ServiceBase
{
private void InitializeComponent() {
//some other code ...
SafeHandle sHandle = this.ServiceHandle; // I want to do this but this fails.
SetServiceObjectSecurity(sHandle, secInfo, binaryDescriptor);
//some more code ...
}
}
如何将 IntPtr(如 this.ServiceHandle)转换为“System.Runtime.InteropServices.SafeHandle”?以便我可以在函数调用“SetServiceObjectSecurity()”中使用它? 我的最终目标是授予该服务的管理员权限。
【问题讨论】:
-
我原以为你根本不需要进入 pinvoke-land。您确定您需要的安全功能不在某些托管代码库中吗?例如msdn.microsoft.com/en-us/library/…
-
ServiceBase.ServiceHandle 是一个普通的 IntPtr,而不是 SafeHandle。让它成为一个安全句柄没有任何意义,服务总是有一个句柄,并且在服务终止之前它一直有效。并且没有需要安全的清理,它只是眨眼就消失了。只需修复您的 pinvoke 声明并将第一个参数也设为 IntPtr。
-
@Neil:这些类是可用的,但确实需要一些努力。特别是,没有开箱即用的
ServiceSecurity或ServiceAccessRule类。这些总共大约有 50 行代码(大部分是样板代码)。从好的方面来说,这意味着您不必乱用安全描述符或非托管调用。
标签: c# interop interopservices