私はC#のWindowsサービスのクラスを持っている:IntPtrをSafeHandleに変換するには?
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 ...
}
}
"System.Runtime.InteropServices.SafeHandle" に(this.ServiceHandleのような)のIntPtrを変換する方法は?私はそれを "SetServiceObjectSecurity()"という関数呼び出しで使うことができますか? 私の最終的な目的は、管理者に本サービスを許可することです。
私はピンボケ地にまったく行く必要はないと思っていたでしょう。必要なセキュリティ機能がマネージコードライブラリにまだ存在していないことを確認してください。例えばhttps://msdn.microsoft.com/en-us/library/system.security.accesscontrol(v=vs.110).aspx – Neil
ServiceBase.ServiceHandleは、SafeHandleではなくPlain IntPtrです。それを安全なハンドルにする点はまったくありませんでした。サービスは常にハンドルを持ち、サービスが終了するまで有効です。そして、安全である必要があるクリーンアップはありません。それはただ存在しているに過ぎません。単にpinvoke宣言を修正し、最初の引数をIntPtrにしてください。 –
@ Neeil:これらのクラスは使用できますが、多少の努力が必要です。特に、 'ServiceSecurity'や' ServiceAccessRule'クラスは用意されていません。これらは、合計で約50行のコード(主に定型文)です。プラスの面では、セキュリティ記述子や管理されていない呼び出しについて心配する必要がないことを意味します。 –