2017-04-13 41 views
1

私は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()"という関数呼び出しで使うことができますか? 私の最終的な目的は、管理者に本サービスを許可することです。

+0

私はピンボケ地にまったく行く必要はないと思っていたでしょう。必要なセキュリティ機能がマネージコードライブラリにまだ存在していないことを確認してください。例えばhttps://msdn.microsoft.com/en-us/library/system.security.accesscontrol(v=vs.110).aspx – Neil

+2

ServiceBase.ServiceHandleは、SafeHandleではなくPlain IntPtrです。それを安全なハンドルにする点はまったくありませんでした。サービスは常にハンドルを持ち、サービスが終了するまで有効です。そして、安全である必要があるクリーンアップはありません。それはただ存在しているに過ぎません。単にpinvoke宣言を修正し、最初の引数をIntPtrにしてください。 –

+0

@ Neeil:これらのクラスは使用できますが、多少の努力が必要です。特に、 'ServiceSecurity'や' ServiceAccessRule'クラスは用意されていません。これらは、合計で約50行のコード(主に定型文)です。プラスの面では、セキュリティ記述子や管理されていない呼び出しについて心配する必要がないことを意味します。 –

答えて

0

ここで説明したようにSafeHandle.SetHandle(IntPtr handle)を試したことがありますか?https://msdn.microsoft.com/de-de/library/system.runtime.interopservices.safehandle.sethandle(v=vs.110).aspxこれが機能するかどうかを確認してください。

編集:私は正しさのためにこれをテストしていないので、これは道あなたに動作するかどうかはわからないが、

public class SafeHandleExtended : SafeHandle 
{ 
    public void SetHandleExtended(IntPtr handle) 
    { 
     this.SetHandle(handle); 
    } 

    // .. SafeHandle's abstract methods etc. that you need to implement 
} 

SafeHandle.SetHandle(IntPtr handle)ので保護された方法であり、あなたがこのような派生クラスを作成することができますそれが欲しい。

+0

私はこのようなSafeHandleのインスタンスからSetHandle()メソッドにアクセスすることはできません: "SafeHandle sHandle; sHandle.SetHandle();"または直接 "SafeHandle.SetHandle();"を使用して – Arnoj

+0

@Arnojああ、申し訳ありませんが、私はそれが 'protected'メソッドであることを見たので、あなたはそれを使うことができません。私は今、選択肢を探しています。 –

+0

@Arnojが私の答えを編集しました。おそらく今あなたのために働いています –

関連する問題